集群脑裂是什么?

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

  由于某些节点的失效,部分节点的网络连接会断开,并形成一个与原集群一样名字的集群,这种情况成为集群脑裂(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 台服务器了, 这点需要注意) 。

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

如果发生了脑裂, 如何解决?
  当脑裂发生后, 唯一的修复办法是解决这个问题并重启集群。 这儿有点复杂和可怕。 当elasticsearch 集群启动时, 会选出一个主节点( 一般是启动的第一个节点被选为主) 。 由于索引的两份拷贝已经不一样了, elasticsearch 会认为选出来的主保留的分片是“主拷贝”并将这份拷贝推送给集群中的其他节点。 这很严重。 让我们设想下你是用的是 node 客户端并且一个节点保留了索引中的正确数据。 但如果是另外的一个节点先启动并被选为主, 它会将一份过期的索引数据推送给另一个节点, 覆盖它, 导致丢失了有效数据。

总结
  所以怎么从脑裂中恢复?

   第一个建议是给所有数据重新索引。

  第二, 如果脑裂发生了, 要十分小心的重启你的集群。 停掉所有节点并决定哪一个节点第一个启动。 如果需要, 单独启动每个节点并分析它保存的数据。 如果不是有效的, 关掉它, 并删除它数据目录的内容( 删前先做个备份) 。 如果你找到了你想要保存数据的节点, 启动它并且检查日志确保它被选为主节点。 这之后你可以安全的启动你集群里的其他节点了。

详细分析es节点的几种角色

https://www.elastic.co/guide/en/elasticsearch/reference/2.4/modules-node.html#_node_data_path_settings

转载于:https://www.cnblogs.com/zlslch/p/6477312.html

Elasticsearch之集群脑裂相关推荐

  1. Elasticsearch集群“脑裂”现象

    1.什么是Elasticsearch集群脑裂 Elasticsearch集群由一个主节点(可以有多个备选主节点)和多个数据节点组成.其中主节点负责创建.删除索引.分配分片.追踪集群中的节点状态等工作, ...

  2. 【Zookeeper】Zookeeper集群“脑裂”问题处理大全

    本文重点分享Zookeeper脑裂问题的处理办法.ZooKeeper是用来协调(同步)分布式进程的服务,提供了一个简单高性能的协调内核,用户可以在此之上构建更多复杂的分布式协调功能. 脑裂通常会出现在 ...

  3. Zookeeper集群脑裂问题

    关于集群中的"脑裂"问题,之前已经在这里详细介绍过,下面重点说下Zookeeper脑裂问题的处理办法.ooKeeper是用来协调(同步)分布式进程的服务,提供了一个简单高性能的协调 ...

  4. 关于ZooKeeper集群脑裂及其解决方案

    本文来说下ZooKeeper集群脑裂及其解决方案 文章目录 概述 Zookeeper集群节点为什么要部署成奇数 Zookeeper集群中的"脑裂"场景说明 Zookeeper集群& ...

  5. 关于redis集群脑裂及其解决方案

    本文来说下redis集群脑裂及其解决方案 文章目录 概述 概述

  6. REDIS哨兵【Sentinel】模式+哨兵的核心知识点+redis哨兵主从切换的数据丢失问题+上一章铺垫的【异步复制数据丢失问题】+【集群脑裂】

    1.redis哨兵模式的前言: 一年一度的问题来了,为啥子要用redis的哨兵模式的呢? 简单粗暴的理解下子,顺带开个玩笑,没有理解好,还望不要见笑: 其实redis的哨兵模式,个人理解:只是说法搞大 ...

  7. 什么是redis集群脑裂及解决方案

    什么是redis的集群脑裂? redis的集群脑裂是指因为网络问题,导致redis master节点跟redis slave节点和sentinel集群处于不同的网络分区,此时因为sentinel集群无 ...

  8. Redis集群脑裂、Redis主从同步的异步丢数据问题

    什么是Redis的集群脑裂? Redis的集群脑裂指在主从集群中,同时有两个master主节点,它们都能接收写请求.而脑裂最直接的影响,就是客户端不知道应该往哪个master主节点写入数据,结果就是不 ...

  9. Redis集群脑裂导致数据丢失问题处理

    什么是Redis的集群脑裂: Redis的集群脑裂指在主从集群中,同时有两个master主节点,它们都能接收写请求.而脑裂最直接的影响,就是客户端不知道应该往哪个master主节点写入数据,结果就是不 ...

最新文章

  1. mysql 高并发加锁_Mysql高并发加锁事务处理
  2. python判断括号有效,在Python中检查括号是否平衡
  3. hadoop学习5 搭建storm集群
  4. linux8安装ftp服务,CentOS8.0 安装配置ftp服务器的实现方法
  5. python 在window 系统 连接并操作远程 oracle 数据库
  6. js密码强度正则表达式_相信我,这20个正则表达式,能让你少写1000多行代码,建议收藏...
  7. jdk1.8 64位与32位免费下载
  8. 星环Transwarp Data Hub大数据安装学习
  9. 2006技术盘点 多项无线技术被高估
  10. java二叉树详解_最全二叉树:完整详解二叉树的遍历以及完全二叉树等6种二叉树...
  11. C#文件操作——文件、数据流与注册表
  12. 根域名服务器作用,域名系统的主要功能是什么?域名系统中的本地域名服务器、根域名服务器、顶级域名 - 问答库...
  13. php后台登录页,后台登录页面模板源码
  14. 点击修改按钮,将数据显示在弹层窗口中,利用ajax实现
  15. python 如何安装numpy库?
  16. MFC组合框实现多列组合框功能
  17. 树莓派制作迅雷远程下载 下载机 Xware1.0.31_armel_v5te_glibc
  18. TPAMI 2022|基于最优传输理论的无监督图像重建学习
  19. 实现素描效果---OpenCV-Python开发指南(49)
  20. Nginx 端口转发实现!

热门文章

  1. UVA 10746 Crime Wave - The Sequel
  2. maven排除依赖包的子依赖_漫画谈一下Maven依赖
  3. cin输入问题的处理:cin.clear() 、cin.sync() 、cin.ignore()
  4. 天水师范学院计算机科学与技术专业代码,计算机科学与技术-天水师范学院IPv6专题网站.doc...
  5. python until语句_Python3 循环
  6. Python进阶6——序列操作
  7. rabbitmq实战:高效部署分布式消息队列_一文看懂消息队列中间件--AMQ及部署介绍...
  8. jemter接口并发数怎么算_JMeter学习使用(1) - 接口GET请求并发测试
  9. Spring MVC GET 从客户端数据到服务器端的乱码和服务器端数据到客户端的乱码
  10. Java面试笔试题大汇总三(最全+详细答案)