Management 分片集群平衡器
在本页面
在版本 3.4 中进行了更改:平衡器进程已从mongos实例移至配置服务器副本集的主要成员。
此页面描述了与平衡有关的常见 Management 过程。有关平衡的介绍,请参见分片集群平衡器。有关平衡的下层信息,请参见Cluster Balancer。
检查平衡器状态
sh.getBalancerState()检查是否启用了平衡器(即允许平衡器运行)。 sh.getBalancerState()不检查平衡器是否正在主动平衡块。
要查看sharded cluster中是否启用了平衡器,请发出以下命令,该命令返回一个布尔值:
sh.getBalancerState()
3.0.0 版的新增功能:您还可以查看是否使用sh.status()启用了平衡器。 currently-enabled字段指示是否启用了平衡器,而currently-running字段指示当前是否正在运行平衡器。
检查 Balancer 是否正在运行
要查看您的cluster中的均衡器进程是否处于活动状态:
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 } })
禁用平衡器
默认情况下,平衡器可以随时运行,并且仅根据需要移动块。要在短时间内禁用平衡器并防止所有迁移,请使用以下过程:
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 中,发出:
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;
此操作将返回空错误true
,false
或无输出:
-
空错误表示集合名称空间不正确。
-
如果结果为
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 database的settings集合中的_secondaryThrottle
值。例如,从连接到mongos的mongoShell 程序中,发出以下命令:
use config
db.settings.update(
{ "_id" : "balancer" },
{ $set : { "_secondaryThrottle" : { "w": "majority" } } },
{ upsert : true }
)
更改_secondaryThrottle
设置可能不会立即生效。为了确保立即生效,请停止并重新启动平衡器以启用所选值_secondaryThrottle
。
有关在块迁移的各个步骤期间复制行为的更多信息,请参见块迁移和复制。
对于moveChunk命令,可以使用命令的_secondaryThrottle
和writeConcern
选项指定命令执行期间的行为。有关详细信息,请参见moveChunk命令。
await 删除
平衡器的_waitForDelete
设置和moveChunk命令会影响平衡器如何从分片迁移多个块。默认情况下,平衡器在开始下一个块迁移之前不 await 正在进行的迁移的删除阶段完成。要使删除阶段 block 开始下一个块迁移,可以将_waitForDelete
设置为 true。
有关块迁移的详细信息,请参见Chunk Migration。有关块迁移排队行为的详细信息,请参见异步块迁移清理。
_waitForDelete
通常用于内部测试。要更改平衡器的_waitForDelete
值,请执行以下操作:
-
连接到mongos实例。
-
更新config database的settings集合中的
_waitForDelete
值。例如:
use config
db.settings.update(
{ "_id" : "balancer" },
{ $set : { "_waitForDelete" : true } },
{ upsert : true }
)
设置为true
后,将恢复为默认行为:
-
连接到mongos实例。
-
更新或取消设置config database的settings集合中的
_waitForDelete
字段:
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 大小,包括local
和admin
数据库。
默认情况下,未指定maxSize
,从而允许分片在必要时消耗其计算机上的可用空间总量。
您还可以在添加分片时设置maxSize
。
要在添加分片时设置maxSize
,请将addShard命令的maxSize
参数设置为megabytes
中的最大大小。在mongo shell 中运行的以下命令将添加最大大小为 125 MB 的碎片:
config = db.getSiblingDB("config")
config.runCommand( { addshard : "example.net:34008", maxSize : 125 } )