1.概述

转载:留意Elasticsearch 7.x 可能无法选主的问题

Elasticsearch 7.x 选举算法改为基于 Raft 的实现,与标准 Raft 相比,最大的区别是允许选民可以投多票,当产生多个主节点的时候,让最后一个当选,这样,可以更快地选出主节点。但是这种机制同样也有缺点,就是会使竞选过程比较激烈。特别是当集群节点数量比较多的时候,候选人反复竞争可能会持续很长时间。

当遇到这种情况时,节点会有如下的日志:

master not discovered or elected yet, an election requires at least XX nodes with ids from [] which is a quorum; discovery will continue using [] from hosts providers and [] from last-known cluster state; node term 14, last-accepted version 71 in term 5

以及:

failed to join{…}
CoordinationStateRejectedException: incoming term 4996 does not match current term


但是这些报错和问题根因没有啥关系,探测到的节点已经能够达到 quorum,然后继续discovery,让人很费解。这时得把日志调到 DEBUG:

{"persistent": {"logger.org.elasticsearch.cluster.service.MasterService": "DEBUG","logger.org.elasticsearch.cluster.coordination": "DEBUG"}
}

跟随报错日志”which is a quorum; discovery will“,从代码一路跟过去,发现只有becomeCandidate的时候才会触发,搜索 debug 日志”coordinator becoming CANDIDATE“,找到以下信息:


注意他上一个状态是FOLLOWER,在 Elasticsearch 的选举状态图里,只有加入集群才会切换到FOLLOWER状态。这说明有主节点被选出来了,继续搜 ”coordinator becoming FOLLOWER “,可以找到他切换到FOLLOWER时Leader的源地址:


然后看一下 Leader 节点的日志,发现有:

elected-as-master (.. nodes joined) 以及
failing [elected-as-master

可以看到节点起初被成功选为 Master,但是后来因为收到其他节点拉选票的RequestVote 请求(joinLeaderInTerm函数是对竞选请求的处理)取消集群状态的发布,切换到候选人状态。如果他成功发布了集群状态,新主就可以顺利当选了。

我们再观察候选人每次发起 RequestVote 的周期以及成功情况:

grep -E "starting election with|elected-as-master" logs/my-debug.log |less

发现他有时候甚至来不及被选为master,都没有走到发布集群状态的流程:

而来不及被选为 master 的原因是被其他候选人拉选票的请求打断:


在 Elasticsearch 的选举算法中,允许选民投多票,并让最后一个leader当选,这需要

  • 候选人在拉选票的过程中,如果收到其他候选人的 RequestVote,则清空自己已经收到的选票
  • 如果一个 leader 收到 RequestVote,则切换到候选人

决定竞选激烈程度的是几个超时时间控制的选举周期:

  • gracePeriod:固定的竞选时长限制,由cluster.election.duration配置,默认 500ms
  • maxTimeout:选举前的最大等待时间,由cluster.election.max_timeout配置,默认 10s
  • backoffTime:竞选失败进行重试时,用重试次数乘以 backoffTime,由cluster.election.back_off_time
    配置,默认 100ms

候选人的竞选过程周期性执行,执行周期就是在cluster.election.duration的基础上加上不超过最大等待时间的随机值。

//重试次数,每次加 1
final long thisAttempt = attempt.getAndIncrement();
//最大延迟时间不超过cluster.election.max_timeout配置,每次递增cluster.election.back_off_time
final long maxDelayMillis = Math.min(maxTimeout.millis(), initialTimeout.millis() + thisAttempt * backoffTime.millis());
//执行延迟在cluster.election.duration基础上递增随机值
final long delayMillis = toPositiveLongAtMost(random.nextLong(), maxDelayMillis) + gracePeriod.millis();
threadPool.scheduleUnlessShuttingDown(TimeValue.timeValueMillis(delayMillis), Names.GENERIC, runnable);

这个延迟时间是一个比较小的时间,我们截取两个时间点可以大致看一下增长情况,经过 4 分钟左右,竞选周期从 1 秒内增长到 7 秒。这个过程是线性增长的。

[2021-02-18T00:13:48,869][DEBUG]scheduleNextElection{ delayMillis=658}
[2021-02-18T00:17:53,743][DEBUG]scheduleNextElection{ delayMillis=7597}

从上面的实现可以看出,加大 cluster.election.duration可以降低选举激烈程度。

这里还有一个疑问,PreVote 是干什么去了,为什么没有拦截住?有两种情况:

  • 选民收到首次集群状态,才认为集群存在 Leader 了,后续的 Prevote 返回 false,但是在竞争激烈的时候没有节点被选为 leader。
  • 选民收到了首次集群状态,但在此之前又收到了其他节点的 RequestVote,导致自己的 term 更大了,首次集群状态因为 term 更低被忽略。如下图:


最后总结一下,虽然分析过程比较复杂,但是解决起来比较简单(不很完美):部署独立的主节点,并且可以考虑适当增大cluster.election.duration的配置

【Elasticsearch】留意Elasticsearch 7.x 可能无法选主的问题相关推荐

  1. 【Elasticsearch】Elasticsearch gateway 流程分析

    1.概述 转载:elasticsearch gateway 流程分析 es 存储的数据有以下几种形式: state index translog index 为 lucene 生成的索引文件 tran ...

  2. 【elasticsearch】elasticsearch教程 es整合springboot教程 kibana安装教程 解决kibana访问404

    文章目录 linux安装es springboot-data整合es kibana安装 es和kibana配置账号密码 es的账号密码设置 kibana的账号密码设置 es高阶 分片策略 推迟分片分配 ...

  3. 【Elasticsearch】Elasticsearch中 aggs (桶)聚合查询和进行二次聚合查询

    [Elasticsearch]Elasticsearch中 aggs (桶)聚合查询和进行二次聚合查询 Bucket aggregationsedit Bucket aggregations don' ...

  4. php elasticsearch ik,elasticsearch 中文分词(elasticsearch-analysis-ik)安装

    elasticsearch 中文分词(elasticsearch-analysis-ik)安装 在elasticsearch的plugins目录下,创建ik目录 cd /usr/local/elast ...

  5. 【Elasticsearch】Elasticsearch 动态模板(Dynamic templates)

    1.概述 动态映射请参考: [Elasticsearch]Elasticsearch 7 : 动态映射 dynamic 本博客摘抄自:Elastic Stack 实战手册(早鸟版).pdf 原文可看, ...

  6. 【Elasticsearch】Elasticsearch日志场景最佳实践

    1.概述 转载:Day 12 - Elasticsearch日志场景最佳实践 相似文章:[Elasticsearch]Elasticsearch 最佳实践系列之分片恢复并发故障 Elasticsear ...

  7. 【Elasticsearch】Elasticsearch 7.4的 soft-deletes 是个什么鬼

    1.概述 转载:Elasticsearch 7.4的 soft-deletes 是个什么鬼 硬删除:[Elasticsearch]Elasticsearch如何物理删除给定期限的历史数据? 2.新概念 ...

  8. 【Elasticsearch】Elasticsearch 存储桶聚合

    1.概述 翻译:https://iridakos.com/programming/2018/10/22/elasticsearch-bucket-aggregations [Elasticsearch ...

  9. 【Elasticsearch】elasticsearch 压缩索引 shrink

    1.概述 关于索引的一些解读,请参考: [Elasticsearch]elasticsearch 索引 详解 官网 压缩索引 shrink shrink命令可以将一个已有的索引压缩成一个新的索引,同时 ...

最新文章

  1. MySql优化的方法
  2. 教你打造千万用户的海量视频网站、保卫云端安全!
  3. The Breakpoint will not currently be hit. No executable code associated with this line
  4. apache php debug,fedora linux apache/php下安装配置xdebug
  5. SpringMVC+MyBatis+MySQL实现分页
  6. linux下文本文件转换编码格式的方法
  7. 认识一个工具 Stopwatch
  8. Thinkphp仿众图网图片素材下载站源码/自适应手机端资源下载站源码
  9. 手机误删联系人恢复方法 快速找回丢失数据
  10. Java的身份证号码工具类
  11. golang制作一个斗地主游戏服务器[5]:牌型
  12. ITOP4412----Uboot2020移植记录
  13. 南阳oj _600花儿朵朵(树状数组插线问点+坐标离散化)
  14. log4j同配置下多个进程写日志
  15. 使用Python解析JSON
  16. 【YSYY】DSPE-PEG-Transferrin;DSPE-PEG-TF转铁蛋白的主动靶向介绍;磷脂-聚乙二醇-转铁蛋白
  17. Android 导出.vcf格式通讯录方法
  18. 无刷电机常用的磁性编码器资料收集
  19. 【北亚数据恢复】异常断电导致linux服务器无法启动,数据库损坏的数据恢复
  20. 苏宁宣布揭晓退还两周内iPad一代购置差价

热门文章

  1. 华为P50 Pro外观基本确认:居中开孔全面屏,首发鸿蒙操作系统
  2. 王传福回应“芯片短缺”:比亚迪没有受到丝毫影响
  3. 手机变身车机导航遥控器 高德地图上线手车互联新功能
  4. 首款“致敬”iPhone 12的手机来了:竟是华为......
  5. 下一代AirPods可能就可以监测你的健康状况了
  6. 特斯拉市值超过波音 成美国市值最高工业公司
  7. 小米手机又一产品线退场,大步迈向高端市场!
  8. 丁磊:很多人来网易工作只是为了谋生而不是兴趣
  9. 共话5G产业创新 5G+视频彩铃产业联盟成立
  10. 奥斯卡公布最佳动画长片初选名单 《哪吒》等32部动画入选