脑裂问题
什么是脑裂?就是同一集群中的不同节点对于集群状态有了不一样的理解,比如elasticsearch集群中有节点A(主节点),节点B(从节点),若由于网络问题两个节点之间的通信中断了,此时两个节点都认为对方已经挂了,节点A不进行任何操作,因为节点A本身就是主节点;但是节点B会将本身提升为主节点,此时就会导致elasticsearch有了两个主节点,发送到节点A上的索引请求不会将数据分配到节点B,同时发送到节点B的请求也不会将数据分配到节点A。这种情况下导致搜索请求命中哪个节点结果都不会相同
造成脑裂的原因
- 网络问题 集群间的网络延迟导致一些节点访问不到master,认为master挂了从而选举出新的master
- 节点负载 如果一个节点既是master又是data,当访问量过大的时候会造成es假死状态,使得其他节点得不到主节点的响应认为master挂掉了,会重新选举master
为了避免脑裂的发生,elasticsearch提供了一些配置
discovery.zen.minimum_master_nodes
表示决定主节点选择过程中最少需要有多少个master节点参与选举,默认是1,最好配置为N/2+1(N为候选master节点数)discovery.zen.ping.timeout
节点间网络通信的等待时间,默认3s,可以调大超时时间,减少误判