Elasticsearch脑裂问题分析

本文介绍了 elasticsearch 脑裂问题分析及解决方法

elasticsearch脑裂现象

elasticsearch脑裂现象直白的表述就是一个大的es集群分裂成了多个小的集群。

比如有 a b c d 四个es节点,a b c d 之间选取一个master,比如master是a。若某时刻 c d 访问不到a ,b能访问到a。c d之间会重新选举一个master。这样整个a b c d的es集群就会分裂为a b 和 b c 两个集群。

正常情况下,当主节点无法工作时,会从备选主节点中选举一个出来变成新主节点,原主节点回归后变成备选主节点。但有时因为网络抖动等原因,主节点没能及时响应,集群误以为主节点下线了,选举了一个新主节点,此时一个Elasticsearch集群中有了两个主节点,其他节点不知道该听谁的调度,这时就发生了"脑裂"现象,通俗点就是“精神分裂”。

elasticsearch 脑裂产生原因

(1)网络抖动。
由于是内网通信、网络通信等问题造成部分节点认为master node挂掉, 然后另选master node的情况可能性较小;可以通过检查Ganglia集群监控,没有发现异常的内网流量, 故此原因可以排除。而外网的网络出现问题的可能性更大,更有可能造成“脑裂”现象。

(2)节点负载。
如果主节点同时承担数据节点的工作,可能会因为工作负载大而导致对应的Elasticsearch实例停止响应。此外,由于数据节点上的Elasticsearch进程占用的内存较大, 较大规模的内存回收操作(GC)也能造成Elasticsearch进程失去响应。所以,该原因出现“脑裂”现象的可能性更大。

(3)内存回收。
由于数据节点上的Elasticsearch进程占用的内存较大,较大规模的内存回收操作也能造成Elasticsearch进程失去响应。

脑裂问题处理办法

主节点配置

node.master: true 
node.data: false

超时参数配置
将节点响应超时 discovery.zen.ping_timeout 稍稍设置长一些(默认是3秒)。默认情况下, 一个节点会认为, 如果master节点在 3 秒之内没有应答, 那么这个节点就是挂掉了, 而增加这个值, 会增加节点等待响应的时间, 从一定程度上会减少误判。

discovery.zen.ping_timeout=5

主节点个数配置

discovery.zen.minimum_master_nodes 的默认值是1,该参数表示, 一个节点需要看到的具有master节点资格的最小数量, 然后才能在集群中做操作,即重新选举主节点。官方的推荐值是 (N/2)+1 ,其中 N 是具有 master资格的节点的数量,即只有超过 (N/2)+1 个主节点同意,才能重新选举主节点。

注意:elasticsearch很难彻底解决,官网在努力开发一种新的选主算法实现,脑裂问题还是一个潜在的风险点。

上一篇


推荐文章

评论
说点什么吧?

发表评论

取消回复
  最新文章