Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

在副本集上创建滚动索引构建

在此页面上

  • 关于此任务
  • Considerations
  • 先决条件
  • 步骤

滚动索引构建是 默认索引构建的替代方案。

仅当您的部署符合以下情况之一时,才使用滚动索引构建:

  • 如果平均 CPU 利用率超过 (N-1)/N-10%,其中 N 是mongod可用的 CPU 线程数

  • 如果您的WiredTiger缓存填充率经常超过 90&

注意

要通过以下过程创建唯一索引,必须在此过程中停止对集合的所有写入。

如果您在执行步骤的过程中无法停止所有对集合的写入操作,请不要使用本页所列的步骤。相反,请在副本集的主节点上使用 db.collection.createIndex() 来为集合构建唯一索引。

确保您的 oplog 足够大,以允许索引或重新索引操作完成,而不会落后太远而无法赶上。有关更多信息,请参阅 oplog 大小调整文档。

用于构建唯一索引

要通过以下过程创建唯一索引,必须在索引构建期间停止对集合的所有写入。否则,副本集节点之间可能会获得不一致的数据。

警告

如果无法停止对集合的所有写入,请勿使用以下步骤创建唯一索引。

重要

以滚动方式构建索引的以下过程适用于副本集部署,而不是分片的集群。有关分片的集群的过程,请参阅在分片集群上创建滚动索引版本。

在主节点 (primary node in the replica set)节点上运行以下命令,隐藏将构建新索引的从节点(secondary node from replica set)。

在此示例中,构建新索引的从节点(secondary node from replica set)是 cfg.members 中的第三个节点。

var cfg = rs.conf();
// Record originalPriority so that you can reset it later.
var originalPriority = cfg.members[2].priority;
cfg.members[2].priority = 0;
cfg.members[2].hidden = 1;
rs.reconfig(cfg);

停止与从节点关联的 mongod 进程。执行以下配置更新后重新启动:

如果使用配置文件,请进行以下配置更新:

例如,为副本集节点更新的配置文件将包含类似于如下示例的内容:

net:
bindIp: localhost,<hostname(s)|ip address(es)>
port: 27217
# port: 27017
#replication:
# replSetName: myRepl
setParameter:
disableLogicalSessionCacheRefresh: true

其他设置(例如storage.dbPath 等等)保持不变。

并重新启动:

mongod --config <path/To/ConfigFile>

如果使用命令行选项,请进行以下配置更新:

例如,如果副本集成员通常在默认端口 27017--replSet 选项上运行,则需要指定不同的端口,省略 --replSet 选项,并将 disableLogicalSessionCacheRefresh 参数设置为 true:

mongod --port 27217 --setParameter disableLogicalSessionCacheRefresh=true

其他设置(例如--dbpath 等等)保持不变。

[1](12)通过在不同端口上运行 mongod 可以确保在构建索引时,副本集的其他节点及所有客户端不会联系该节点。

直接连接到在新端口上独立运行的 mongod 实例,并为该实例创建新索引。

例如,将 mongosh 连接到实例,然后使用 createIndex()records 集合的 username 字段上创建一个升序索引:

db.records.createIndex( { username: 1 } )

索引构建完成后,关闭mongod 实例。要将节点返回到其原始配置,请撤消您在以独立运行启动该节点时所做的配置更改。 然后,将该节点作为副本集的成员重新启动。

重要

请务必删除 disableLogicalSessionCacheRefresh 参数。

例如,要重新启动副本集节点:

如果您在使用配置文件:

例如:

net:
bindIp: localhost,<hostname(s)|ip address(es)>
port: 27017
replication:
replSetName: myRepl

其他设置(例如storage.dbPath 等等)保持不变。

并重新启动:

mongod --config <path/To/ConfigFile>

如果您使用命令行选项,

  • 恢复为原始端口号

  • 包括--replSet选项。

  • Remove parameter disableLogicalSessionCacheRefresh.

例如:

mongod --port 27017 --replSet myRepl

其他设置(例如--dbpath 等等)保持不变。

重要

在开始下一步之前,允许复制赶上该成员。

在主节点 (primary node in the replica set)上运行以下命令,取消隐藏构建索引的从节点(secondary node from replica set)节点。 本示例中,构建索引的从节点(secondary node from replica set)节点是 cfg.members 中的第三个节点。

var cfg = rs.conf();
cfg.members[2].priority = originalPriority;
cfg.members[2].hidden = false;
rs.reconfig(cfg);

一旦该节点赶上副本集中的其他节点,请一次对一个剩余从节点重复该过程:

  1. 隐藏并重新启动一个从节点(secondary node from replica set)。

  2. 构建索引。

  3. 以副本集身份重新启动程序mongod 。

当所有从节点均有新索引时,退出主节点,使用上述过程将其重启为独立实例,然后构建前一个主节点的索引:

  1. 使用 mongosh 中的 rs.stepDown() 方法将主节点降级。成功降级后,当前主节点将变为从节点,并且副本集成员会选举新的主节点。

  2. 隐藏并重新启动一个从节点(secondary node from replica set)。

  3. 构建索引。

  4. 以副本集身份重新启动程序mongod 。

后退

滚动索引构建