文档章节

elaselasticsearch集群脑裂

 张欢19933
发布于 2017/08/16 10:50
字数 1189
阅读 39
收藏 0

集群脑裂是什么?

  所谓脑裂问题(类似于精神分裂),就是同一个集群中的不同节点,对于集群的状态有了不一样的理解。

   由于某些节点的失效,部分节点的网络连接会断开,并形成一个与原集群一样名字的集群,这种情况成为集群脑裂(split-brain)现象。这个问题非常危险,因为两个新形成的集群会同时索引和修改集群的数据。

今天,Elasticsearch集群出现了查询极端缓慢的情况,通过以下命令查看集群状态

  curl -XGET 'http://master:9200/_cluster/health'

    或者

  curl -XGET 'http://localhost:9200/_cluster/health'

  发现,集群的总体状态是red,本来9个节点的集群,在结果中只显示了4个;但是,将请求发向不同的节点之后,我却发现即使是总体状态是red的,但是可用的节点数量却不一致。

  正常情况下,集群中的所有的节点,应该对集群中master的选择是一致的,这样获得的状态信息也应该是一致的,不一致的状态信息,说明不同的节点对master节点的选择出现了异常——也就是所谓的脑裂问题。这样的脑裂状态直接让节点失去了集群的正确状态,导致集群不能正常工作。

ES集群脑裂可能导致的原因:
  1. 网络: 由于是内网通信, 网络通信问题造成某些节点认为 master 死掉, 而另选 master的可能性较小; 进而检查 Ganglia 集群监控, 也没有发现异常的内网流量, 故此原因可以排除。

   内网一般不会出现es集群的脑裂问题,可以监控内网流量状态。外网的网络出现问题的可能性大些。

  2. 节点负载: 由于 master 节点与 data 节点都是混合在一起的, 所以当工作节点的负载较大( 确实也较大) 时, 导致对应的 ES 实例停止响应, 而这台服务器如果正充当着 master节点的身份, 那么一部分节点就会认为这个 master 节点失效了, 故重新选举新的节点, 这时就出现了脑裂; 同时由于 data 节点上 ES 进程占用的内存较大, 较大规模的内存回收操作也能造成 ES 进程失去响应。 所以, 这个原因的可能性应该是最大的。

   3、回收内存

  由于data节点上es进程占用的内存较大,较大规模的内存回收操作也能造成es进程失去响应。

ES集群脑裂应对问题的办法:
  1、对应于上面的分析, 推测出原因应该是由于节点负载导致了 master 进程停止响应, 继而导致了部分节点对于 master 的选择出现了分歧。 为此, 一个直观的解决方案便是将 master节点与 data 节点分离。 为此, 我们添加了三台服务器进入 ES 集群, 不过它们的角色只是master 节点, 不担任存储和搜索的角色, 故它们是相对轻量级的进程。 可以通过以下配置来限制其角色:

  node.master: true
  node.data: false
  当然, 其它的节点就不能再担任 master 了, 把上面的配置反过来即可。 这样就做到了将 master 节点与 data 节点分离。当然,为了使新加入的节点快速确定master位置,可以将data节点的默认的master发现方式有multicast修改为unicast:

  discovery.zen.ping.multicast.enabled: false  

  discovery.zen.ping.unicast.hosts: ["master1", "master2", "master3"]  

  还有两个直观的参数可以减缓脑裂问题的出现:
  2、discovery.zen.ping_timeout( 默认值是 3 秒) : 默认情况下, 一个节点会认为, 如果 master节点在 3 秒之内没有应答, 那么这个节点就是死掉了, 而增加这个值, 会增加节点等待响应的时间, 从一定程度上会减少误判。

  3、discovery.zen.minimum_master_nodes( 默认是 1) : 这个参数控制的是, 一个节点需要看到的具有 master 节点资格的最小数量, 然后才能在集群中做操作。 官方的推荐值是(N/2)+1, 其中 N 是具有 master 资格的节点的数量( 我们的情况是 3, 因此这个参数设置为2, 但对于只有 2 个节点的情况, 设置为 2 就有些问题了, 一个节点 DOWN 掉后, 你肯定连不上 2 台服务器了, 这点需要注意) 。

  以上的解决方法只能是减缓这种现象的发生, 并没有从根本上杜绝。

本文转载自:http://www.cnblogs.com/zlslch/p/6477312.html

共有 人打赏支持
粉丝 35
博文 481
码字总数 230666
作品 0
海淀
私信 提问
EMQ 2.3-beta.1 发布, 百万级 MQTT 消息服务器

EMQ R2.3-beta.1版本发布!该版本正式支持集群节点自动发现与集群脑裂自动愈合,支持基于IP Multicast、Etcd、Kubernetes等多种策略自动构建集群。 节点发现与自动集群 EMQ R2.3 版本支持多种...

emqtt
2017/07/25
1K
4
elasticsearch脑裂问题

所谓脑裂问题(类似于精神分裂),就是同一个集群中的不同节点,对于集群的状态有了不一样的理解。 正常情况下,集群中的所有的节点,应该对集群中master的选择是一致的,这样获得的状态信息...

枫林飘影
04/03
0
0
split-brain 脑裂问题(Keepalived)

脑裂(split-brain) 指在一个高可用(HA)系统中,当联系着的两个节点断开联系时,本来为一个整体的系统,分裂为两个独立节点,这时两个节点开始争抢共享资源,结果会导致系统混乱,数据损坏...

吞吞吐吐的
2017/09/15
0
0
mysql galera cluster集群的分裂与仲裁机制

集群的分裂 当集群由于网络原因分裂为几个单独的组时(一组可能是单节点,也可能是几个互联的节点),数据出现不一致,此时可能产生脑裂及数据不一致。这种情况下,只有一组节点能够继续提供...

bupt晶
2015/12/21
1K
0
Elasticsearch部分节点不能发现集群(脑裂)问题处理

什么是脑裂? 让我们看一个有两个节点的elasticsearch集群的简单情况。集群维护一个单个索引并有一个分片和一个复制节点。节点1在启动时被选举为主节点并保存主分片(在下面的schema里标记为...

键走偏锋
2017/09/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring源码学习笔记-1-Resource

打算补下基础,学习下Spring源码,参考书籍是《Spring源码深度解析》,使用版本是Spring 3.2.x,本来想试图用脑图记录的,发现代码部分不好贴,还是作罢,这里只大略记录下想法,不写太细了 ...

zypy333
今天
10
0
RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
今天
16
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
10
0
java框架学习日志-6(bean作用域和自动装配)

本章补充bean的作用域和自动装配 bean作用域 之前提到可以用scope来设置单例模式 <bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean> 除此之外还有几种用法 singleton:......

白话
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部