在分片群集中合并块

在本页面

Overview

在版本 3.0 中更改。

mergeChunks命令允许您将同一分片上的连续块合并为一个块。本教程说明了如何合并分片群集中的相邻块。

Procedure

Note

此过程中的示例在test database中使用members collection,并将username字段用作shard key

识别块范围

mongo shell 中,通过以下操作确定chunk范围:

sh.status()

在输出中,块范围出现在每个分片集合的块计数之后,如以下示例所示:

--- Sharding Status ---
  sharding version: {
     "_id" : 1,
     "minCompatibleVersion" : 5,
     "currentVersion" : 6,
     "clusterId" : ObjectId("5c0e886b6602192935f35008")
  }
  shards:
        {  "_id" : "shardA",  "host" : "shardA/shardA-m1.example.net:27018,shardA-m2.example.net:27018,shardA-m3.example.net:27018",  "state" : 1 }
        {  "_id" : "shardB",  "host" : "shardB/shardB-m1.example.net:27018,shardB-m2.example.net:27018,shardB-m3.example.net:27018",  "state" : 1 }
  active mongoses:
        "3.6.8" : 1
  autosplit:
        Currently enabled: yes
  balancer:
        Currently enabled:  yes
        Currently running:  no
        Failed balancer rounds in last 5 attempts:  0
        Migration Results for the last 24 hours:
                7 : Success
  databases:
        {  "_id" : "config",  "primary" : "config",  "partitioned" : true }
             config.system.sessions
                  shard key: { "_id" : 1 }
                  unique: false
                  balancing: true
                  chunks:
                          shardA   1
                  { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : shardA Timestamp(1, 0)
        {  "_id" : "test",  "primary" : "shardA",  "partitioned" : true }
             test.members
                  shard key: { "username" : 1 }
                  unique: false
                  balancing: true
                  chunks:
                          shardA   7
                          shardB   7
                  { "username" : { "$minKey" : 1 } } -->> { "username" : "user16643" } on : shardB Timestamp(2, 0)
                  { "username" : "user16643" } -->> { "username" : "user2329" } on : shardB Timestamp(3, 0)
                  { "username" : "user2329" } -->> { "username" : "user29937" } on : shardB Timestamp(4, 0)
                  { "username" : "user29937" } -->> { "username" : "user36583" } on : shardB Timestamp(5, 0)
                  { "username" : "user36583" } -->> { "username" : "user43229" } on : shardB Timestamp(6, 0)
                  { "username" : "user43229" } -->> { "username" : "user49877" } on : shardB Timestamp(7, 0)
                  { "username" : "user49877" } -->> { "username" : "user56522" } on : shardB Timestamp(8, 0)
                  { "username" : "user56522" } -->> { "username" : "user63169" } on : shardA Timestamp(8, 1)
                  { "username" : "user63169" } -->> { "username" : "user69816" } on : shardA Timestamp(1, 17)
                  { "username" : "user69816" } -->> { "username" : "user76462" } on : shardA Timestamp(1, 19)
                  { "username" : "user76462" } -->> { "username" : "user83108" } on : shardA Timestamp(1, 21)
                  { "username" : "user83108" } -->> { "username" : "user89756" } on : shardA Timestamp(1, 23)
                  { "username" : "user89756" } -->> { "username" : "user96401" } on : shardA Timestamp(1, 25)
                  { "username" : "user96401" } -->> { "username" : { "$maxKey" : 1 } } on : shardA Timestamp(1, 26)

在每个分片集合的块计数之后,将出现块范围。例如,以下是test.members集合的块范围:

{ "username" : { "$minKey" : 1 } } -->> { "username" : "user16643" } on : shardB Timestamp(2, 0)
{ "username" : "user16643" } -->> { "username" : "user2329" } on : shardB Timestamp(3, 0)
{ "username" : "user2329" } -->> { "username" : "user29937" } on : shardB Timestamp(4, 0)
{ "username" : "user29937" } -->> { "username" : "user36583" } on : shardB Timestamp(5, 0)
{ "username" : "user36583" } -->> { "username" : "user43229" } on : shardB Timestamp(6, 0)
{ "username" : "user43229" } -->> { "username" : "user49877" } on : shardB Timestamp(7, 0)
{ "username" : "user49877" } -->> { "username" : "user56522" } on : shardB Timestamp(8, 0)
{ "username" : "user56522" } -->> { "username" : "user63169" } on : shardA Timestamp(8, 1)
{ "username" : "user63169" } -->> { "username" : "user69816" } on : shardA Timestamp(1, 17)
{ "username" : "user69816" } -->> { "username" : "user76462" } on : shardA Timestamp(1, 19)
{ "username" : "user76462" } -->> { "username" : "user83108" } on : shardA Timestamp(1, 21)
{ "username" : "user83108" } -->> { "username" : "user89756" } on : shardA Timestamp(1, 23)
{ "username" : "user89756" } -->> { "username" : "user96401" } on : shardA Timestamp(1, 25)
{ "username" : "user96401" } -->> { "username" : { "$maxKey" : 1 } } on : shardA Timestamp(1, 26)

Merge Chunks

将连续的chunks合并到同一分片上。

例如,考虑shardA上的以下块范围:

Note

要合并的块突出显示。

{ "username" : "user56522" } -->> { "username" : "user63169" } on : shardA Timestamp(8, 1)
{ "username" : "user63169" } -->> { "username" : "user69816" } on : shardA Timestamp(1, 17)
{ "username" : "user69816" } -->> { "username" : "user76462" } on : shardA Timestamp(1, 19)
{ "username" : "user76462" } -->> { "username" : "user83108" } on : shardA Timestamp(1, 21)
{ "username" : "user83108" } -->> { "username" : "user89756" } on : shardA Timestamp(1, 23)
{ "username" : "user89756" } -->> { "username" : "user96401" } on : shardA Timestamp(1, 25)
{ "username" : "user96401" } -->> { "username" : { "$maxKey" : 1 } } on : shardA Timestamp(1, 26)

要合并突出显示的连续块,请对admin数据库发出mergeChunks命令:

db.adminCommand( {
   mergeChunks: "test.members",
   bounds: [ { "username" : "user69816" },
             { "username" : "user96401" } ]
} )

成功后,mergeChunks产生以下输出:

{
   "ok" : 1,
   "operationTime" : Timestamp(1544636362, 12),
   "$clusterTime" : {
      "clusterTime" : Timestamp(1544636362, 13),
      "signature" : {
         "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
         "keyId" : NumberLong(0)
      }
   }
}

在任何失败情况下,mergeChunks都会返回一个文档,其中ok字段的值为0

查看合并的块范围

合并标识的块之后,请确认新的块,如下所示:

sh.status()

sh.status()的输出应类似于:

--- Sharding Status ---
  sharding version: {
     "_id" : 1,
     "minCompatibleVersion" : 5,
     "currentVersion" : 6,
     "clusterId" : ObjectId("5c0e886b6602192935f35008")
  }
  shards:
        {  "_id" : "shardA",  "host" : "shardA/shardA-m1.example.net:27018,shardA-m2.example.net:27018,shardA-m3.example.net:27018",  "state" : 1 }
        {  "_id" : "shardB",  "host" : "shardB/shardB-m1.example.net:27018,shardB-m2.example.net:27018,shardB-m3.example.net:27018",  "state" : 1 }
  active mongoses:
        "3.6.8" : 1
  autosplit:
        Currently enabled: yes
  balancer:
        Currently enabled:  yes
        Currently running:  no
        Failed balancer rounds in last 5 attempts:  0
        Migration Results for the last 24 hours:
                8 : Success
  databases:
        {  "_id" : "config",  "primary" : "config",  "partitioned" : true }
             config.system.sessions
                  shard key: { "_id" : 1 }
                  unique: false
                  balancing: true
                  chunks:
                          shardA   1
                  { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : shardA Timestamp(1, 0)
        {  "_id" : "test",  "primary" : "shardA",  "partitioned" : true }
             test.members
                  shard key: { "username" : 1 }
                  unique: false
                  balancing: true
                  chunks:
                          shardA   5
                          shardB   6
                  { "username" : { "$minKey" : 1 } } -->> { "username" : "user16643" } on : shardA Timestamp(9, 0)
                  { "username" : "user16643" } -->> { "username" : "user2329" } on : shardB Timestamp(9, 1)
                  { "username" : "user2329" } -->> { "username" : "user29937" } on : shardB Timestamp(4, 0)
                  { "username" : "user29937" } -->> { "username" : "user36583" } on : shardB Timestamp(5, 0)
                  { "username" : "user36583" } -->> { "username" : "user43229" } on : shardB Timestamp(6, 0)
                  { "username" : "user43229" } -->> { "username" : "user49877" } on : shardB Timestamp(7, 0)
                  { "username" : "user49877" } -->> { "username" : "user56522" } on : shardB Timestamp(8, 0)
                  { "username" : "user56522" } -->> { "username" : "user63169" } on : shardA Timestamp(8, 1)
                  { "username" : "user63169" } -->> { "username" : "user69816" } on : shardA Timestamp(1, 17)
                  { "username" : "user69816" } -->> { "username" : "user96401" } on : shardA Timestamp(8, 2)
                  { "username" : "user96401" } -->> { "username" : { "$maxKey" : 1 } } on : shardA Timestamp(1, 26)

合并之后,balancer可以跨碎片迁移块,以确保块的分布更加均匀。

首页