Docs 主页 → 开发应用程序 → MongoDB Manual
基于副本集构建的滚动索引
索引构建可能会影响副本集性能。默认,MongoDB 会在所有承载数据的副本集节点上同时构建索引。对于不能容忍因索引构建而导致性能下降的工作负载,请考虑使用以下过程以滚动方式构建索引。
滚动索引构建一次最多占用一个副本集节点(始于从节点),并在该节点上独立构建索引。滚动索引构建需要至少一次副本集选举。
考虑因素
唯一(Unique)索引
要通过以下过程创建唯一索引,必须在此过程中停止对集合的所有写入。
如果您在执行步骤的过程中无法停止所有对集合的写入操作,请不要使用本页所列的步骤。相反,请在副本集的主节点上使用 db.collection.createIndex()
来为集合构建唯一索引。
Oplog 大小
确保您的 oplog 足够大,以允许索引或重新索引操作完成,而不会落后太远而无法赶上。有关更多信息,请参阅 oplog 大小调整文档。
先决条件
- 用于构建唯一索引
要通过以下过程创建唯一索引,必须在索引构建期间停止对集合的所有写入。否则,副本集节点之间可能会获得不一致的数据。
警告
如果无法停止对集合的所有写入,请勿使用以下步骤创建唯一索引。
步骤
重要
以滚动方式构建索引的以下过程会应用于副本集部署,而不是分片集群。有关针对分片群集的过程,请参阅针对分片集群的滚动索引构建。
A. 停止一个从节点并重启为独立实例
停止与从节点关联的 mongod
进程。执行以下配置更新后重新启动:
[1] | (1、2)通过在不同端口上运行 mongod 可以确保在构建索引时,副本集的其他节点及所有客户端不会联系该节点。 |
B. 构建索引
直接连接到在新端口上独立运行的 mongod
实例,并为该实例创建新索引。
例如,将 mongosh
连接到实例,并使用createIndex()
在records
集合的username
字段上创建升序索引:
db.records.createIndex( { username: 1 } )
C. 以副本集成员身份重新启动程序mongod
索引构建完成后,关闭 mongod
实例。撤消以独立节点身份启动时所做的配置更改,以恢复其原始配置,并以副本集节点身份重新启动。
重要
请务必删除 disableLogicalSessionCacheRefresh
参数。
例如,要重新启动副本集节点:
允许复制赶上此节点。
D. 对剩余从节点重复该过程
一旦该节点赶上副本集中的其他节点,请一次对一个剩余从节点重复该过程:
E. 构建主节点索引
当所有从节点均有新索引时,退出主节点,使用上述过程将其重启为独立实例,然后构建前一个主节点的索引:
使用 中的
rs.stepDown()
mongosh
方法降级主节点。成功降级后,当前主节点将成为从节点,并且副本集成员会选举新的主节点。