最近ES由于数据访问量的提高,以及索引数的增加,经常会出现Unassigned Shards数量大于0,导致集群状态变成red,有大量的坏片出现,分析后发现应该是出现脑裂现象,估计是集群中对于master出现分歧,导致多个master出现,从而把健康的分片标识为red。

因此,决定对es配置进行一版优化~

脑裂问题出现的原因可能有以下几点:
1.网络问题:服务器的网络不稳定,导致有节点链接master超时或者没响应,重新选举新的master,并且对原来的master上的索引标识为red。

解决办法:
加长响应时间:discovery.zen.ping_timeout 节点状态的响应时间,默认是3秒,可以调大,如果master在该响应时间的范围内没有做出响应,就判断master挂了,遇到网络波动的话,响应时间短容易会出现误判。

2.主节点负载过高:一般我们配置主节点既为master,又为data,达到资源最大利用化,访问量大的时候可能会导致停止响应造成延迟响应,此时其他节点得不到主节点的响应,就会认为主节点挂了,会重新选举主节点。

解决办法:
配置选举触发候选人:iscovery.zen.minimum_master_nodes 该参数是用于控制选举行为的发生的最小集群节点数量,配置一般算法是master候选节点数量/2+1,3个节点quorum=2,例如当某个节点网络波动暂时连接不上集群,会尝试发起选举,但不满足quorum,无法选举,等网络恢复正常,回归集群正常工作,这就防止了脑裂情况出现。

3.GM回收频繁:data节点上的ES进程占用的内存较大,引起频繁大规模GC,造成ES进程失去响应。

解决办法:
目前集群master是既当master又当data节点,配置角色分离,master不充当主节点,可以减少出现脑裂的几率
主节点配置 node.master:true、node.data:false
从节点配置 node.master:false、node.data:true
从实际出发,考虑到资源有限,暂不考虑次方案。

本次优化采取方案1和方案2
做出如下配置修改:
#集群中自动发现其他节点时ping连接超时时间
discovery.zen.ping_timeout: 60s
#控制选举行为的最小集群节点数
discovery.zen.minimum_master_nodes: 2

另外,对性能做出一些优化,为了加快集群处理数据和JVM方面的调优工作
做出如下配置修改:
#锁定物理内存地址,避免es内存使用swap交换分区,频繁交换会导致io变高
bootstrap.memory_lock: false

#搜索字段的最大缓存
indices.fielddata.cache.size: 20%

#调小查使用的cache,避免cache占用过多内存
indices.queries.cache.size: 10%

#默认10%,增大数值可降低refresh的频率
indices.memory.index_buffer_size: 20%

后续有继续优化再更新~