文档菜单
文档首页
/
MongoDB 手册
/ /

在副本集上滚动索引构建

本页内容

  • 注意事项
  • 先决条件
  • 程序

索引构建可能会影响副本集性能。默认情况下,MongoDB会在所有承载数据的副本集成员上同时构建索引。对于无法容忍因索引构建而导致的性能下降的工作负载,请考虑使用以下步骤以滚动方式构建索引。

滚动索引构建每次最多将一个副本集成员移除,从辅助成员开始,在该成员上独立构建索引。滚动索引构建至少需要一个副本集选举。

注意

有关在Atlas中创建索引的信息,请参阅索引管理页面在Atlas文档中。

要创建唯一索引,必须在此过程中停止对集合的所有写入。

如果在此次过程中无法停止对集合的所有写入,请不要使用本页上的方法。相反,通过在副本集的主节点上发出db.collection.createIndex()来在集合上构建唯一索引。

确保您的 oplog 足够大,以便索引或重新索引操作可以完成而不会落后太多,无法追上。有关更多信息,请参阅 oplog 大小 文档。

为了构建唯一索引

使用以下步骤创建 唯一索引,在索引构建期间必须停止集合的所有写入。否则,您可能会在副本集成员之间出现不一致的数据。

警告

如果您无法停止集合的所有写入,请不要使用以下步骤创建唯一索引。

重要

以下滚动构建索引的步骤适用于副本集部署,而不是分片集群。有关分片集群的步骤,请参阅 分片集群上的滚动索引构建

停止与辅助副本关联的 mongod 进程。在执行以下配置更新后重启

如果您使用配置文件,请执行以下配置更新

  • 取消注释 replication.replSetName 选项。

  • net.port 更改为不同的端口号。[1] 将原始端口号设置作为注释记录。

  • 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>

如果使用命令行选项,请执行以下配置更新

例如,如果您的副本集成员 通常 在默认端口 27017 上运行并使用 --replSet 选项,您将指定不同的端口,省略 --replSet 选项,并将 disableLogicalSessionCacheRefresh 参数设置为 true

mongod --port 27217 --setParameter disableLogicalSessionCacheRefresh=true

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

[1](1, 2) 通过在另一个端口上运行 mongod,你可以确保在构建索引时,副本集的其他成员和所有客户端都不会接触该成员。

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

例如,将 mongosh 连接到实例,并使用 createIndex()records 集合的 username 字段上创建升序索引。

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

索引构建完成后,关闭 mongod 实例。撤销启动时作为独立实例所做的配置更改,以恢复其原始配置,并作为副本集成员重新启动。

重要

务必删除 disableLogicalSessionCacheRefresh 参数。

例如,要重新启动您的副本集成员

如果您使用配置文件

例如

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

其他设置(例如 storage.dbPath 等)保持不变。

然后重启

mongod --config <path/To/ConfigFile>

如果您使用命令行选项

  • 恢复到原始端口号

  • 包含 --replSet 选项。

  • 删除参数 disableLogicalSessionCacheRefresh

例如

mongod --port 27017 --replSet myRepl

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

允许复制在此成员上追赶上。

一旦成员赶上集合中的其他成员,逐个对剩余的辅助成员执行上述步骤

  1. A. 停止一个辅助成员并作为独立设备重新启动

  2. B. 构建索引

  3. C. 作为副本集成员重新启动程序 mongod

当所有辅助成员都拥有新索引后,降级主节点,按照上述步骤将其作为独立设备重新启动,并在之前的辅助节点上构建索引

  1. 使用rs.stepDown() 方法在 mongosh 中降级主节点。在成功降级后,当前主节点变为辅助节点,并且副本集成员将选举一个新的主节点。

  2. A. 停止一个辅助成员并作为独立设备重新启动

  3. B. 构建索引

  4. C. 作为副本集成员重新启动程序 mongod

返回

构建