文档章节

Elasticsearch集群所谓脑裂问题

HIVE
 HIVE
发布于 2016/07/05 18:07
字数 1009
阅读 80
收藏 0

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

 

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

curl -XGET 'es-1:9200/_cluster/health'

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

 

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

 

可能导致的原因:

 

1. 网络:由于是内网通信,网络通信问题造成某些节点认为master死掉,而另选master的可能性较小;进而检查Ganglia集群监控,也没有发现异常的内网流量,故此原因可以排除。
2. 节点负载:由于master节点与data节点都是混合在一起的,所以当工作节点的负载较大(确实也较大)时,导致对应的ES实例停止响应,而这台服务器 如果正充当着master节点的身份,那么一部分节点就会认为这个master节点失效了,故重新选举新的节点,这时就出现了脑裂;同时由于data节点 上ES进程占用的内存较大,较大规模的内存回收操作也能造成ES进程失去响应。所以,这个原因的可能性应该是最大的。
 

应对问题的办法:
 

1. 对应于上面的分析,推测出原因应该是由于节点负载导致了master进程停止响应,继而导致了部分节点对于master的选择出现了分歧。为此,一个直观 的解决方案便是将master节点与data节点分离。为此,我们添加了三台服务器进入ES集群,不过它们的角色只是master节点,不担任存储和搜索 的角色,故它们是相对轻量级的进程。可以通过以下配置来限制其角色:
  1. node.master: true  
  2. node.data: false
复制代码
当然,其它的节点就不能再担任master了,把上面的配置反过来即可。这样就做到了将master节点与data节点分离。当然,为了使新加入的节点快速确定master位置,可以将data节点的默认的master发现方式有multicast修改为unicast:
 
  1. discovery.zen.ping.multicast.enabled: false  
  2. discovery.zen.ping.unicast.hosts: ["master1", "master2", "master3"]  
复制代码

2. 还有两个直观的参数可以减缓脑裂问题的出现:
discovery.zen.ping_timeout(默认值是3秒):默认情况下,一个节点会认为,如果master节点在3秒之内没有应答,那么这个节点就是死掉了,而增加这个值,会增加节点等待响应的时间,从一定程度上会减少误判。
discovery.zen.minimum_master_nodes(默认是1):这个参数控制的是,一个节点需要看到的具有master节点资格的 最小数量,然后才能在集群中做操作。官方的推荐值是(N/2)+1,其中N是具有master资格的节点的数量(我们的情况是3,因此这个参数设置为2, 但对于只有2个节点的情况,设置为2就有些问题了,一个节点DOWN掉后,你肯定连不上2台服务器了,这点需要注意)。

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

© 著作权归作者所有

HIVE
粉丝 5
博文 9
码字总数 18467
作品 0
昌平
架构师
私信 提问
加载中

评论(2)

HIVE
HIVE 博主
总结
所以怎么从脑裂中恢复?第一个建议是给所有数据重新索引。第二,如果脑裂发生了,要十分小心的重启你的集群。停掉所有节点并决定哪一个节点第一个启动。 如果需要,单独启动每个节点并分析它保存的数据。如果不是有效的,关掉它,并删除它数据目录的内容(删前先做个备份)。如果你找到了你想要保存数据的节点,启动它并且检查日志确保它被选为主节点。这之后你可以安全的启动你集群里的其他节点了。
HIVE
HIVE 博主
那么集群重启呢?
当脑裂发生后,唯一的修复办法是解决这个问题并重启集群。 这儿有点复杂和可怕。 当elasticsearch集群启动时,会选出一个主节点(一般是启动的第一个节点被选为主)。由于索引的两份拷贝已经不一样了,elasticsearch会认为选出来的主保留的分片是“主拷贝”并将这份拷贝推送给集群中的其他节点。这很严重。让我们设想下你是用的是node客户端并且一个节点保留了索引中的正确数据。但如果是另外的一个节点先启动并被选为主,它会将一份过期的索引数据推送给另一个节点,覆盖它,导致丢失了有效数据。
Elasticsearch部分节点不能发现集群(脑裂)问题处理

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

键走偏锋
2017/09/27
376
0
elasticsearch集群搭建手册(伪集群搭建)

安装部署 创建程序目录 安装目录 数据目录 下载程序 3.1 下载Elasticsearch 6.4.3 tar 3.2 解压文件 修改配置文件 01节点 vi /usr/local/elasticsearch/6.4.3/01/config/elasticsearch.yml ...

watermelon11
2018/11/07
132
0
Elasticsearch 向外扩展

一、向Elasticsearch集群加入节点 向集群增加一个节点前,test索引的主分片全部分配到节点Node1,而副本分片分配没有地方分配。在这种情况下,集群是黄色的,因为所有的主分片有了安家之处,...

二次元日系控铲屎官
03/18
0
0
Elasticsearch主要配置及性能调优

1、最小主节点数 防止集群发生脑裂,计算方式:( master 候选节点个数 / 2) + 1 可以通过修改配置文件elasticsearch.yml discovery.zen.minimummasternodes: 2 或者通过api接口动态修改 curl...

蜷缩的蜗牛
2018/05/04
0
0
elastic search+kibana 5.6.12安装指南

前提准备: 1,安装jdk, We recommend installing Java version 1.8.0_131 or later. 2, 设置文件最大打开数(使用命令ulimit -n查看) ulimit -n 65536 3, 创建用户elastic/用户组elastic gro...

PageYi
2018/10/23
198
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
6
0
CSS盒子模型

CSS盒子模型 组成: content --> padding --> border --> margin 像现实生活中的快递: 物品 --> 填充物 --> 包装盒 --> 盒子与盒子之间的间距 content :width、height组成的 内容区域 padd......

studywin
今天
7
0
修复Win10下开始菜单、设置等系统软件无法打开的问题

因为各种各样的原因导致系统文件丢失、损坏、被修改,而造成win10的开始菜单、设置等系统软件无法打开的情况,可以尝试如下方法解决 此方法只在部分情况下有效,但值得一试 用Windows键+R打开...

locbytes
昨天
8
0
jquery 添加和删除节点

本文转载于:专业的前端网站➺jquery 添加和删除节点 // 增加一个三和一节点function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(".triple-panel-con......

前端老手
昨天
8
0
一、Django基础

一、web框架分类和wsgiref模块使用介绍 web框架的本质 socket服务端 与 浏览器的通信 socket服务端功能划分: 负责与浏览器收发消息(socket通信) --> wsgiref/uWsgi/gunicorn... 根据用户访问...

ZeroBit
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部