MongoDB集群中的一个典型的错误

ops/2024/12/19 14:58:46/

1.案例

(1)现象:主备节点中,发生了切换,且原来的主节点mongo服务宕掉,且不能重新启动,检查了是不是防火墙和网路导致的,结果不是。

(2)从日志来看,报错信息如下:

部分粘贴:

{"t":{"$date":"2024-12-16T14:11:50.300+08:00"},"s":"I",  "c":"ROLLBACK", "id":21611,   "ctx":"BackgroundSync","msg":"Transition to SECONDARY"}
{"t":{"$date":"2024-12-16T14:11:50.300+08:00"},"s":"I",  "c":"REPL",     "id":21358,   "ctx":"BackgroundSync","msg":"Replica set state transition","attr":{"newState":"SECONDARY","oldState":"ROLLBACK"}}
{"t":{"$date":"2024-12-16T14:11:50.300+08:00"},"s":"I",  "c":"REPL",     "id":21106,   "ctx":"BackgroundSync","msg":"Resetting sync source to empty","attr":{"previousSyncSource":"192.168.32.217:27017"}}
{"t":{"$date":"2024-12-16T14:11:50.300+08:00"},"s":"F",  "c":"REPL",     "id":21128,   "ctx":"BackgroundSync","msg":"Rollback failed with unrecoverable error","attr":{"error":{"code":127,"codeName":"UnrecoverableRollbackError","errmsg":"not willing to roll back more than 86400 seconds of data. Have: 226356 seconds."}}}
{"t":{"$date":"2024-12-16T14:11:50.300+08:00"},"s":"F",  "c":"-",        "id":23095,   "ctx":"BackgroundSync","msg":"Fatal assertion","attr":{"msgid":50666,"error":"UnrecoverableRollbackError: not willing to roll back more than 86400 seconds of data. Have: 226356 seconds.","file":"src/mongo/db/repl/bgsync.cpp","line":807}}
{"t":{"$date":"2024-12-16T14:11:50.300+08:00"},"s":"F",  "c":"-",        "id":23096,   "ctx":"BackgroundSync","msg":"\n\n***aborting after fassert() failure\n\n"}

2.原因

发现该错误是,主备节点数据不同步的一种表现:

这个错误信息来自MongoDB的复制集(replica set)环境,具体涉及到背景同步(BackgroundSync)过程。错误指出在尝试回滚数据时遇到了问题,因为它不愿意回滚超过86400秒(即24小时)的数据,但当前需要回滚的数据量已经达到了226356秒,远远超过了限制。

(1)原因1:回滚时间过长:MongoDB复制集中的从节点(secondary)在某些情况下(如网络分区、长时间离线后重新加入等)需要回滚(rollback)以保持一致性。这里的错误表明需要回滚的时间过长,超出了MongoDB预设的安全限制。

(2)原因2:预设限制:MongoDB默认设置了最大回滚时间为24小时(86400秒),这是为了防止在极端情况下从节点与主节点(primary)之间的差异过大,导致回滚操作过于复杂和耗时,进而影响系统的稳定性和性能。

3.解决办法

解决办法1:改大回滚时间则可;但是不建议这种方法,这种方法是在实在没有其他的解决办法的情况下紧急使用一下。

解决办法2:可以将正常的mongo机器中的数据传输到宕机的那一台的存放数据文件的文件夹中即可。再进行重启后发现集群状态正常。

各节点状态:

注意:我宕机的那一台的数据文件我也进行了备份存放到了其他的地方,万一恢复过程中有问题,需要用到的话,可以有仍有余。


http://www.ppmy.cn/ops/143207.html

相关文章

Golang学习笔记_13——数组

Golang学习笔记_10——Switch Golang学习笔记_11——指针 Golang学习笔记_12——结构体 文章目录 数组1. 定义2. 访问和修改3. 多维数组4. 计算数组长度5. 数组作为函数参数6. 遍历7. 数组的内存表示 源码 数组 Go语言中的数组是一种具有固定长度、相同类型元素的集合。数组的…

如何快速打出 0 - 9 这10个数字

如何快速打出 0 - 9 这10个数字 提出问题原因 大家可能都听说过金山打字通, 就是打字的软件, 上面只教26个字母的盲打,当我们需要按下数字键时,往往需要看键盘,这样浪费了时间和效率。盲按的话,手够不着数字键,也不能…

【电路笔记 TMS320F28335DSP】DSP项目文件说明

DSP项目文件及说明 文件夹作用说明cmd存放用于控制DSP启动或调试的命令文件。通常包含启动时的脚本文件和相关配置文件。gel存放调试所需的 GEL (General Extension Language) 脚本。GEL 脚本用于调试过程中初始化硬件和设置寄存器。gel\ccsv4专门存放与 Code Composer Studio…

Edge SCDN高效防护与智能加速解决方案

Edge SCDN解决方案,以其卓越的安全防护能力,为企业筑起了一道坚不可摧的防线。 一、DDoS攻击的精准防御 Edge SCDN能够敏锐捕捉并识别大规模的DDoS攻击流量,运用其先进的流量清洗策略,精准剔除恶意流量,确保合法用户…

Axios和Ajax的区别

1. 本质不同 Axios:是一个专门用于发送 HTTP 请求的 JavaScript 库。它基于 Promise 来处理异步操作,这使得代码在处理多个异步请求时更易于阅读和维护,并且它在浏览器和 Node.js 环境中都可以使用。Ajax:不是一个库,而…

分立器件---运算放大器关键参数

运算放大器 关键参数 1、供电电压:有单电源电压、双电源电压,双电源电压尽量两个电源都接。如图LM358B,供电电压可以是20V或者是40V和GND。 2、输入偏置电流IB:当运放输出直流电压为零时,运放两个输入端流进或者流出直流电流的平均值。同向输入端电流IB+与反向输入端电流…

【AI知识】逻辑回归介绍+ 做二分类任务的实例(代码可视化)

1. 分类的基本概念 在机器学习的有监督学习中,分类一种常见任务,它的目标是将输入数据分类到预定的类别中。具体来说: 分类任务的常见应用: 垃圾邮件分类:判断一封电子邮件是否是垃圾邮件 。 医学诊断:…

UE UMG 多级弹出菜单踩坑

多级弹出菜单 https://www.bilibili.com/video/BV1ub411J7nA 运行时添加 widget 的方法 create widget 然后 add child 到某个组件,比如 canvas 运行时修改 widget 位置的方法 set widget slot position 用起来没效果 怀疑是因为我没有传入 slot 但是暂时不知…