首页 > 数据库 >在 MongoDB 分片集群上检查索引的一致性

在 MongoDB 分片集群上检查索引的一致性

时间:2024-12-10 13:56:55浏览次数:3  
标签:MongoDB 分片 PRIMARY 索引 mongodb id

 

在 MongoDB 分片集群中,各分片之间索引分布不一致的情况比你想象的要常见,这是因为用户不使用 MongoS 而是直接在分片中创建索引。

 

在块迁移过程中,由于索引不匹配,系统无法在分片间传输数据,从而导致迁移失败。

 

发生这种情况时,分片日志中的典型错误信息可能如下所示:

{"t":{"$date":"2024-05-23T14:27:49.111+00:00"},"s":"I", "c":"SHARDING", "id":5087102, "ctx":"migrateThread",
"msg":"Recipient failed to copy oplog entries for retryable writes and transactions from donor","attr":
{"namespace":"test.cincomillones","migrationSessionId":"Shard_1_Shard_2_646884t4835b68a1af8781","fromShard":
"Shard_1","error":"migrate failed: CannotCreateCollection: aborting, shard is missing 1 indexes and collection 
is not empty. Non-trivial index creation should be scheduled manually"}}

该错误表明,由于一个或多个分片上的索引缺失,无法迁移块。要解决这个问题,必须确保所有分片的索引一致性。

 

检查和解决此问题的步骤:

第一步是连接到每个分片的 PRIMARY 节点,检查有问题的集合的索引。在本示例中,正如我们在日志文件中看到的,集合 test.cincomillones 存在索引不一致问题。

 

以 PRIMARY 分片为参考,检查索引在哪个分区丢失是非常重要的。

分片1:

shard1:PRIMARY> db.cincomillones.getIndexes()
[
    {
        "v": 2,
        "key": {
            "_id": 1
        },
        "name": "_id_"
    },
    {
        "v": 2,
        "key": {
            "BetID": "hashed"
        },
        "name": "BetID_hashed"
    },
    {
        "v": 2,
        "key": {
            "MasterEventId": 1
        },
        "name": "MasterEventId_1"
    }
]

分片2:

shard2:PRIMARY> db.cincomillones.getIndexes()
[
    {
        "v": 2,
        "key": {
            "_id": 1
        },
        "name": "_id_"
    },
    {
        "v": 2,
        "key": {
            "BetID": "hashed"
        },
        "name": "BetID_hashed"
    }
]

如上所示,与分片 2 相比,分片 1 多了一个索引(MasterEventId_1)。索引不匹配导致了块迁移失败。

 

要解决这个问题,我们需要在缺少索引的分片上创建缺少的索引。在这种情况下,我们将在分片 2 中添加 MasterEventId 索引:

shard2:PRIMARY> db.cincomillones.createIndex({ "MasterEventId": 1 })

创建缺失索引后,一个好的做法是验证所有分片的索引是否一致。

 

我们可以在所有分片上再次运行 getIndexes,或者使用 MongoDB 内置命令 shardedIndexConsistency 来检查。

 

你需要在 PRIMARY configServer 上运行以下命令来检查分片间的索引不一致性:

config:PRIMARY> db.serverStatus().shardedIndexConsistency

该命令将报告任何不一致,从而确保所有分片保持同步。

 

创建丢失的索引后,我们将不再看到有索引不一致:

configRepl:PRIMARY> db.serverStatus().shardedIndexConsistency

{ "numShardedCollectionsWithInconsistentIndexes" : NumberLong(0) }

 

如果运行的是 MongoDB 5.0,则可以使用聚合管道来查找分片间不一致的索引,如下所述:

https://www.mongodb.com/docs/v5.0/tutorial/manage-indexes/#find-inconsistent-indexes-across-shards

 

从 MongoDB 7.0 开始,可以使用一项新功能来检查不一致索引:

https://www.mongodb.com/docs/manual/reference/inconsistency-type/InconsistentIndex/

该方法会返回一个游标,其中包含一批文档,显示在分片元数据中发现的不一致之处,即

{
  cursor: {
     id: Long("0"),
     ns: "test.$cmd.aggregate",
     firstBatch: [
        {
           type: "InconsistentIndex",
           description: "Found an index of a sharded collection that is inconsistent between different shards",
           details: {
              namespace: "test.authors",
              info: {
                  missingFromShards: [
                     "shard-rs1"
                  ],
                  inconsistentProperties: [ ],
                  indexName: "index1"
              }
           }
        }
     ],
  },
  ok: 1
}

确保分片间的索引一致性对于 MongoDB 分片集群的顺利运行至关重要。不一致的索引可能会阻碍块迁移,从而导致潜在的停机或性能下降。

 

通过检查每个分片的索引、修复不匹配并使用所述方法验证一致性,可以保持集群平稳运行。

 

有关索引一致性检查的更多详情,请参阅 MongoDB 的官方文档:

https://www.mongodb.com/docs/v5.0/reference/command/serverStatus/#mongodb-serverstatus-serverstatus.shardedIndexConsistency

https://www.mongodb.com/docs/v5.0/tutorial/manage-indexes/#find-inconsistent-indexes-across-shards

https://www.mongodb.com/docs/manual/reference/inconsistency-type/InconsistentIndex/

标签:MongoDB,分片,PRIMARY,索引,mongodb,id
From: https://www.cnblogs.com/abclife/p/18593653

相关文章

  • MongoDB
    应用场景评论区TODO  docker部署MongoDBversion:'3'services:mongo:image:mongo:6.0.4container_name:mongoDBrestart:alwaysports:-27017:27017volumes:-/data/mongodb/data:/data/dbenvironment:MONG......
  • mongodb数据同步到hive
    背景用户需求:需要将mongodb的数据同步到hive表,共2亿+条数据,总数据量约30G查阅一些博客后,大致同步方法有以下几种手动+离线对于比较小的数据,可以先通过mongoexport将数据导出到本地json文件,再将json直接上传到hdfs,创建hive表关联到这个文件即可这种方式非......
  • 请说说JS中的索引数组、关联数组和静态数组、动态数组的定义与区别
    在JavaScript中,数组的概念比较灵活,不像一些强类型语言那样区分得那么严格。JS中的数组实际上是一种特殊的对象,既可以像索引数组一样通过数字索引访问元素,也可以像关联数组一样通过字符串键访问元素。所以,严格意义上来说,JS只有动态数组,它兼具了索引数组和关联数组的特性。而静......
  • 唯一索引、普通索引的使用场景
    假设我们有两个表t1和t2:CREATETABLEt1(idINTNOTNULLAUTO_INCREMENT,key1VARCHAR(100)PRIMARYKEY(id),KEYidx_key1(key1))Engine=InnoDBCHARSET=utf8;CREATETABLEt2(idINTNOTNULLAUTO_INCREMENT,key1VARCHAR(100......
  • Dexie.js 库 增删改查indexdb示例,游标、索引使用等
    增删改查以下是如何使用Dexie.js库进行增删改查操作的示例:1.初始化数据库首先,你需要安装Dexie.js:npminstalldexie然后,在你的代码中引入并初始化Dexie.js:importDexiefrom'dexie';constdb=newDexie('myDatabase');db.version(1).stores({myObjectStore:......
  • Mysql索引失效问题demo
    Mysql索引失效问题demo#1.准备工作CREATETABLE`user`(`id`INTNOTNULLAUTO_INCREMENT,`code`VARCHAR(20)COLLATEutf8mb4_binDEFAULTNULL,`age`INTDEFAULT'0',`name`VARCHAR(30)COLLATEutf8mb4_binDEFAULTNULL,`height`INTDEFAULT&#......
  • Linux中安装配置MongoDB
    最近在整理自己私人服务器上的各种阿猫阿狗,正好就顺手详细记录一下清理之后重装的步骤,今天先写点数据库的内容,关于在Linux中安装配置MongoDB说实话为什么会装MongoDB呢,因为之前因为公司需要做点Nodejs的中间件,我顺手玩了一下MongoDB的CRUD,文档型数据库还是挺有意思的安装环境Ce......
  • 一站式管理平台,同时支持Linux、MySQL、Redis、MongoDB可视化管理!
    最近发现一款好用的可视化管理工具mayfly-go,可以通过Web的形式进行Linux系统管理,同时支持MySQL、Redis、MongoDB等数据库的管理,功能非常强大!今天就给大家介绍下这款工具,希望对大家有所帮助!SpringBoot实战电商项目mall(50k+star)地址:https://github.com/macrozheng/mallmayfly-go......
  • 【数据库取证】MongoDB数据库现场数据固定与后续分析
    以下文章来源于万宏蜀盾科技,作者万宏蜀盾MongoDB是一款流行的开源文档型数据库,主要适用于需要高扩展性、灵活数据结构和快速读写性能的应用场景,如大数据、物联网、社交媒体、游戏数据等。正因为MongoDB是一个非关系型数据库,数据以JSON格式的文档存储。它使用类似于JSON的BSON格......
  • MongoDB 建模调优&change stream实战
    MongoDB开发规范(1)命名原则。数据库、集合命名需要简单易懂,数据库名使用小写字符,集合名称使用统一命名风格,可以统一大小写或使用驼峰式命名。数据库名和集合名称均不能超过64个字符。(2)集合设计。对少量数据的包含关系,使用嵌套模式有利于读性能和保证原子性的写入。对于复杂的......