先上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 使得配置生效
网友评论