千家信息网

MongoDB诡异问题:sh.stopBalancer卡住

发表于:2025-02-14 作者:千家信息网编辑
千家信息网最后更新 2025年02月14日,MongoDB诡异问题:sh.stopBalancer卡住背景Part1:写在最前我们在使用MongoDB sharding集群时,会使用如下命令来管理启停Balancer:>sh.stopBalan
千家信息网最后更新 2025年02月14日MongoDB诡异问题:sh.stopBalancer卡住

MongoDB诡异问题:sh.stopBalancer卡住


背景


Part1:写在最前

我们在使用MongoDB sharding集群时,会使用如下命令来管理启停Balancer:

>sh.stopBalancer()  停止Balancer>sh.startBalancer() 开启Balancer


Part2:背景

开启balancer后,客户反馈前端应用写入缓慢,查询超时。因此我们尝试关闭balancer,来避免chunk迁移对集群性能带来的影响。

但是在调用sh.stopBalancer的时候,发现却停不下来,sh.stopBalancer会处于卡住的状态:

mongos>sh.stopBalancer()Waiting for active hosts...Waiting for the balancer lock...assert.soon failed,msg:Waited too long for lock balancer to unlockdoassert@src/mongo/shell/assert.js:18:14assert.soon@src/mongo/shell/assert.js:202:13sh.waitForDLock@src/mongo/shell/utils_sh.js:198:1sh.waitForBalancerOff@src/mongo/shell/utils_sh.js:264:9sh.waitForBalancer@src/mongo/shell/utils_sh.js:294:9sh.stopBalancer@src/mongo/shell/utils_sh.js:161:5@(shell):1:1Balancer still may be active, you must manually verify this is not the case using theconfig.changelog collection.2018-02-11T16:28:29.753+0800E QUERY    [thread1] Error: Error:assert.soon failed, msg:Waited too long for lock balancer to unlock :sh.waitForBalancerOff@src/mongo/shell/utils_sh.js:268:15sh.waitForBalancer@src/mongo/shell/utils_sh.js:294:9sh.stopBalancer@src/mongo/shell/utils_sh.js:161:5@(shell):1:1

从上述报错能够看出,是由于目前balancer正在运行导致的,


Warning:3.4版本中,balancer运行在config server 的主节点上,在早期的版本中,balancer是运行在mongos上的 balancer进程处于活动状态时,config server副本集的主服务器通过修改config数据库的lock集合中的文档来获取"平衡器锁"。 这个"平衡器锁"只能自己主动释放。



Part3:排查方法

我们调用sh.status()命令能够看到当前balancer已经关闭了,但是running还是yes,这说明有迁移正在运行。   balancer:Currently enabled:  noCurrently running:  yes 我们查看发现migrations集合下为空,说明没有集合在迁移mongos> db.migrations.find()我们查看locks集合下的信息,处于2状态的说明正持有锁mongos> db.locks.find(){ "_id" : "balancer", "state" : 2, "ts" : ObjectId("5a324c42329457086086da07"), "who" : "ConfigServer:Balancer", "process" : "ConfigServer", "when" : ISODate("2018-01-31T08:33:43.346Z"), "why" : "CSRS Balancer" }

Warning:

locks集合中的why列告诉我们持有锁的原因,如果有正在迁移的文档,其状态应该是2,why中的原因会显示Migrating chunk(s) in collection db.collationname.

从3.4版本起,balancer的状态字段将始终为值2,以防止老版本的mongos实例执行平衡操作。 when字段指config server 成员成为主节点的时间。

解决办法


Part1:写在最前

sh.stopBalancer停不下来,常见的可能原因有以下几个:

  1. 正在做chunk迁移,必须等待chunk迁移完成后,才能够正常停止;

  2. 后端的server时间不同步;

  3. mongo客户端版本低于server端,本文就是第3种情况。mongo客户端的版本是3.2版本,config server和mongod都是3.4版本的mongo。



Part2:解决办法

替换老版本的mongo客户端,使用3.4版本的客户端

mongos> sh.stopBalancer(){ "ok" : 1 } config:PRIMARY> db.version()3.4.9-2.9


Part3:原因分析

卡住的原因是由于客户端mongo是3.2版本,而config节点是3.4版本,3.2版本的mongos在执行stopBalancer()时,stopBalancer代码假定如果balancerStop命令没有找到,那么它会使用旧版本的逻辑,等待锁被释放。从3.4版本起,Balance进程从mongos移动之configer server的primary节点上。


--总结--

通过这个案例,我们能够了解到mongo客户端版本带来的问题,以及有哪些常见原因导致sh.stopBalancer停不下来。由于笔者的水平有限,编写时间也很仓促,文中难免会出现一些错误或者不准确的地方,不妥之处恳请读者批评指正。喜欢笔者的文章,右上角点一波关注,谢谢~


版本 客户 原因 客户端 状态 正在 节点 运行 命令 时间 问题 办法 字段 常见 文档 端的 笔者 背景 进程 集群 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 目前软件开发有哪些岗位 兰州大学网络安全宣传周在哪里 马江波 网络安全 安全生产监测数据库 西安手机软件开发多少钱 合约量化机器人软件开发定制 工程管理软件开发价格 崇明区智能软件开发费用是多少 网络安全工程师年薪五百万 宁夏网络安全和信息化会议 上海熙邻网络技术怎么样 数据库数据抽取技术 什么叫做网络安全专业 软件开发测试环境账号 大数据背后的网络安全 重庆dns的服务器地址云空间 软件开发需要用的哪些数学知识 数据库书记 梦幻西游无情团队是在哪个服务器 ftp服务器中怎么看图片 苏康码网络服务器超时怎么解决 玖富普惠金融信息基础数据库 网络安全课程大全 为什么打不开服务器管理器 株洲软件开发课程 瓶窑镇网络安全自查工作小结 mysql数据库有dual表吗 云数据库哪个最安全 应用在数据库中的必需技术 软件开发什么证书比较好
0