前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >技术干货 | MongoDB 偶遇孤儿文档及处理方法

技术干货 | MongoDB 偶遇孤儿文档及处理方法

作者头像
MongoDB中文社区
发布2023-01-04 15:01:17
1.3K0
发布2023-01-04 15:01:17
举报
文章被收录于专栏:MongoDB中文社区MongoDB中文社区

孤儿文档的形成有 2 种原因:

① 正常的 shard 之间 chunk 均衡迁移,会产生孤儿文档,这个孤儿文档会在迁移结束后自动异步删除。

② shard 之间发生 chunk 均衡迁移的过程中,其中一些副本集发生 failover,可能会导致迁移失败,产生孤儿文档。

定位问题

使用环境:MongoDB 4.2.9 分片集群

研发反馈通过 id 查询 2 条数据,但实际返回了 3 条,并且这个 id 是唯一的,具体问题如下:

接下来,DBA 在 mongos 上查询如下结果(结果是2条):

这个结果明显和研发查询的结果不匹配,紧接着,将那 2 个 id 拿到所有分片上去查询,果然,同一个 id 出现在了 2 个 shard 上。因为这个集群之前几天由于业务不合理设计,频繁导致集群主从切换。开始怀疑孤儿文档。

db.collctionName.find().explain(true查询结果如下:

现在确定了问题所在,接下来开始清理孤儿文档。

解决问题

下面的脚本可以遍历所有集合清理,不过在使用过程中,注意避开业务高峰期。(*其中的 test111 需要换成你对应的数据库名称)。

编辑一个 JS,文件名为 cleanupOrphaned.js:

代码语言:javascript
复制
function cleanupOrphaned(coll) {
  var nextKey = { };
  var result;

  while ( nextKey != null ) {
    result = db.adminCommand( { cleanupOrphaned: coll, startingFromKey: nextKey } );

    if (result.ok != )
       print("Unable to complete at this time: failure or timeout.")

    printjson(result);

    nextKey = result.stoppedAtKey;
  }
}

var dbName = 'test111'
db = db.getSiblingDB(dbName)
db.getCollectionNames().forEach(function(collName) {
        cleanupOrphaned(dbName + "." + collName);
});

执行方法:

代码语言:javascript
复制
/opt/software/mongodb/mongodb-linux-x86_64-rhel70-4.2.18/bin/mongo --port xxxxx  -uroot -pxxxxxx  cleanupOrphaned.js 

解释说明

读写偏好对孤儿文档的读取解释:

在分片集群下,balancer 在执行 moveChuck 的过程中,如果遇到 MongoDB 实例异常,就会导致孤儿文档的形成。这个孤儿文档在使用 readpreference 配置为 secondary pre 并且 readconcern 配置为 available 的时候会遇到读取到孤儿文档。MongoDB 默认从主库读会过滤掉这部分数据,但如果从读,默认不过滤。需要将 readconcern 配置为 local 避免读到孤儿文档。

官方解释:

关于作者:

陈亮亮,MongoDB 中文社区南京分会主席,数据库架构师;曾在 UCloud 负责UDB MongoDB 的研发和运维工作,在数据库架构和调优方面有丰富的经验。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-11-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Mongoing中文社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档