集群规划
在Elasticsearch集群规划中,如何规划集群,合理的规划集群可以防止Elasticsearch出现脑裂,
为避免Elasticsearch集群出现脑裂,Elasticsearch的的config目录下elasticsearch.yml文件中配置避免脑裂的参数,常见的参数是discovery.zen.minimum_master_nodes
,该参数决定主节点选择工程中至少需要有多少个master节点,默认配置1。基本的参数原则是N/2+1,如在一个3个节点的集群中,discovery.zen.minimum_master_nodes
应该设置为2。
如果在2个集群节点中,如果吧discovery.zen.minimum_master_nodes
设置为2,当两个节点通信失败时,节点1会失去它的主状态,同时节点2也不会被选举为主节点。这种情况下可以配置另外一个参数来防止脑裂,discovery.zen.ping.timeout
,默认值时3秒,用该参数来决定节点之间通信的等待时间。如在网络较差的环境里面可以调大该值。但该参数是适用于高网络延迟的情况。建议配置至少3节点的集群。
分布式集群
Elasticsearch集群中的节点一般分为3中角色,如何区别这种角色,取决于在搭建分布式集群以前需要在配置文件中指定节点角色。
节点简介
- master 节点: master节点主要负责元数据的处理;比如索引的新增、删除、分片分配等,每当元数据有更新时,master节点负责同步到其他节点上。
- data 节点: data节点上保存了数据分片,负责数据相关的操作,如分片的增删改查以及搜索和整个操作。
- client 节点: client节点起到路由请求作用,可以看作为负载均衡,适用于高并发访问的业务场景。
列子
3台Elasticsearch服务器(172.21.1.10,172.21.1.11,172.21.1.12),为避免脑裂,3台机器master节点为2(172.21.1.10,172.21.1.11),同时也为data节点。172.21.1.12为client节点,三个ip对应hostname为:node-10,node-11,node-12。
- 172.21.1.10 节点
1
2
3
4
5
6
7
8
9
10
11
12cluster.name: test1
node.name: node-10
network.host: 0.0.0.0
http.port: 9200
node.master: true
node.data: true
discovery.zen.minimum_master_nodes: 2
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
discovery.zen.ping.unicast.hosts: ["172.21.1.10", "172.21.1.11"]
http.cors.enable: true
http:cors.allow-origin: "*"
注释:
- http.cors.enable: true,http:cors.allow-origin: “*”: 该两个参数为如果要使用head来进行监控Elasticsearch集群,需要配置此参数。elasticsearch-head
172.21.1.11 节点
1
2
3
4
5
6
7
8
9
10
11
12cluster.name: test1
node.name: node-11
network.host: 0.0.0.0
http.port: 9200
node.master: true
node.data: true
discovery.zen.minimum_master_nodes: 2
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
discovery.zen.ping.unicast.hosts: ["172.21.1.10", "172.21.1.11"]
http.cors.enable: true
http:cors.allow-origin: "*"172.21.1.12 节点
1
2
3
4
5
6
7
8
9
10
11
12cluster.name: test1
node.name: node-12
network.host: 0.0.0.0
http.port: 9200
node.master: false
node.data: talse
discovery.zen.minimum_master_nodes: 2
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
discovery.zen.ping.unicast.hosts: ["172.21.1.10", "172.21.1.11"]
http.cors.enable: true
http:cors.allow-origin: "*"
启动各节点进行head验证
Elasticsearch集群监控查看elasticserch日常维护,监控插件可以参考logstash监控末尾。
Elasticsearch集群api
利用Elasticsearch 集群健康api查看当前集群的健康信息
1 | curl http: //127.0.0.1:9200/_cluster/health |
参数解释
- cluster_name: 集群名称
- status: 集群健康状态;green为所有的主分片和从分片都可以用,yellow所有主分片可用,但存在不可用的从分片,red存在不可用的主分片
- timed_out: 是否超时
- number_of_nodes: 节点数,包括master和data。
- number_of_data_nodes: data节点数
- active_primary_shards: 活动的主分片
- active_shards: 所有活动分片数,包括主分片和副本
- relocating_shards: 正在发生迁移的分片
- initializing_shards: 正在初始化的分片
- unassigned_shards: 没有被分配的分片
- delayed_unassigned_shards: 延迟未被分配的分片
- number_of_pending_tasks: master节点任务队列中的任务数
- number_of_in_flight_fetch: 正在进行迁移的分片数
- task_max_waiting_in_queue_millis: 队列中任务的最大等待时间
- active_shards_percent_as_number: 活动分片的百分比
Elasticsearch容量评估
存储容量评估
Elasticsearch服务存储空间大小影响因素如下:
- 副本数量:副本有利于增加数据的可靠性,但同时会增加存储成本。默认和建议的副本数量为 1。
- 索引开销:除原始数据外,ES 需要存储索引等数据,一般情况下数据膨胀为10% (_all等未计算)。
- 内部任务开销:ES 自身会占用约 20% 的磁盘空间用于段合并、日志等,因此要预留20%的此部分空间。
- 操作系统预留:操作系统也会占用5%的磁盘空间,用于关键流程处理、防止磁盘碎片化问题等。
- 安全阈值。通常至少预留15%的安全阈值。
ES的实际空间可通过下面公式估算:
1 | 实际空间 = 源数据 * (1 + 副本数量) * (1 + 索引开销) / (1-操作系统预留)/(1 - 内部任务开销) |
- 对于_all这项参数,如果不需要在业务上使用,通常建议您禁止或者有选择性地添加。
- 如果您需要开启_all参数的索引,磁盘容量的开销也会随之增大。建议在上述评估的基础上,增加空间至原来的1.5倍。
1
2 磁盘总大小 = 源数据 * (1 + 副本数) * 1.7 * (1 + 0.5)
= 源数据 * 5.1
为了保证服务能稳定运行,建议在上述评估的基础上至少预留50%的存储空间,因此建议申请的存储容量为:
1 | 存储容量 = 源数据 * (1 + 副本数量) * 1.45 * (1 + 0.5) |
服务配置评估
- 建议您至少选择 3 个节点,保证集群具有较高的节点故障容错能力。
- 如有非常大的存储容量需求,建议主机配置规格更高,有助于提升集群性能和稳定性。
- 可以通过观察 CPU 使用率、集群查询QPS、集群写入QPS等监控指标,判断配置是否足够
分片数量评估
shard大小和数量是影响ES集群稳定性和性能的重要因素之一。ES集群中任何一个索引都需要有一个合理的shard规划(默认为5个)。索引分片的数量会影响集群稳定性和性能,且通常确定后无法轻松更改,需要提前规划:
- 建议单个分片大小在小规格节点下不超过30GB,在高规格节点下不超过50GB。分片过大会导致ES故障的恢复速度慢,分片过小会导致内存不足等问题。
- 分片数量要尽量匹配节点数,分片数可以等于节点数,也可以是节点数的整数倍,方便分片在所有数据节点均匀分布。
- 对于日志分析或者超大索引场景,建议单个shard大小不要超过100GB。
- 单个节点上同一索引的shard个数不要超5个。
利用ansible来安装Elasticsearch集群,