在副本集上建立滚动索引
在复制集上建立索引
在本页面
索引构建会影响复制集的性能。默认情况下,MongoDB 4.4及以后版本在所有承载数据的复制集成员上同时构建索引。对于不能容忍由于索引构建而导致性能下降的工作负载,可以考虑使用以下过程以滚动方式构建索引。
滚动索引构建一次最多抽取一个复制集成员(从辅助成员开始),并在该成员上作为独立的索引构建。构建滚动索引至少需要一次复制集的选择。
注意事项
唯一索引
要使用以下过程创建唯一索引,必须在此过程中停止对集合的所有写操作。
如果在此过程中不能停止对集合的所有写操作,请不要使用此页面上的过程。相反,通过在主节点上为一个副本集发出' db.collection.createIndex() '来在该集合上构建你的唯一索引。
Oplog大小
确保您的oplog足够大,以允许索引或重新索引操作完成,而不会落后太多而无法跟上。参见oplog sizing文档了解更多信息。
前提条件
用于构建唯一索引
要使用以下过程创建唯一索引,必须在索引构建期间停止对集合的所有写操作。否则,复制集成员之间的数据可能会不一致。如果不能停止对集合的所有写操作,请不要使用以下过程创建唯一索引。
程序
重要
以下以滚动方式构建索引的过程适用于复制集部署,而不适用分片集群。有关分片集群的过程,请参阅在分片集群上构建滚动索引。
A. 停止一个辅助节点并作为独立节点重新启动
停止与辅助节点关联的mongod进程。进行以下配置更新后重新启动:
配置文件
如果您正在使用配置文件,请进行以下配置更新:
注释掉replication.replSetName选项。
在setParameter部分设置参数' disablelogicalicalsessioncacherefresh '为' true '。
例如,更新后的副本集成员配置文件将包括如下示例所示的内容:
其他设置(例如storage.dbPath
等)保持不变。
并重新启动:
命令行选项
如果使用命令行选项,请进行以下配置更新:
删除---复制集。
修改---端口到另一个端口。
在---setParameter选项中设置参数disableLogicalSessionCacheRefresh为true
例如,如果你的复制集成员通常运行在默认端口27017和----replSet选项,你应该指定一个不同的端口,省略----replSet选项,并设置disableLogicalSessionCacheRefresh参数为true:
其他设置(例如--dbpath
等)保持不变。
B. 建立索引
直接连接到mongod实例作为一个独立的运行在新的端口上,并为这个实例创建新的索引。
例如,将mongo
连接到实例,然后使用createIndex()
来username
在records
集合的字段上创建升序索引:
C. 重新启动程序mongod作为复制集成员
索引构建完成后,关闭mongod
实例。撤消以独立版本启动时所做的配置更改,以返回其原始配置并以复制集的成员身份重新启动。
重要
一定要删除**' disableLogicalSessionCacheRefresh '**参数。
例如,重新启动复制集成员:
配置文件
如果您正在使用配置文件:
恢复到原始端口号。
取消replication.replSetName的注释。
删除setParameter中的参数**' disableLogicalSessionCacheRefresh '**。
例如:
copycopied
Other settings (e.g. storage.dbPath
, etc.) remain the same.
并重新启动
命令行选项
如果您正在使用配置文件:
恢复到原始端口号
包括----replSet选项。
删除参数disableLogicalSessionCacheRefresh。
例如:
其他设置(例如--dbpath
等)保持不变。
D.重复其余的步骤
一旦该成员赶上集合中的其他成员,请对其余的次要成员一次重复一个成员的过程:
E. 在主服务器上构建索引
当所有的辅助服务器都有了新的索引时,从主服务器下走一步,使用上面描述的过程作为一个独立的程序重新启动它,并在前主服务器上构建索引:
使用
mongo shell
中的rs.stepDown()
方法mongo
降低主数据库的性能。成功降级后,当前的主节点将成为辅助节点,复制集成员将选择新的主节点。
最后更新于