【Elasticsearch】留意Elasticsearch 7.x 可能无法选主的问题
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 可能无法选主的问题相关推荐
- 【Elasticsearch】Elasticsearch gateway 流程分析
1.概述 转载:elasticsearch gateway 流程分析 es 存储的数据有以下几种形式: state index translog index 为 lucene 生成的索引文件 tran ...
- 【elasticsearch】elasticsearch教程 es整合springboot教程 kibana安装教程 解决kibana访问404
文章目录 linux安装es springboot-data整合es kibana安装 es和kibana配置账号密码 es的账号密码设置 kibana的账号密码设置 es高阶 分片策略 推迟分片分配 ...
- 【Elasticsearch】Elasticsearch中 aggs (桶)聚合查询和进行二次聚合查询
[Elasticsearch]Elasticsearch中 aggs (桶)聚合查询和进行二次聚合查询 Bucket aggregationsedit Bucket aggregations don' ...
- php elasticsearch ik,elasticsearch 中文分词(elasticsearch-analysis-ik)安装
elasticsearch 中文分词(elasticsearch-analysis-ik)安装 在elasticsearch的plugins目录下,创建ik目录 cd /usr/local/elast ...
- 【Elasticsearch】Elasticsearch 动态模板(Dynamic templates)
1.概述 动态映射请参考: [Elasticsearch]Elasticsearch 7 : 动态映射 dynamic 本博客摘抄自:Elastic Stack 实战手册(早鸟版).pdf 原文可看, ...
- 【Elasticsearch】Elasticsearch日志场景最佳实践
1.概述 转载:Day 12 - Elasticsearch日志场景最佳实践 相似文章:[Elasticsearch]Elasticsearch 最佳实践系列之分片恢复并发故障 Elasticsear ...
- 【Elasticsearch】Elasticsearch 7.4的 soft-deletes 是个什么鬼
1.概述 转载:Elasticsearch 7.4的 soft-deletes 是个什么鬼 硬删除:[Elasticsearch]Elasticsearch如何物理删除给定期限的历史数据? 2.新概念 ...
- 【Elasticsearch】Elasticsearch 存储桶聚合
1.概述 翻译:https://iridakos.com/programming/2018/10/22/elasticsearch-bucket-aggregations [Elasticsearch ...
- 【Elasticsearch】elasticsearch 压缩索引 shrink
1.概述 关于索引的一些解读,请参考: [Elasticsearch]elasticsearch 索引 详解 官网 压缩索引 shrink shrink命令可以将一个已有的索引压缩成一个新的索引,同时 ...
最新文章
- MySql优化的方法
- 教你打造千万用户的海量视频网站、保卫云端安全!
- The Breakpoint will not currently be hit. No executable code associated with this line
- apache php debug,fedora linux apache/php下安装配置xdebug
- SpringMVC+MyBatis+MySQL实现分页
- linux下文本文件转换编码格式的方法
- 认识一个工具 Stopwatch
- Thinkphp仿众图网图片素材下载站源码/自适应手机端资源下载站源码
- 手机误删联系人恢复方法 快速找回丢失数据
- Java的身份证号码工具类
- golang制作一个斗地主游戏服务器[5]:牌型
- ITOP4412----Uboot2020移植记录
- 南阳oj _600花儿朵朵(树状数组插线问点+坐标离散化)
- log4j同配置下多个进程写日志
- 使用Python解析JSON
- 【YSYY】DSPE-PEG-Transferrin;DSPE-PEG-TF转铁蛋白的主动靶向介绍;磷脂-聚乙二醇-转铁蛋白
- Android 导出.vcf格式通讯录方法
- 无刷电机常用的磁性编码器资料收集
- 【北亚数据恢复】异常断电导致linux服务器无法启动,数据库损坏的数据恢复
- 苏宁宣布揭晓退还两周内iPad一代购置差价
热门文章
- 华为P50 Pro外观基本确认:居中开孔全面屏,首发鸿蒙操作系统
- 王传福回应“芯片短缺”:比亚迪没有受到丝毫影响
- 手机变身车机导航遥控器 高德地图上线手车互联新功能
- 首款“致敬”iPhone 12的手机来了:竟是华为......
- 下一代AirPods可能就可以监测你的健康状况了
- 特斯拉市值超过波音 成美国市值最高工业公司
- 小米手机又一产品线退场,大步迈向高端市场!
- 丁磊:很多人来网易工作只是为了谋生而不是兴趣
- 共话5G产业创新 5G+视频彩铃产业联盟成立
- 奥斯卡公布最佳动画长片初选名单 《哪吒》等32部动画入选