Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

管理分片集群负载均衡器

在此页面上

  • 检查负载均衡器状态
  • 检查负载均衡器是否正在运行
  • 配置默认数据段大小
  • 安排均衡窗口
  • 移除负载均衡窗口时间表
  • 禁用负载均衡器
  • 启用负载均衡器
  • 在备份期间禁用负载均衡
  • 对集合禁用负载均衡
  • 对集合启用负载均衡
  • 确认负载均衡功能是已启用还是已禁用
  • 更改数据段迁移的复制行为
  • 更改给定分区的最大存储大小

在版本3.4中进行了更改: 负载均衡器进程已从 mongos实例移至配置服务器副本集的主节点 (primary node in the replica set)成员。

本页介绍与负载均衡相关的常见管理过程。 有关负载均衡的介绍,请参阅分片集群负载均衡器。 有关负载均衡的基础信息,请参阅集群负载均衡器。

sh.getBalancerState()检查负载均衡器是否已启用(即允许负载均衡器运行)。 sh.getBalancerState()不会检查负载均衡器是否正在主动均衡数据段。

如要查看您的分片集群中是否已启用负载均衡器,请运行以下命令(会返回一个布尔值):

sh.getBalancerState()

您还可以使用 sh.status() 查看负载均衡器是否已启用。currently-enabled 字段指示负载均衡器是否已启用,而 currently-running 字段指示负载均衡器当前是否正在运行。

要查看集群中的负载均衡器进程是否处于活动状态:

  1. 使用 连接到集群中的任何mongosmongoshell

  2. 使用以下操作来确定负载均衡器是否正在运行:

    sh.isBalancerRunning()

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

更改默认数据块大小会影响迁移和自动分割期间处理的数据块,但不会追溯影响所有数据块。

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

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

1

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

2

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

use config
3

负载均衡器在 stopped 状态下不会激活。要确保负载均衡器未处于 stopped 状态,请使用 sh.startBalancer(),如下所示:

sh.startBalancer()

如果您处于 activeWindow 时间范围之外,负载均衡器则不会启动。

从 MongoDB 4.2 开始, sh.startBalancer()还为分片集群启用自动分割。

4

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

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

<start-time><end-time> 替换为采用两位数小时与分钟值的时间值(即 HH:MM),从而指定负载均衡窗口的开始与结束边界。

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

  • 对于 MM 值,请使用从 0059(含)的分钟值。

对于本地或自管理分片集群,MongoDB 会计算开始与停止时间(相对于配置服务器副本集中主要成员的时区)。

对于 Atlas 集群,MongoDB 会评估相对于 UTC 时区的开始和停止时间。

注意

负载均衡器窗口必须足以完成当天所插入全部数据的迁移。

由于数据插入速率可能会因活动和使用模式而变化,因此请务必确保您选择的负载均衡窗口足以支持您的部署需求。

如果您已设置负载均衡窗口且希望删除时间表以使负载均衡器始终处于运行状态,则请使用 $unset 清除 activeWindow,如下所示:

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

重要

长时间禁用负载负载均衡器可能会导致分片失衡,从而降低集群性能。 仅在必要时禁用负载均衡器,并确保在维护完成后重新启用负载均衡器。

默认情况下,负载均衡器可随时运行,且仅按需移动数据段。要在一小短时间内禁用负载均衡器并阻止所有迁移,请执行以下过程:

  1. 使用 连接到集群中的任何mongosmongoshell

  2. 发出以下操作以禁用负载均衡器:

    sh.stopBalancer()

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

    从 MongoDB 4.2 开始, sh.stopBalancer()还禁用分片集群的自动分割。

  3. 要确保负载均衡器不会启动,请运行以下命令。如果负载均衡器已被禁用,此命令则会返回 false

    sh.getBalancerState()

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

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

注意

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

db.adminCommand( { balancerStop: 1 } )

如果已禁用负载均衡器并准备重新启用它,请执行以下过程:

  1. 使用 连接到集群中的任何mongosmongoshell

  2. 发出以下操作之一以启用负载均衡器:

    mongo shell中,发出:

    sh.startBalancer()

    注意

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

    db.adminCommand( { balancerStart: 1 } )

    从 MongoDB 4.2 开始, sh.startBalancer()还为分片集群启用自动分割。

注意

仅当手动进行备份时才需禁用负载均衡器,具体方法是调用 mongodump 或安排会在特定时间调用 mongodump 的任务。

使用协调式备份与恢复流程时,不必禁用负载均衡器:

如果 MongoDB 在备份期间迁移数据段,则最后可能导致不一致的分片集群快照。切勿在负载均衡器处于活动状态时运行备份。要确保负载均衡器在备份操作期间处于非活动状态,请执行以下操作:

如果在某一负载均衡回合中关闭负载均衡器,则不会立即将其关闭。负载均衡器会先完成进行中的数据段移动,然后再停止所有后续负载均衡回合。

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

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

备份过程完成后,您可以重新激活负载均衡器进程。

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

对集合禁用负载均衡时,MongoDB 不会中断进行中的迁移。

要禁用集合上的负载均衡,请使用mongos mongoshell 连接到sh.disableBalancing() 并调用 方法。

例如:

sh.disableBalancing("students.grades")

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

您可以使用 sh.enableBalancing() 方法为特定集合启用负载均衡。

为集合启用负载均衡后,MongoDB 不会立即开始对数据进行负载均衡。但是,如果分片集合中的数据未进行负载均衡,MongoDB 可以开始更均匀地分发该数据。

要启用集合负载均衡,请使用mongos 连接到mongoshell 并调用sh.enableBalancing() 方法。

例如:

sh.enableBalancing("students.grades")

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

要确认是启用还是禁用了集合负载均衡,请在 config 数据库中查询 collections 集合以获取集合命名空间,然后检查 noBalance 字段。例如:

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

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

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

  • 如果结果为 true,负载均衡则已禁用。

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

  • 如果该操作没有返回输出,则当前已启用负载均衡,并且该集合过去从未禁用过负载均衡。该集合的均衡状态将在负载均衡器下次运行时开始。

您还可使用 sh.status() 来查看负载均衡器是否已启用。currently-enabled 字段可表明负载均衡器是否已启用。

在数据块迁移过程中,_secondaryThrottle 值决定何时继续迁移数据块内的下一个文档。

config.settings 集合中:

  • 如果将负载均衡器的 _secondaryThrottle 设置设为写关注,则数据块迁移期间的每次文档移动均须收到所需的确认,然后才能继续处理下一个文档。

  • 如果未进行 _secondaryThrottle 设置,迁移过程不会等待复制到从节点,而是继续处理下一个文档。

    这是 WiredTiger 的默认行为。

要更改_secondaryThrottle 设置,请连接到mongos 实例并直接更新_secondaryThrottle settings配置数据库 的 集合中的 值。例如,从连接到mongoshell 的mongos 中发出以下命令:

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

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

有关数据数据块迁移各个步骤中复制行为的更多信息,请参阅数据段迁移和复制。

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

负载均衡器的_waitForDelete设置和moveChunk命令会影响负载均衡器从分片迁移多个数据段的方式。 默认情况下,负载均衡器不会等待正在进行的迁移的删除阶段完成就开始下一个数据段迁移。 要让删除阶段阻止下一个数据段迁移开始,可以将_waitForDelete设置为 true。

有关数据数据块迁移的详细信息,请参阅数据段迁移。 有关数据数据块迁移队列行为的详细信息,请参阅异步数据段迁移清理。

_waitForDelete 通常用于内部测试。要更改负载均衡器的 _waitForDelete 值:

  1. 连接到 mongos 实例。

  2. 更新配置数据库settings 集合中的 _waitForDelete 值。例如:

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

设为 true 后,要恢复为默认行为,请执行以下操作:

  1. 连接到 mongos 实例。

  2. 更新或取消设置配置数据库settings 集合中的 _waitForDelete 字段:

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

默认,如果数据段中的数据块数量大于1.3数据块(配置的数据段数据块除以平均文档大小所得结果),则MongoDB无法移动该数据段。

通过将负载均衡器设置 attemptToBalanceJumboChunks 指定为 true,负载均衡器可以迁移这些大范围,但前提是它们没有被标记为 jumbo。

要设立负载均衡器的attemptToBalanceJumboChunks设置,请连接到mongos实例并直接更新config.settings集合。 示例,从连接到mongoshell mongos实例的 中发出以下命令:

db.getSiblingDB("config").settings.updateOne(
{ _id: "balancer" },
{ $set: { attemptToBalanceJumboChunks : true } },
{ upsert: true }
)

如果要移动的数据段标记为jumbo ,您可以手动清除 jumbo 标志,让负载均衡器尝试迁移该数据段。

或者,您可以使用带有moveChunk forceJumbo: true 的 命令来手动迁移超过大小限制的数据段(带或不带jumbo 标签)。但是,当您使用moveChunk forceJumbo: true 运行 时,对集合的写入操作可能会在迁移期间长时间阻塞。

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

shards配置数据库 中的 collection 存储与分片相关的配置数据。

{ "_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 } } )

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

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

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

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

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

后退

平衡器