记一次 MongoDB 选主问题的解决及分析

目录

一、副本集构成

二、问题发生与解决

三、问题分析

1. 为何触发重新选举

2. 主何时被认为已失效

3. 选主过程

4. 关于候选节点(Candidate Node)

(1)候选节点的定义

(2)候选节点的产生条件

(3)候选节点的行为

(4)候选节点与主节点、从节点的关系

(5)候选节点的作用与意义

5. 平票怎么办

6. 优先级的作用

7. 结论


一、副本集构成

        一个线上 MongoDB 集群,版本是 3.0.15,副本集由以下五个节点(一主四从)构成:
主:172.30.4.28:30001; votes=1; priority=10;
从:172.30.4.42:30001; votes=1; priority=1;
从:172.20.1.40:30001; votes=1; priority=5;
从:172.20.1.41:30001; votes=1; priority=1;
从:172.20.1.42:30001; votes=1; priority=1;

        其中 30 网段有一主一从两个节点,20 网段有三个从节点。应用程序直连的 172.30.4.28。

二、问题发生与解决

        20 与 30 两个网段之间断网,之后 30 网段的两个节点 172.30.4.28 与 172.30.4.42 都变为从,重启后依然,应用程序无法正常向 MongoDB 中写入数据。解决方法是在原来的主节点上执行如下操作:

# 切换到管理库
use admin# 获取当前副本集配置
cfg=rs.conf()# 重新配置副本集,只配置 30 网段的两个节点,并取消其中一个节点的投票权
cfg.members = [cfg.members[0], cfg.members[1]]
[
{"_id" : 2,"host" : "172.30.4.42:30001","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"slaveDelay" : 0,"votes" : 0},
{"_id" : 3,"host" : "172.30.4.28:30001","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 10,"tags" : {},"slaveDelay" : 0,"votes" : 1}
]# 强制重新配置副本集
rs.reconfig(cfg, {force :true })

        完成后副本集一主一从,应用程序访问正常,问题解决。

三、问题分析

1. 为何触发重新选举

        MongoDB 触发重新选举(re-election)一个新的 primary 节点通常发生在以下几种情况:

  • 当前的 primary 节点因某些原因宕机或无法与集群中的大多数节点通信时。
  • 当前的 primary 节点可能会因为网络分区或其它一些情况而被集群认为已经失效,此时它会自动从集群中移除。

        本例中,primary 节点没有宕机,但同时与三个从节点失联后被认为已经失效,状态由 PRIMARY 变为了 SECONDARY, 从而触发了重新选举。那么 primary 节点为什么被认为是已经失效呢?

2. 主何时被认为已失效

        在 MongoDB 中,当一个副本集的主节点(primary)失效时,副本集会开始一个选举过程来选出新的主节点。主节点被认为已失效的时间点通常是它无法与副本集中的大多数节点通信,且不能持续一段时间的“心跳”检查。

        具体的失效判定条件取决于副本集的配置和操作系统时钟的准确性。一般来说,如果主节点在一段时间内(默认是10秒)不能与副本集中大多数的节点进行通信,那么这个节点会被认为已经失效。简单说就是与大多数节点失联10秒即属失效。

        在选举开始之后,副本集中的其他节点会尝试选出新的主节点。一旦新的主节点被选出,副本集会开始接受客户端的写操作。注意,这个过程可能会导致短暂的服务中断,停服时间取决于副本集的大小和网络延迟。

        下一个问题是怎么选主的呢?

3. 选主过程

        MongoDB 的选主过程(也称为选举)是集群中的节点决定谁将成为主节点(primary)的过程。这个过程是自动的,通常在主节点失效时触发。MongoDB 使用复杂的投票协议来选主,这意味着在一个集群中,每个节点都会向其他节点投票来表明它选举的主节点,获得多数票的节点成为主节点。

        以下是 MongoDB 选主过程的简化步骤:

  1. 每个节点开始于一个状态,通常是 STARTUP 或 SECONDARY。
  2. 当集群中的节点检测到主节点失效时,它们进入 RECOVERING 状态并开始选主过程。
  3. 每个节点向其他节点发送一个投票,包括了自己的服务器 ID 和任期号(term)。
  4. 其他节点接收投票并决定是否接受,基于它们已经投给的节点和它们对候选节点的看法。
  5. 当一个节点获得大多数节点的投票,它成为主节点,并将其余节点置为次节点或辅助节点。

        注意,MongoDB 使用的投票协议保证了在任何给定的任期号(term)内只有一个主节点。如果在同一任期号内出现多个节点获得相同数量的投票,则选举过程会重新开始,并增加任期号。

        MongoDB 的选主过程是自动的,通常不需要人工干预。那么下一个问题是什么没有选出新的主节点呢?

4. 关于候选节点(Candidate Node)

        在 MongoDB 中,候选节点(Candidate Node)是副本集(ReplicaSet)选举过程中的一个重要角色。以下是对 MongoDB 候选节点的详细解释。

(1)候选节点的定义

        候选节点是在 MongoDB 副本集选举过程中,由从节点(Secondary Node)转变而来的一个临时状态。当副本集中的主节点(Primary Node)不可用时(例如,宕机、失去联系或主动放弃主节点角色),剩余的从节点将触发选举过程,其中一个或多个从节点可能会转变为候选节点,以竞选成为新的主节点。

(2)候选节点的产生条件

        一个副本节点成为候选节点,需要满足以下条件和配置:

  • 节点优先级:要使副本节点成为候选节点,需要将其优先级设置为大于 0 的值。通常,优先级较高的节点更有可能成为候选节点。
  • 数据一致性:在选举过程中,只有拥有最新数据的节点才有可能被其它节点投票支持成为主节点。因此,副本节点需要保持与主节点的数据一致性,并随时准备在选举过程中提供最新的数据副本。
  • 网络连接:副本节点需要与副本集中的其它节点保持网络连接,以便在选举过程中接收和发送心跳信号和选举请求。如果副本节点与大多数节点失去连接,它将无法参与选举或被其它节点选举为主节点。

(3)候选节点的行为

  • 发起选举请求:一旦成为候选节点,它会向副本集中的其它节点发送选举请求,请求它们投票支持自己成为新的主节点。选举请求中通常包含候选节点的任期(Term)信息和日志索引(Log Index)等关键信息。
  • 等待投票:候选节点会等待其它节点的响应。这些响应可以是支持票(即投票给候选节点),也可以是反对票(即不投票给候选节点)。
  • 处理投票结果:如果候选节点在选举超时之前获得了超过半数节点的支持票,它将成为新的主节点,并开始处理写操作和协调读取操作。如果未获得足够的支持票,则选举失败,候选节点将重置选举超时计时器,并可能再次尝试发起选举。

(4)候选节点与主节点、从节点的关系

  • 与主节点的关系:在选举过程中,候选节点是竞选成为新主节点的节点。一旦成功当选,候选节点将转变为新的主节点,并承担主节点的职责。如果选举失败,则候选节点将重新变为从节点,等待下一次选举机会。
  • 与从节点的关系:在正常情况下,候选节点是从节点的一个子集。当主节点不可用时,部分或全部从节点可能会转变为候选节点以参与选举。然而,在选举过程中,只有获得足够支持票的候选节点才能成为新的主节点,而其它候选节点和未参与选举的从节点将继续作为从节点存在。

(5)候选节点的作用与意义

        候选节点的存在是 MongoDB 副本集选举机制的重要组成部分。它确保了当主节点不可用时,副本集能够迅速且有效地选举出一个新的主节点来继续处理写操作和协调读取操作。这有助于保持数据的一致性和系统的高可用性。同时,候选节点的竞争机制也有助于防止单点故障和数据丢失的风险。

        综上所述,MongoDB 的候选节点是副本集选举过程中的一个关键角色。它通过与从节点和主节点的交互以及自身的行为来确保选举的顺利进行和系统的稳定运行。

        在本例中,两个节点虽然优先级不同,但都满足成为候选节点的条件,都成为了候选节点,并且都给对方投了一票,因此出现了平票而无主的情况。

5. 平票怎么办

        MongoDB 的选举过程遵循一定的规则和条件,包括节点的状态、数据的更新情况、选举权重以及节点的优先级等。本例中,30 网段只有两个节点,它们各有一票,都没有获得多数票,所以状态都为 SECONDARY,没有选出新的主节点。

        但是,这两个节点的优先级分别是 10 和 1,优先级高的没有被选为主。

        在选举过程中,如果多个节点获得了相同数量的投票,MongoDB 的选举机制并不会简单地根据节点的优先级来选择 primary。这是因为选举机制的设计目标是确保数据的一致性和服务的连续性,而不仅仅是基于节点的优先级。

        具体来说,当多个节点平票时,MongoDB 会考虑其他因素来打破平局,例如节点的数据更新情况(通过操作日志 oplog 来检查)和节点的稳定性等。如果两个节点的数据版本相同且优先级也相同,那么选举过程可能会陷入僵局,直到某个节点因为数据更新或其他因素而获得更多支持。

        那优先级的作用又是什么呢(尤其实在平票的情况下)?

6. 优先级的作用

        在副本集中,每个成员节点都有一个与之关联的优先级,这个优先级决定了节点在选举过程中成为主节点(primary)的权重。优先级越高,节点在选举中获胜的可能性就越大(其实就是越可能被投票)。

        虽然优先级在选举过程中是一个重要因素,但它并不是决定性的,起决定性作用的还是节点所获得的票数。如果选举过程中出现平票,优先级高的节点并不会被自动选为 primary。

        此外,需要注意的是,MongoDB 的副本集设计中通常建议节点数为奇数(更准确地说是一个网络分区中的节点数为奇数),这是为了确保在投票过程中能够避免出现平票情况。因为奇数个节点可以确保在大多数情况下都能选出一个明确的 primary 节点。注意,本例和通常所说的“脑裂”情况不一样,通常所说的“脑裂”是指在一个集群中出现多主,而本例是无主。

7. 结论

        综上所述,MongoDB 选举 primary 的决定因素是票数,平票情况下优先级大的节点也不会被选,此时 MongoDB 会考虑其他因素来打破平局,以选举出一个合适的 primary 节点来继续提供服务。但是这钟机制并不能保证选举出主节点,本例就是。

        因此,在配置 MongoDB 副本集时,除了设置节点的优先级外,还需要考虑其他因素,如节点的数据更新情况、稳定性以及副本集的整体架构等,以确保选举过程的顺利进行。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/886792.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS逆向入门:使用theos注入第三方依赖库

背景 theos是一个跨平台的软件开发框架,常用于管理,开发和部署iOS项目,同时也是开发iOS越狱插件的主要工具。和MonkeyDev不同的是,它不依赖于xcode,可以在多个操作系统上运行。一个完整的iOS越狱开发流程包括&#xf…

mysql8.4+mysql router读写分离

以下为容器环境内搭建 准备工作: 拉取镜像: 镜像版本mysql8.4container-registry.oracle.com/mysql/community-router8.4 下载mysql_shell mysql-shell-9.0.1-linux-glibc2.17-x86-64bit.tar.gz 下载地址: https://downloads.mysql.com/archives/shell/ 参考 这里对这篇文章…

STM32电源管理—实现低功耗

注: 本文是学习野火的指南针开发板过程的学习笔记,可能有误,详细请看B站野火官方配套视频教程(这个教程真的讲的很详细,请给官方三连吧) 在响应绿色发展的同时,在很多应用场合中都对电子设备的功…

【FPGA开发】AXI-Stream总线协议解读

文章目录 AXI-Stream概述协议中一些定义字节定义流的定义 数据流类别字节流连续对齐流连续不对齐流稀疏流 协议的信号信号列表 文章为个人理解整理,如有错误,欢迎指正! 参考文献 ARM官方手册 《IHI0051B》 AXI-Stream概述 协议中一些定义 A…

LogViewer NLog, Log4Net, Log4j 文本日志可视化

LogViewer 下载 示例&#xff1a;NLog文本日志可视化软件&#xff0c;并且能够实时监听输出最新的日志 nlog.config 通过udp方式传输给LogViewer (udp://ip:port) <?xml version"1.0" encoding"utf-8" ?> <nlog xmlns"http://www.nlog-…

ES-针对某个字段去重后-获取某个字段值的所有值

针对上面表的数据&#xff0c;现在想根据age分组&#xff0c;并获取每个分组后的name有哪些(去重后)。 select age, GROUP_CONCAT(DISTINCT(name)) from testtable group by age ; 结果&#xff1a; 如果想要增加排序&#xff1a; SELECT age, GROUP_CONCAT(DISTINCT name)…

LabVIEW三针自动校准系统

基于LabVIEW的智能三针自动校准系统采用非接触式激光测径仪对标准三针进行精确测量。系统通过LabVIEW软件平台与硬件设备的协同工作&#xff0c;实现了数据自动采集、处理及报告生成&#xff0c;大幅提高了校准精度与效率&#xff0c;并有效降低了人为操作误差。 一、项目背景…

流程图图解@RequestBody @RequestPart @RequestParam @ModelAttribute

RequestBody 只能用一次&#xff0c;因为只有一个请求体 #mermaid-svg-8WZfkzl0GPvOiNj3 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8WZfkzl0GPvOiNj3 .error-icon{fill:#552222;}#mermaid-svg-8WZfkzl0GPvOiNj…

【机器学习】机器学习中用到的高等数学知识-7.信息论 (Information Theory)

熵 (Entropy)&#xff1a;用于评估信息的随机性&#xff0c;常用于决策树和聚类算法。交叉熵 (Cross-Entropy)&#xff1a;用于衡量两个概率分布之间的差异&#xff0c;在分类问题中常用。 信息论作为处理信息量和信息传输的数学理论&#xff0c;在机器学习中具有广泛的应用。…

猎板PCB罗杰斯板材的应用案例

以下是几个猎板 PCB 与罗杰斯板材结合的具体案例&#xff1a; 案例一&#xff1a;5G 通信基站天线 PCB 在 5G 通信基站的天线系统中&#xff0c;对高频信号的传输和处理要求极高。猎板 PCB 采用罗杰斯板材&#xff0c;凭借其稳定的低介电常数&#xff08;如 RO4003C 板材&…

解读InnoDB数据库索引页与数据行的紧密关联

目录 一、快速走进索引页结构 &#xff08;一&#xff09;整体展示说明 &#xff08;二&#xff09;内容说明 File Header&#xff08;文件头部&#xff09; Page Header&#xff08;页面头部&#xff09; Infimum Supremum&#xff08;最小记录和最大记录&#xff09; …

【UNIAPP】uniapp版图片压缩工具

二次封装的uniapp版本图片压缩、上传工具&#xff0c;支持全端&#xff08;H5、小程序、APP&#xff09; 新建文件&#xff1a;file-util.js class FileUtil {/*** [文件上传]* param {[object]} fileObj [图片地址]* param {[object]} formData [参数]* param {[str…

Python去除图像白色背景

使用Pillow去除图像背景 安装依赖&#xff1a; pip install pillow 实现步骤&#xff1a; 使用Pillow库加载图像&#xff0c;并将其转换为RGBA模式&#xff0c;以支持透明度。遍历图像的每个像素&#xff0c;检查其红色、绿色和蓝色值是否都高于预设的阈值。对于被视为白色…

Spring Cache之本地缓存注解@Cacheable,@CachePut,@CacheEvict使用

*使用前需要在启动类上添加一个注解&#xff1a;EnableCaching 先说一下SpringCache是不支持灵活的缓存时间设置的&#xff0c;但可以自己实现。且不支持集群&#xff0c;因为是缓存到每台机器上&#xff0c;除非所有机器都有缓存。 所以使用场景一般是数据量较小的单机服务。…

Excel如何把两列数据合并成一列,4种方法

Excel如何把两列数据合并成一列,4种方法 参考链接:https://baijiahao.baidu.com/s?id=1786337572531105925&wfr=spider&for=pc 在Excel中,有时候需要把两列或者多列数据合并到一列中,下面介绍4种常见方法,并且提示一些使用注意事项,总有一种方法符合你的要求:…

uniApp项目运行到鸿蒙手机,应用图标一直是H,应用名一直是HBuilder问题

项目运行到鸿蒙手机&#xff0c;应用图标一直是H,应用名一直是HBuilder问题 应用运行到鸿蒙手机和鸿蒙模拟器&#xff0c;应用图标一直是H,应用名一直是HBuilder&#xff0c;在自动生成的harmony-configs文件夹下也没有配置的文件&#xff0c; 这时候需要你将DevEco Studio 下…

uniapp 自定义加载组件,全屏加载,局部加载 (微信小程序)

效果图 全屏加载 页面加载使用 局部加载 列表加载里面使用 使用gif html <template><view><view class"" v-if"typeFullScreen"><view class"loading" v-if"show"><view class""><i…

C++----特殊类的设计

文章目录 特殊类的设计设计一个类不能被拷贝设计一个类&#xff0c;只能在堆上创建对象设计一个类&#xff0c;只能在栈上创建对象设计一个类&#xff0c;不能被继承设计一个类&#xff0c;只能创建一个对象&#xff08;单例模式&#xff09;设计模式单例模式概念单例模式的实现…

鸿蒙实战:使用隐式Want启动Ability

文章目录 1. 实战概述2. 实现步骤2.1 创建鸿蒙应用项目2.2 修改Index.ets代码2.3 创建LuzhouAbility2.4 创建Luzhou页面2.5 设置模块配置文件 3. 测试效果4. 实战总结 1. 实战概述 本次鸿蒙应用实战&#xff0c;先创建项目“ImplicitWantStartAbility”&#xff0c;接着修改In…

两数之和 python

两数之和 题目描述示例1示例2示例3提示leetcode链接解题思路Python 实现详细解释 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应…