文档菜单
文档首页
/
MongoDB 手册
/ /

管理分片集群均衡器

本页内容

  • 检查均衡器状态
  • 检查均衡器是否正在运行
  • 配置默认范围大小
  • 安排均衡窗口
  • 检查均衡窗口
  • 移除均衡窗口安排
  • 禁用均衡器
  • 启用均衡器
  • 备份期间禁用均衡
  • 在集合上禁用均衡
  • 在集合上启用均衡
  • 确认均衡器是否启用或禁用
  • 更改块迁移的复制行为
  • 更改特定分片的最大存储大小

已更改在版本中6.1.

本页介绍了与均衡相关的常见管理程序。有关均衡的介绍,请参阅分片集群均衡器。有关均衡的更低层次信息,请参阅 均衡器内部。

均衡器进程已从 mongos 实例移动到配置服务器副本集的主成员。

sh.getBalancerState() 检查均衡器是否启用(即均衡器是否被允许运行)。sh.getBalancerState() 不检查均衡器是否正在迁移数据。

要查看您的 分片集群 中是否启用了均衡器,请运行以下命令,该命令返回一个布尔值

sh.getBalancerState()

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

要查看您的集群中均衡器进程是否活跃:

  1. 使用mongosh

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

    sh.isBalancerRunning()

分片集群的默认范围大小为128兆字节。在大多数情况下,默认大小适用于分割和迁移数据块。有关范围大小如何影响部署的信息,请参阅范围大小。

更改默认范围大小会影响迁移和自动分割过程中处理的范围,但不会对所有范围产生追溯影响。

从MongoDB 6.0.3版本开始,不再执行自动分割数据块。这是由于均衡策略的改进。自动分割命令仍然存在,但不执行任何操作。

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

在某些情况下,尤其是当你的数据集缓慢增长且迁移可能会影响性能时,确保平衡器只在特定时间激活是有用的。默认情况下,平衡器进程始终启用并迁移块。以下过程指定了 activeWindow,这是平衡器可以迁移块的时段。

1

您可以通过任何集群中的 mongos 连接。

2

执行以下命令以切换到配置数据库。

use config
3

均衡器在停止状态下不会激活。为确保均衡器没有停止,请使用如下所示的sh.startBalancer()

sh.startBalancer()

如果您不在activeWindow时间段内,均衡器不会启动。

从MongoDB 6.0.3版本开始,不再执行自动分割数据块。这是由于均衡策略的改进。自动分割命令仍然存在,但不执行任何操作。

在MongoDB 6.0.3之前的版本中,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值,请使用从0023的小时值。

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

对于本地或自管理的分片集群,MongoDB将开始和停止时间相对于配置服务器副本集中的主成员时区进行评估。

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

注意

均衡窗口必须足够大,以便完成当天插入的所有数据的迁移。

由于数据插入率可能会根据活动和用法模式而变化,因此确保所选的均衡窗口将能够满足您的部署需求非常重要。

要查看当前均衡窗口,请运行以下命令

use config
db.settings.find( { _id: "balancer" } )

如果您已经设置了均衡窗口并希望删除计划,以便均衡器始终运行,请使用$unset来清除activeWindow,如下所示

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

重要

长时间禁用均衡器可能会导致碎片不均衡,这会降低集群性能。仅在必要时禁用均衡器,并在维护完成后确保您重新启用均衡器

默认情况下,均衡器可以在任何时候运行,并且仅在需要时移动数据块。要暂时禁用均衡器并防止所有迁移,请使用以下程序

  1. 使用mongos集群中的任意一个mongosh shell连接。

  2. 执行以下操作以禁用均衡器

    sh.stopBalancer()

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

    从MongoDB 6.0.3版本开始,不再执行自动分割数据块。这是由于均衡策略的改进。自动分割命令仍然存在,但不执行任何操作。

    在MongoDB 6.0.3之前的版本中,sh.stopBalancer()还会禁用分片集群的自动拆分。

  3. 要验证均衡器不会启动,请运行以下命令,如果均衡器已禁用,则返回false

    sh.getBalancerState()

    可选地,为了验证禁用后没有正在进行的迁移,请在mongosh shell中执行以下操作

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

注意

要使用驱动程序禁用均衡器,请在admin数据库上使用balancerStop命令,如下所示

db.adminCommand( { balancerStop: 1 } )

如果您已禁用均衡器并准备好重新启用它,请使用此程序

  1. 使用mongos集群中的任意一个mongosh shell连接。

  2. 执行以下任一操作以启用均衡器

    mongosh shell中,执行

    sh.startBalancer()

    注意

    要使用驱动程序启用均衡器,请在admin数据库上使用balancerStart命令,如下所示

    db.adminCommand( { balancerStart: 1 } )

    从MongoDB 6.0.3版本开始,不再执行自动分割数据块。这是由于均衡策略的改进。自动分割命令仍然存在,但不执行任何操作。

    在MongoDB 6.0.3之前的版本中,sh.startBalancer()还启用了分片集群的自动拆分。

注意

只有在手动备份时才需要禁用均衡器,无论是通过调用mongodump还是通过安排在特定时间调用mongodump的任务。

在使用协同备份和恢复过程时,您无需禁用均衡器

如果在备份期间MongoDB迁移了一个数据块,您可能会得到一个不一致的分片集群快照。在均衡器活动时,永远不要运行备份。为确保在备份操作期间均衡器处于非活动状态

  • 设置均衡窗口,使均衡器在备份期间处于非活动状态。确保在禁用均衡器的情况下备份可以完成。

  • 手动禁用均衡器以备份过程的时间。

如果均衡器在均衡轮次中间关闭,关闭操作不是瞬时的。均衡器完成正在进行的块移动,然后停止所有进一步的均衡轮次。

在开始备份操作之前,请确认均衡器不是活动的。您可以使用以下命令来确定均衡器是否活动

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

当备份过程完成时,您可以重新激活均衡器过程。

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

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

要禁用集合上的均衡,使用mongosmongosh shell,并调用sh.disableBalancing()方法。

例如

sh.disableBalancing("students.grades")

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

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

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

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

例如

sh.enableBalancing("students.grades")

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

要确认集合的均衡是否启用或禁用,请在 config 数据库中查询 collections 集合以获取集合的 命名空间,并检查 noBalance 字段。例如

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

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

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

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

  • 如果结果为 false,则当前均衡已启用但以前已为该集合禁用。下一次均衡器运行时将开始此集合的均衡。

  • 如果操作没有返回输出,当前集合已启用均衡且从未被禁用。下一次均衡器运行时,将开始此集合的均衡。

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

在数据块迁移期间,_secondaryThrottle 值决定了何时迁移到数据块中的下一个文档。

config.settings 集合中

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

  • 如果未设置 _secondaryThrottle 设置,迁移过程不会等待复制到二级,而是继续下一个文档。

    这是 WiredTiger 的默认行为。

要更改 _secondaryThrottle 设置,请连接到 mongos 实例,并直接更新 settings 集合中的 _secondaryThrottle 值。例如,从连接到 mongosh 的 shell 中运行以下命令:

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

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

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

  • 使用 moveRange 命令的 secondaryThrottlewriteConcern 选项来指定命令执行期间的行为。

  • 使用 moveChunk 命令的 _secondaryThrottlewriteConcern 选项来指定命令执行期间的行为。

有关详细信息,请参阅moveRangemoveChunk

平衡器的 _waitForDelete 设置和 moveChunk 命令会影响平衡器如何从分片迁移多个块。同样,平衡器的 _waitForDelete 设置和 moveRange 命令也会影响平衡器如何从分片迁移多个块。默认情况下,平衡器在开始下一个块迁移之前不会等待正在进行的迁移的删除阶段完成。要使删除阶段 阻止 下一个块迁移的开始,可以将 _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" : "" } }
    )

默认情况下,MongoDB无法移动范围,如果该范围内的文档数大于将配置的范围大小除以平均文档大小的结果的两倍。

通过将均衡器设置attemptToBalanceJumboChunks设置为true,只要这些大型范围没有被标记为巨型,均衡器就可以迁移这些大型范围。

要设置均衡器的attemptToBalanceJumboChunks设置,请连接到mongos实例并直接更新config.settings集合。例如,从连接到mongosh的shell中,运行以下命令

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

如果您想要移动的范围被标记为巨型,您可以手动清除巨型标记,以便均衡器尝试迁移范围。

您还可以使用以下任一方式手动迁移超出大小限制的区间(无论是否带有 jumbo 标签):

然而,当您使用 forceJumbo: true 运行 moveRangemoveChunk 时,在迁移过程中可能会长时间阻塞对集合的写操作。

注意

更改分片的最大存储大小已被弃用。MongoDB 使用 WiredTiger 存储引擎来管理数据的存储方式。WiredTiger 通过压缩数据来最小化存储使用。有关更多信息,请参阅 压缩。

对于 MongoDB 6.1 及更早版本,您仍然可以通过使用 maxSize 字段来设置分片在分片集群中的最大存储大小。您可以在 config.shards 集合中找到有关分片的相关配置数据。

从版本 6.2 开始,MongoDB 从 addShard 命令中删除了 maxSize 字段。

  • 因此,使用带有 maxSize 字段的 addShard 运行会返回一个 InvalidOptions 错误。

  • shards 集合中创建的新文档不再包含 maxSize 字段。

  • 任何现有的 maxSize 字段条目都将被忽略。

返回

平衡器