在副本集上建立滚动索引

在复制集上建立索引

在本页面

索引构建会影响复制集的性能。默认情况下,MongoDB 4.4及以后版本在所有承载数据的复制集成员上同时构建索引。对于不能容忍由于索引构建而导致性能下降的工作负载,可以考虑使用以下过程以滚动方式构建索引。

滚动索引构建一次最多抽取一个复制集成员(从辅助成员开始),并在该成员上作为独立的索引构建。构建滚动索引至少需要一次复制集的选择。

注意事项

唯一索引

要使用以下过程创建唯一索引,必须在此过程中停止对集合的所有写操作。

如果在此过程中不能停止对集合的所有写操作,请不要使用此页面上的过程。相反,通过在主节点上为一个副本集发出' db.collection.createIndex() '来在该集合上构建你的唯一索引。

Oplog大小

确保您的oplog足够大,以允许索引或重新索引操作完成,而不会落后太多而无法跟上。参见oplog sizing文档了解更多信息。

前提条件

  • 用于构建唯一索引

要使用以下过程创建唯一索引,必须在索引构建期间停止对集合的所有写操作。否则,复制集成员之间的数据可能会不一致。如果不能停止对集合的所有写操作,请不要使用以下过程创建唯一索引。

程序

重要

以下以滚动方式构建索引的过程适用于复制集部署,而不适用分片集群。有关分片集群的过程,请参阅在分片集群上构建滚动索引

A. 停止一个辅助节点并作为独立节点重新启动

停止与辅助节点关联的mongod进程。进行以下配置更新后重新启动:

  • 配置文件

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

例如,更新后的副本集成员配置文件将包括如下示例所示的内容:

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选项中设置参数disableLogicalSessionCacheRefreshtrue

例如,如果你的复制集成员通常运行在默认端口27017和----replSet选项,你应该指定一个不同的端口,省略----replSet选项,并设置disableLogicalSessionCacheRefresh参数为true:

mongod --port 27217 --setParameter disableLogicalSessionCacheRefresh=true

其他设置(例如--dbpath等)保持不变。

B. 建立索引

直接连接到mongod实例作为一个独立的运行在新的端口上,并为这个实例创建新的索引。

例如,将mongo连接到实例,然后使用createIndex()usernamerecords集合的字段上创建升序索引:

db.records.createIndex( { username: 1 } )

C. 重新启动程序mongod作为复制集成员

索引构建完成后,关闭mongod 实例。撤消以独立版本启动时所做的配置更改,以返回其原始配置并以复制集的成员身份重新启动。

重要

一定要删除**' disableLogicalSessionCacheRefresh '**参数。

例如,重新启动复制集成员:

  • 配置文件

如果您正在使用配置文件:

例如:

copycopied

net:
   bindIp: localhost,<hostname(s)|ip address(es)>
   port: 27017
replication:
   replSetName: myRepl

Other settings (e.g. storage.dbPath, etc.) remain the same.

并重新启动

mongod --config <path/To/ConfigFile>
  • 命令行选项

如果您正在使用配置文件:

  • 恢复到原始端口号

  • 包括----replSet选项。

  • 删除参数disableLogicalSessionCacheRefresh

例如:

mongod --port 27017 --replSet myRepl

其他设置(例如--dbpath等)保持不变。

D.重复其余的步骤

一旦该成员赶上集合中的其他成员,请对其余的次要成员一次重复一个成员的过程:

E. 在主服务器上构建索引

当所有的辅助服务器都有了新的索引时,从主服务器下走一步,使用上面描述的过程作为一个独立的程序重新启动它,并在前主服务器上构建索引:

  1. 使用mongo shell中的rs.stepDown()方法mongo降低主数据库的性能。成功降级后,当前的主节点将成为辅助节点,复制集成员将选择新的主节点。

最后更新于