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