美文网首页
ELK-Elasticsearch 集群

ELK-Elasticsearch 集群

作者: 夜醉梦紅尘 | 来源:发表于2019-11-21 17:24 被阅读0次

    先上docker-compose.yml

    version: "3.2"
    services:
        elasticsearch:
            image: docker.elastic.co/elasticsearch/elasticsearch:7.4.2
            networks: 
              -  "elk-net"
            container_name: elasticsearch
            ports:
                - "9200:9200"
            environment:
                - discovery.zen.minimum_master_nodes=2
                - bootstrap.memory_lock=true
                - node.name=es01
                - cluster.name=es-docker-cluster
                - discovery.seed_hosts=es02,es03
                - cluster.initial_master_nodes=elasticsearch,es02,es03
                - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
            ulimits:
                memlock:
                  soft: -1
                  hard: -1
    
        es02:
            image: docker.elastic.co/elasticsearch/elasticsearch:7.4.2
            networks: 
              -  "elk-net"
            environment:
                - discovery.zen.minimum_master_nodes=2
                - bootstrap.memory_lock=true
                - node.name=es02
                - cluster.name=es-docker-cluster
                - discovery.seed_hosts=elasticsearch,es03
                - cluster.initial_master_nodes=elasticsearch,es02,es03
                - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
            ulimits:
                memlock:
                  soft: -1
                  hard: -1
    
        es03:
            image: docker.elastic.co/elasticsearch/elasticsearch:7.4.2
            networks: 
              -  "elk-net"
            environment:
                - discovery.zen.minimum_master_nodes=2   #master 候选节点的法定个数
                - bootstrap.memory_lock=true                    #锁定内存
               #- bootstrap.mlockall=true
                - node.name=es03                                       #节点名
                - cluster.name=es-docker-cluster                #设置集群名
                - discovery.seed_hosts=elasticsearch,es02    #向其他两个主机连接
                - cluster.initial_master_nodes=elasticsearch,es02,es03    #集群声明主机
                - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
            ulimits:                                                         #解除锁定,软硬都为负,提高性能
                memlock:    
                  soft: -1
                  hard: -1
    
        logstash:
            image: docker.elastic.co/logstash/logstash:7.4.2
            container_name: logstash
            volumes:
              - type: bind
                source: "./logstash/logstash_stdout.conf"
                target: "/usr/share/logstash/pipeline/logstash.conf"
            networks: 
              - "elk-net"
            depends_on:
              - "elasticsearch"
    
        filebeat:
            image: docker.elastic.co/beats/filebeat:7.4.2
            volumes:
              - type: bind
                source: "./filebeat/2018.log"
                target: "/2018.log"
              - type: bind
                source: "./filebeat/filebeat.yml"
                target: "/usr/share/filebeat/filebeat.yml"
            networks: 
              - "elk-net"
            depends_on:
              -  "logstash"
    
    
        kibana:
            image: docker.elastic.co/kibana/kibana:7.4.2
            ports:
               -  "5601:5601"
            networks: 
               - "elk-net"
            depends_on:
              - "elasticsearch"
    
    networks: 
       elk-net:
    
    
    成功示例

    可在elasticsearch机器里的
    /usr/share/elasticsearch/config/elasticsearch.yml 设置集群名,节点名

    cluster.name: "docker-cluster"
    network.host: 0.0.0.0
    node.name: elasticsearch_005_data
    
    

    设置最新主节点数

    minimum_master_nodes 设定对你的集群的稳定 极其 重要。

    当你的集群中有两个 masters(注:主节点)的时候,这个配置有助于防止 脑裂 。

    如果你的集群发生了脑裂,那么你的集群就会处在丢失数据的危险中,因为主节点被认为是这个集群的最高统治者,它决定了什么时候新的索引可以创建,分片是如何移动的等等。如果你有 两个 masters 节点, 你的数据的完整性将得不到保证,因为你有两个节点认为他们有集群的控制权,就会导致冲突。
    此设置应该始终被配置为 master 候选节点的法定个数(大多数个)。法定个数就是 ( master 候选节点个数 / 2) + 1 。 这里有几个例子:

    1.如果你有 10 个节点(能保存数据,同时能成为 master),法定数就是 6
    2.如果你有 3 个候选 master 节点,和 100 个 data 节点,法定数就是 2 ,你只要数数那些可以做 master 的节点数就可以了。
    3.如果你有两个节点,你遇到难题了。法定数当然是 2 ,但是这意味着如果有一个节点挂掉,你整个集群就不可用了。 设置成 1 可以保证集群的功能,但是就无法保证集群脑裂了,像这样的情况,你最好至少保证有 3 个节点。

    所以为了防止脑裂,集群中master节点的数量必须得到控制
    此设置应该始终被配置为 master 候选节点的法定个数(大多数个)。法定个数就是 ( master 候选节点个数 / 2) + 1
    建议在docker-compose.yml中这样配置:

    discovery.zen.minimum_master_nodes: 2
    
    

    命令行输入

    PUT /_cluster/settings
    {
        "persistent" : {
            "discovery.zen.minimum_master_nodes" : 2
        }
    }
    

    两者结合,使得其不会动态生成其他节点,保持节点一致性

    有时由于集群的数据恢复会造成资源浪费,因此可以限制集群最小的数据恢复个数

    gateway.recover_after_nodes: 8
    #这意味着至少要有 8 个节点(数据节点或者 master 节点)在线,该集群才可用,才进行数据恢复。
    gateway.expected_nodes: 10
    gateway.recover_after_time: 5m
    #等待 5 分钟,或者10 个节点上线后,才进行数据恢复,这取决于哪个条件先达到。
    

    Swapping 是性能的坟墓

    有必要说的更清楚一点:内存交换 到磁盘对服务器性能来说是 致命 的。想想看:一个内存操作必须能够被快速执行。

    如果内存交换到磁盘上,一个 100 微秒的操作可能变成 10 毫秒。 再想想那么多 10 微秒的操作时延累加起来。 不难看出 swapping 对于性能是多么可怕。

    最好的办法就是在你的操作系统中完全禁用 swap。这样可以暂时禁用:

    sudo swapoff -a
    

    如果需要永久禁用,你可能需要修改 /etc/fstab 文件,这要参考你的操作系统相关文档。

    如果你并不打算完全禁用 swap,也可以选择降低 swappiness 的值。 这个值决定操作系统交换内存的频率。 这可以预防正常情况下发生交换,但仍允许操作系统在紧急情况下发生交换。

    对于大部分Linux操作系统,可以在 sysctl 中这样配置:

    vm.swappiness = 1 
    

    swappiness 设置为 1 比设置为 0 要好,因为在一些内核版本 swappiness 设置为 0 会触发系统 OOM-killer(注:Linux 内核的 Out of Memory(OOM)killer 机制)。
    最后,如果上面的方法都不合适,你需要打开配置文件中的 mlockall 开关。 它的作用就是允许 JVM 锁住内存,禁止操作系统交换出去。在你的 elasticsearch.yml 文件中,设置如下:

    bootstrap.mlockall: true
    

    内存控制

    有些电脑跑不了,报ela异常退出,可以尝试以下操作
    vim /etc/sysctl.conf

    vm.max_map_count=2621444
    

    sysctl -p 使得配置生效

    相关文章

      网友评论

          本文标题:ELK-Elasticsearch 集群

          本文链接:https://www.haomeiwen.com/subject/bdptwctx.html