Elasticsearch采用了master-slave模式, ES会在集群中选取一个节点成为主节点,只有Master节点有资格维护全局的集群状态,在有节点加入或者退出集群的时候,它会重新分配分片,并将集群最新状态发送给集群中其它节点,主节点会以周期性ping的方式以验证其它节点是否存活。Elasticsearch的选举算法基于Bully选举算法,简单的说,在bully算法中,每个节点都有一个编号,只有编号最大的存活节点才能成为master节点。

1. 选举时间点

选举的时间点有两个

  1. 某个新节点加入了集群或者某个节点从宕机中恢复
  2. 集群中的某个节点检测到leader崩溃

2. 选举流程

选举的流程说明如下

  1. 节点node向所有比自己大的节点发送选举消息(选举为election消息)
  2. 如果节点node得不到任何回复(回复为alive消息),那么节点node成为master,并向所有的其它节点宣布自己是master(宣布为Victory消息)
  3. 如果node得到了任何回复,node节点就一定不是master,同时等待Victory消息,如果等待Victory超时那么重新发起选举

笔者借助网上的一组图片详细阐述Bully的选举流程,图片来自于

Bully Election Algorithm Example​www.cs.colostate.edu

假设有如下6节点组成的集群,每个节点都会维护和其它节点的联系,p6节点是当前集群的master节点

在某个时间点master节点p6发生了宕机
P3节点是整个集群中最先发现master节点宕机的节点,p3节点通知了比自己编号大的p4,p5节点,p6节点
因为p6节点已经宕机,只有p4,p5节点向p3节点发出响应,并通知p3节点他们会取代p6节点成为master节点
P4节点向P5,P6节点发送通知
因为p6节点已经宕机,所以只有p5节点作出了响应
P5节点向P6节点发起选举通知,P6节点没有响应,于是P5节点成为了整个集群的master节点
P5节点成为了整个集群的master节点

3. Elasticsearch编号比较

Elasticsearch编号比较的判断依据有两个,首先是ClusterState版本号的比较,版本号越大优先级越高,然后是节点id的比较,id越小优先级越高。ClusterState是Master向集群中各个节点发送的集群状态,这个状态有一个版本号码,如果集群状态发生了变化,比如集群新增了节点成员或者有节点成员退出了,那么这个版本号就会加一,比对这个版本号的目的是让拥有最新状态的节点成为Master的优先级最高。

4. Bully算法缺陷

4.1 Master假死

Master节点承担的职责负载过重的情况下,可能无法即时对组内成员作出响应,这种便是假死。如果上图中的P6节点假死,于是P5节点成为了Master节点,但是在P6节点负载减轻之后,P6节点又对组内成员作出了响应,P6节点又会成为Master节点,如此反复,整个集群状态就会非常不可靠。

Elasticsearch是如何解决这个问题的呢?在Bully算法中,Master节点P6因为负载重,来不及对P3节点作出响应,所以P3节点通知P4,P5节点进行选举。在Elasticsearch中,P3节点发现Master P6对自己长时间不作出响应,P3节点会请求其它节点判断P6节点是否存活,如果有1/2以上节点都认定P6存活,那么P3就会放弃发起选举

4.2 脑裂问题

脑裂问题指的是一个集群中出现了两个及以上的Master节点。

比如上图中集群因为网络原因分成了两个部分,一个部分称为partition1包含P3,P5,P6节点,另一部分称为partition2包含P2,P1,P4节点,这两个partition因为网络原因比如路由器短时故障造成不能相互通信的问题。

那么网络分区一根据Bully算法选举出了P6作为master,而网络分区二选举出了P4作为master,这就是脑裂问题。

Elasticsearch脑裂解决方案

Quorum算法

脑裂问题是所有集群选举算法都要面对的一个问题,Elasticsearch集群机制采用了最小参与节点的方案解决的。假设elasticsearch集群中有资格投票的实例个数是n,节点想要成为master必须要得到n/2 +1票数(在本示例中是4)。上图中的分区一P6和分区二中的P4,任何一个master节点所在的分区集群的候选节点数目都小于4,更不可能得到4个选票,所以整个Elasticsearch集群处于瘫痪状态

我们也可以强制指定elasticsearch节点在有M个候选节点的情况下能选举出一个主节点,但是如果配置数小于上文提到的 n/2 +1 那么会出现脑裂的情况,M的配置参数如下

discovery.zen.minimum_master_nodes

如果产生了脑裂情况,为了避免脑裂的Master生成错误数据对整个集群产生影响。Master更新集群状态时还作出了如下防护,Master有两种指令,一种是send指令,另一种是commit指令,Master将最新集群状态推送给其它节点的时候(这是send指令),Master节点进入等待响应状态,其它节点并不会立刻应用该集群状态,而是首先会响应Master节点表示它已经收到集群状态更新,同时等待Master节点的commit指令。Master节点如果在discovery.zen.commit_timeout配置时间内都没有收到discovery.zen.minimum_master_nodes个数的节点响应,那么Master节点就不会向其它节点发送commit指令。如果Master收到了足够数量的响应,那么Master会向集群发出提交状态的指令,此时其它节点应用集群最新状态,Master节点再次等待所有节点响应,等待时间为discovery.zen.publish_timeout,如果任何一个节点没有发出提交响应,Master再次更新整个集群状态更新。

4.3 Master降级

Master主动降级发生在两种情况。

第一种是master发现自己能连接到的其它节点数目小于n/2 + 1,那么master自动降级为candidate。

第二种是Master在ping其它节点时候,如果发现了其它master,那么当前的master会比较cluster_state的version,如果当前master的version小,那么主动降级为candidate并主动加入另外一个master节点

4.4 网络负载问题

从上图中可以看到,集群中每个节点成员都会维护和其它所有成员的交互,整个集群维护的网络连接的总数是n*(n-1),如果集群中节点的数目非常的多,那么网络连接数目也会非常的多,网络负载会比较大,但是好在elasticsearch节点数目往往比较少,所以这个缺陷对elasticsearch集群来说不会产生什么影响。在前一篇关于集群发现的文章https://zhuanlan.zhihu.com/p/109570606中提到,elasticsearch可以通过参数限制单播的最大连接数目,该值默认为10

discovery.zen.ping.unicats.concurrent_connects

elasticsearch最大节点数_Elasticsearch选举原理之Bully算法相关推荐

  1. elasticsearch最大节点数_ElasticSearch读写底层原理及性能调优

    ES写入/查询底层原理 1. Elasticsearch写入数据流程 客户端随机选择一个ES集群中的节点,发送POST/PUT请求,被选择的节点为协调节点(coordinating node) 协调节 ...

  2. elasticsearch最大节点数_ElasticSearch这些概念要明白

    ElasticSearch 基本概念 文档(Document) ElasticSearch是面向文档的,文档是可搜索的最小单位. 好比 日志文件中的日志 MP3播放的一首歌 文档会被序列化成JSON格 ...

  3. elasticsearch最大节点数_Elasticsearch究竟要设置多少分片数?

    0.引言 本文翻译自Elasticsearch20170918热乎的官方博客,原作者:Christian Dahlqvist. 在构建Elasticsearch集群的初期如果集群分片设置不合理,可能在 ...

  4. elasticsearch最大节点数_记录 Elasticsearch 的 maximum shards open 问题

    问题背景 某天打开 Jaeger UI 后,发现里面没有任何数据了,这是个奇怪的问题. 然后立马上服务器检查了 jaeger-collector, jaeger-agent, jaeger-query ...

  5. fastdfs的tracker启动之后一直选举_Elasticsearch选举流程详解

    在上文 蓝天:Elasticsearch选举原理之Bully算法​zhuanlan.zhihu.com 中,笔者介绍了Bully算法原理以及Bully缺陷,随后笔者介绍了Elasticsearch如何 ...

  6. VRRP浮动路由(浮动路由原理,了解HSRP路由选举原理,实验过程与总结)

    文章目录 前言 单一链路存在的问题 HSRP是思科的私有协议 HSRP (热备份路由选择协议)介绍 VRRP浮动路由原理 Master路由器选举原理 浮动路由原理 实验详解 实验目的 实验过程 主机设 ...

  7. MongoDB复制选举原理及复制集管理

    一.MongoDB复制集的选举原理 复制是基于操作日志oplog,相当于MySQL中的二进制日志,只记录发生改变的记录.复制是将主节点的oplog日志同步应用到其他从节点的过程. 复制集的节点是通过选 ...

  8. Zookeeper选举原理——FastLeaderElection

    转载自  Zookeeper选举原理 作为一个分布式应用程序协调服务,在大型网站中,其本身也是集群部署的,安装zookeeper的时候最好是单数节点,因为要选举.Zookeeper的leader节点是 ...

  9. 【Elasticsearch】Elasticsearch 查询过程中的 pre-filter 原理

    1.概述 转载:添Elasticsearch 查询过程中的 pre-filter 原理 大家都知道在对索引执行查询的时候,需要在所有的分片上执行查询,因为无法知道被查询的关键词位于哪个分片,对于全文查 ...

最新文章

  1. 第 20 课时:GPU 管理和 Device Plugin 工作机制(车漾)
  2. Sql高级查询(三)
  3. kali Linux 源更新
  4. dedeCMS 静态页面的倒计时插件(原生VS自定义)
  5. IIS7 配置 PHP
  6. es6 属性的可枚举性和遍历
  7. Nginx之http配置
  8. 洛谷——P1075 [NOIP2012 普及组] 质因数分解
  9. 【渝粤教育】电大中专电商运营实操 (13)作业 题库
  10. CSV 文件中的字段中的开头和结尾上,可能会存在空格或制表符,但是该如何处理呢?
  11. TCP/IP协议新手入门学习
  12. java使用反射生成JDK动态代理
  13. PHP写的二维码签到,大家支持一下吧!
  14. 济南软件测试行业提出千亿级市场的战略布局
  15. 人生的差别在于业余时间的利用
  16. 软件可靠性工程研讨会报告
  17. Java 工厂设计模式
  18. 人月神话 中文版 pdf
  19. UrlRewritingNet 完美实现 ASP.NET 2.0 中的URL重写(映射)
  20. 华为v9play有计算机吗,华为荣耀v9play好用吗,华为荣耀v9play参数配置

热门文章

  1. Python----Requests库基本使用
  2. 在.NET中编辑器在用伪静态后不能正常使用的解决方法
  3. android支持第三方jar包,以及Eclipse如何导入jar包
  4. 用纯C面向过程写icefox3的代码
  5. CSP认证201809-4 再卖菜[C++题解]:差分约束、前缀和
  6. mysql主从位点保存时间_MySQL主从备份
  7. 修改登录密码html代码,修改密码.html · yuanxing_one/yuanxing - Gitee.com
  8. 信息检索报告_iFixR:缺陷报告驱动程序修复
  9. 安卓中radiobutton不进入监听事件_Laravel模型事件的实现原理详解
  10. lex 词法分析 linux,lex语言词法分析