Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

基于副本集构建的滚动索引

在此页面上

  • Considerations
  • 先决条件
  • 步骤

索引构建可能会影响副本集性能。默认情况下,MongoDB 在所有承载数据的副本集节点上同时构建索引。对于无法容忍由于索引构建而性能下降的工作负载,请考虑使用以下过程以滚动方式构建索引。

滚动索引构建一次最多占用一个副本集节点(始于从节点),并在该节点上独立构建索引。滚动索引构建需要至少一次副本集选举。

注意

有关在Atlas中创建索引的信息,请参阅Atlas文档中的索引管理页面。

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

如果您在执行步骤的过程中无法停止所有对集合的写入操作,请不要使用本页所列的步骤。相反,请在副本集的主节点上使用 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 进程。执行以下配置更新后重新启动:

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

  • 注释掉 replication.replSetName 选项。

  • net.port 更改为另一个端口。[1] 以注释的形式记下原始端口设置。

  • setParameter 部分中将参数 disableLogicalSessionCacheRefresh 设置为 true

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

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 。

后退

构建