基于副本集构建的滚动索引
在此页面上
索引构建可能会影响副本集性能。默认情况下,MongoDB 在所有承载数据的副本集节点上同时构建索引。对于无法容忍由于索引构建而性能下降的工作负载,请考虑使用以下过程以滚动方式构建索引。
滚动索引构建一次最多占用一个副本集节点(始于从节点),并在该节点上独立构建索引。滚动索引构建需要至少一次副本集选举。
注意
有关在Atlas中创建索引的信息,请参阅Atlas文档中的索引管理页面。
Considerations
Unique Indexes
要通过以下过程创建 的唯一索引 ,您必须在此过程中停止对集合的所有写入。
如果您在执行步骤的过程中无法停止所有对集合的写入操作,请不要使用本页所列的步骤。相反,请在副本集的主节点上使用 db.collection.createIndex()
来为集合构建唯一索引。
Oplog 大小
确保您的 oplog 足够大,以允许索引或重新索引操作完成,而不会落后太远而无法赶上。有关更多信息,请参阅 oplog 大小调整文档。
先决条件
- 用于构建唯一索引
要通过以下过程创建唯一索引,必须在索引构建期间停止对集合的所有写入。否则,副本集节点之间可能会获得不一致的数据。
警告
如果无法停止对集合的所有写入,请勿使用以下步骤创建唯一索引。
步骤
重要
以滚动方式构建索引的以下过程会应用于副本集部署,而不是分片集群。有关针对分片群集的过程,请参阅针对分片集群的滚动索引构建。
1。 隐藏并重新启动一个从节点。
在主节点 (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);
2。 停止一个从节点并重新启动为独立节点。
停止与从节点关联的 mongod
进程。执行以下配置更新后重新启动:
如果使用配置文件,请进行以下配置更新:
注释掉
replication.replSetName
选项。在
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>
如果使用命令行选项,请进行以下配置更新:
在
--setParameter
选项中将参数disableLogicalSessionCacheRefresh
设置为true
。
例如,如果副本集成员通常在默认端口 27017
和 --replSet
选项上运行,则需要指定不同的端口,省略 --replSet
选项,并将 disableLogicalSessionCacheRefresh
参数设置为 true:
mongod --port 27217 --setParameter disableLogicalSessionCacheRefresh=true
其他设置(例如--dbpath
等等)保持不变。
[1] | (1、2)通过在不同端口上运行 mongod 可以确保在构建索引时,副本集的其他节点及所有客户端不会联系该节点。 |
3。 构建索引。
直接连接到在新端口上独立运行的 mongod
实例,并为该实例创建新索引。
例如,将 mongosh
连接到实例,并使用 createIndex()
在 records
集合的 username
字段上创建一个升序索引:
db.records.createIndex( { username: 1 } )
4。 mongod
以副本集成员身份重新启动程序 。
索引构建完成后,关闭mongod
实例。要将节点返回到其原始配置,请撤消您在以独立运行运行模式启动该节点时所做的配置更改。然后,将该节点作为副本集的成员重新启动。
重要
请务必删除 disableLogicalSessionCacheRefresh
参数。
例如,要重新启动副本集节点:
如果您在使用配置文件:
恢复到原始端口号。
取消对
replication.replSetName
的注释。删除
setParameter
部分的参数disableLogicalSessionCacheRefresh
。
例如:
net: bindIp: localhost,<hostname(s)|ip address(es)> port: 27017 replication: replSetName: myRepl
其他设置(例如storage.dbPath
等等)保持不变。
并重新启动:
mongod --config <path/To/ConfigFile>
重要
在开始下一步之前,允许复制赶上该成员。
5。 取消隐藏从节点。
在主节点 (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);
6。 对剩余从节点重复该过程。
一旦该节点赶上副本集中的其他节点,请一次对一个剩余从节点重复该过程:
7。 在主节点上构建索引。
当所有从节点均有新索引时,退出主节点,使用上述过程将其重启为独立实例,然后构建前一个主节点的索引:
使用
mongosh
中的rs.stepDown()
方法将主节点降级。成功降级后,当前主节点将变为从节点,并且副本集成员会选举新的主节点。