美文网首页
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