Management 分片集群平衡器

在本页面

在版本 3.4 中进行了更改:平衡器进程已从mongos实例移至配置服务器副本集的主要成员。

此页面描述了与平衡有关的常见 Management 过程。有关平衡的介绍,请参见分片集群平衡器。有关平衡的下层信息,请参见Cluster Balancer

Important

使用与分片群集版本相对应的mongo shell 版本。例如,请勿对 3.4 分片群集使用 3.2 或更早版本的mongo shell。

检查平衡器状态

sh.getBalancerState()检查是否启用了平衡器(即允许平衡器运行)。 sh.getBalancerState()不检查平衡器是否正在主动平衡块。

要查看sharded cluster中是否启用了平衡器,请发出以下命令,该命令返回一个布尔值:

sh.getBalancerState()

3.0.0 版的新增功能:您还可以查看是否使用sh.status()启用了平衡器。 currently-enabled字段指示是否启用了平衡器,而currently-running字段指示当前是否正在运行平衡器。

检查 Balancer 是否正在运行

要查看您的cluster中的均衡器进程是否处于活动状态:

Important

使用与分片群集版本相对应的mongo shell 版本。例如,请勿对 3.4 分片群集使用 3.2 或更早版本的mongo shell。

  • 使用mongo Shell 连接到群集中的任何mongos

  • 使用以下操作确定平衡器是否正在运行:

sh.isBalancerRunning()

配置默认块大小

分片群集的默认块大小为 64 MB。在大多数情况下,默认大小适用于拆分和迁移块。有关块大小如何影响部署的信息,请参阅详细信息,请参阅Chunk Size

更改默认块大小会影响在迁移和自动拆分过程中正在处理的块,但不会 traceback 影响所有块。

要配置默认块大小,请参阅修改分片群集中的块大小

安排平衡窗口

在某些情况下,尤其是当数据集增长缓慢并且迁移会影响性能时,确保平衡器仅在特定时间处于活动状态非常有用。以下过程指定了activeWindow,这是balancer能够迁移块的时间范围:

使用 mongo shell 连接到 mongos。

您可以连接到群集中的任何mongos

切换到配置数据库。

发出以下命令以切换到配置数据库。

use config

确保平衡器没有停止。

平衡器在stopped状态下不会激活。为确保平衡器不是stopped,请使用sh.setBalancerState(),如下所示:

sh.setBalancerState( true )

如果您不在activeWindow时间范围内,则平衡器将不会启动。

修改平衡器的窗口。

使用update()设置activeWindow,如下所示:

db.settings.update(
   { _id: "balancer" },
   { $set: { activeWindow : { start : "<start-time>", stop : "<stop-time>" } } },
   { upsert: true }
)

使用两位数字的小时和分钟值(即HH:MM)将<start-time><end-time>替换为时间值,这些值指定了平衡窗口的开始和结束边界。

  • 对于HH值,请使用00-23的小时值。

  • 对于MM值,请使用00-59的分钟值。

MongoDB 评估相对于配置服务器副本集中主要成员的成员所在时区的开始和停止时间。

Note

平衡器窗口必须足以完成一天中所有插入的数据的迁移。

由于数据插入率可以根据活动和使用模式而变化,因此重要的是要确保选择的平衡窗口足以满足您的部署需求。

设置activeWindow时不要使用sh.startBalancer()方法。

删除平衡窗口时间表

如果您拥有设置平衡窗口并希望删除计划以便平衡器始终处于运行状态,请使用$unset清除activeWindow,如下所示:

use config
db.settings.update({ _id : "balancer" }, { $unset : { activeWindow : true } })

禁用平衡器

默认情况下,平衡器可以随时运行,并且仅根据需要移动块。要在短时间内禁用平衡器并防止所有迁移,请使用以下过程:

  • 使用mongo Shell 连接到群集中的任何mongos

  • 发出以下操作以禁用平衡器:

sh.stopBalancer()

如果正在进行迁移,则系统将在停止之前完成正在进行的迁移。

  • 要验证平衡器不会启动,请发出以下命令,如果禁用了平衡器,则返回false
sh.getBalancerState()

(可选)要验证禁用后是否没有正在进行的迁移,请在mongo shell 中发出以下操作:

use config
while( sh.isBalancerRunning() ) {
          print("waiting...");
          sleep(1000);
}

Note

要从驱动程序禁用平衡器,请对admin数据库使用 balancerStop 命令,如下所示:

db.adminCommand( { balancerStop: 1 } )

启用平衡器

如果您已禁用平衡器并准备重新启用它,请使用以下过程:

  • 使用mongo Shell 连接到群集中的任何mongos

  • 发出以下操作之一以启用平衡器:

mongo shell 中,发出:

sh.setBalancerState(true)

Note

要从驱动程序启用平衡器,请对admin数据库使用 balancerStart 命令,如下所示:

db.adminCommand( { balancerStart: 1 } )

在备份期间禁用平衡

如果 MongoDB 在backup期间迁移chunk,则可能会以sharded cluster的快照不一致而结束。平衡器处于活动状态时,切勿运行备份。为确保平衡器在备份操作期间处于非活动状态,请执行以下操作:

  • 设置balancing window,以使平衡器在备份期间处于非活动状态。确保禁用平衡器后,备份可以完成。

  • 手动禁用平衡器在备份过程的持续时间内。

如果您在平衡轮中途关闭平衡器,则关闭不是立即进行的。平衡器完成正在进行的块移动,然后停止所有进一步的平衡回合。

在开始备份操作之前,请确认平衡器未处于活动状态。您可以使用以下命令来确定平衡器是否处于活动状态:

!sh.getBalancerState() && !sh.isBalancerRunning()

备份过程完成后,您可以重新激活平衡器过程。

在集合上禁用平衡

您可以使用sh.disableBalancing()方法禁用特定集合的平衡。您可能想要禁用特定集合的平衡器,以支持维护操作或非典型工作负载,例如在数据提取或数据导出期间。

当您在集合上禁用平衡时,MongoDB 不会中断正在进行的迁移。

要禁用集合上的平衡,请使用mongo shell 连接到mongos并调用sh.disableBalancing()方法。

For example:

sh.disableBalancing("students.grades")

sh.disableBalancing()方法接受集合的完整namespace作为其参数。

对集合启用平衡

您可以使用sh.enableBalancing()方法启用特定集合的平衡。

当您为集合启用平衡时,MongoDB 不会立即开始平衡数据。但是,如果分片集合中的数据不平衡,MongoDB 将能够开始更均匀地分配数据。

要在集合上启用平衡,请使用mongo shell 连接到mongos并调用sh.enableBalancing()方法。

For example:

sh.enableBalancing("students.grades")

sh.enableBalancing()方法接受集合的完整namespace作为其参数。

确认启用或禁用平衡

要确认是否启用了集合平衡,请在config数据库中的collections集合中查询集合namespace并检查noBalance字段。例如:

db.getSiblingDB("config").collections.findOne({_id : "students.grades"}).noBalance;

此操作将返回空错误truefalse或无输出:

  • 空错误表示集合名称空间不正确。

  • 如果结果为true,则禁用平衡。

  • 如果结果为false,则当前已启用平衡,但过去已对该集合禁用平衡。该集合的平衡将在下一次平衡器运行时开始。

  • 如果该操作未返回任何输出,则表示当前已启用平衡,并且以前从未对此集合禁用平衡。该集合的平衡将在下一次平衡器运行时开始。

3.0.0 版的新增功能:您还可以查看是否使用sh.status()启用了平衡器。 currently-enabled字段指示是否启用了平衡器。

更改复制行为以进行块迁移

Secondary Throttle

在块迁移期间,_secondaryThrottle值确定何时对块中的下一个文档进行迁移。

config.settings集合中:

  • 如果将平衡器的_secondaryThrottle设置设置为写关注,则在 continue 下一个文档之前,块迁移期间的每个文档移动都必须收到请求的确认。

  • 如果将平衡器的_secondaryThrottle设置设置为true,则在迁移 continue 进行块中的下一个文档之前,在块迁移期间移动的每个文档都必须至少从一个辅助节点收到确认。这等效于{ w: 2 }的写入关注。

  • 如果未设置_secondaryThrottle设置,则迁移过程将不 await 复制到辅助数据库,而是 continue 下一个文档。

从 MongoDB 3.4 开始,WiredTiger的默认行为。

要更改_secondaryThrottle设置,请连接到mongos实例,然后直接更新config databasesettings集合中的_secondaryThrottle值。例如,从连接到mongosmongoShell 程序中,发出以下命令:

use config
db.settings.update(
   { "_id" : "balancer" },
   { $set : { "_secondaryThrottle" : { "w": "majority" }  } },
   { upsert : true }
)

更改_secondaryThrottle设置可能不会立即生效。为了确保立即生效,请停止并重新启动平衡器以启用所选值_secondaryThrottle

有关在块迁移的各个步骤期间复制行为的更多信息,请参见块迁移和复制

对于moveChunk命令,可以使用命令的_secondaryThrottlewriteConcern选项指定命令执行期间的行为。有关详细信息,请参见moveChunk命令。

await 删除

平衡器的_waitForDelete设置和moveChunk命令会影响平衡器如何从分片迁移多个块。默认情况下,平衡器在开始下一个块迁移之前不 await 正在进行的迁移的删除阶段完成。要使删除阶段 block 开始下一个块迁移,可以将_waitForDelete设置为 true。

有关块迁移的详细信息,请参见Chunk Migration。有关块迁移排队行为的详细信息,请参见异步块迁移清理

_waitForDelete通常用于内部测试。要更改平衡器的_waitForDelete值,请执行以下操作:

use config
db.settings.update(
   { "_id" : "balancer" },
   { $set : { "_waitForDelete" : true } },
   { upsert : true }
)

设置为true后,将恢复为默认行为:

use config
db.settings.update(
   { "_id" : "balancer", "_waitForDelete": true },
   { $unset : { "_waitForDelete" : "" } }
)

更改给定分片的最大存储大小

默认情况下,分片对存储大小没有限制。但是,您可以为分片群集中的给定分片设置最大存储大小。选择潜在的目标分片时,平衡器将忽略迁移超过配置的最大存储大小的分片。

config database中的shards集合存储与分片有关的配置数据。

{ "_id" : "shard0000", "host" : "shard1.example.com:27100" }
{ "_id" : "shard0001", "host" : "shard2.example.com:27200" }

要限制给定碎片的存储大小,请使用db.collection.updateOne()方法和$set运算符一起创建maxSize字段,并为其分配integer值。 maxSize字段表示megabytes中的分片的最大存储大小。

以下操作在1024 megabytes的分片上设置最大大小:

config = db.getSiblingDB("config")
config.shards.updateOne( { "_id" : "<shard>"}, { $set : { "maxSize" : 1024 } } )

此值包括分片上所有*数据文件的 Map 大小,包括localadmin数据库。

默认情况下,未指定maxSize,从而允许分片在必要时消耗其计算机上的可用空间总量。

您还可以在添加分片时设置maxSize

要在添加分片时设置maxSize,请将addShard命令的maxSize参数设置为megabytes中的最大大小。在mongo shell 中运行的以下命令将添加最大大小为 125 MB 的碎片:

config = db.getSiblingDB("config")
config.runCommand( { addshard : "example.net:34008", maxSize : 125 } )