OPTIONS
翻译或纠错本页面

在复制集上创建索引

对于复制集而言,从节点会在 primary 结束创建索引后开始创建索引。在 分片集群 上, mongos 会发送 ensureIndex() 方法到每个集群的复制集主节点上,接着在主节点索引创建完毕后从节点开始创建索引。

为了最小化创建索引对在副本集的性能影响,请遵循如下步骤:

参见

索引教程 and 索引概念 for more information.

注意事项

  • 确保您的 oplog 足够大来支持完成索引或者重建索引操作,以避免落后(其他节点)太多以致于无法同步跟上。参见 oplog大学 了解更多信息。

  • 这个步骤 每次从复制集中取出一个成员。但是,这个步骤每次只会影响复制集中的一个成员,而不是同时影响 所有 从节点。

  • 当创建 dropDups 带有选项的 唯一索引 时请 不要 使用这个步骤。

  • 在版本2.6以前, 索引后台创建操作 在复制集的 secondary 成员上会变成 前台 索引操作。在版本2.6以后,后台索引创建在从节点上也是后台进行。

步骤

注解

如果您需要在 sharded cluster 上创建索引,请对每个规定了 shard 的复制集重复如下步骤。

停止一个从节点

停止一个从节点上的 mongod 进程。重启 mongod 进程, 不要--replSet 选项且指定一个不同的端口。 [1] 限制这个实例是运行在 “standalone” 模式下的。

例如,如果您的 mongod 进程 通常 在默认端口 27017 以选项 --replSet 运行,您就可以使用执行如下命令:

mongod --port 47017
[1]

通过在不同端口允运行 mongod 的方式,您可以确保复制集的其它成员和所有客户端都不会访问您正在创建索引的成员。

创建索引

mongo shell 里通过 ensureIndex() 方法创建新索引,或者其他您的驱动里的等效方法。这个操作将会在 mongod 实例里建立或者重建索引。

例如,为了在 records 集合的 username 键上创建一个递增索引,可以使用如下 mongo shell 操作:

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

参见

参见 创建一个索引创建一个复合索引 了解更多。

重启 mongod 进程

当索引创建完毕,在原有端口上用选项 --replSet 重启 mongod 实例:

mongod --port 27017 --replSet rs0

修改端口数字(例如 27017 )或者复制集名称(例如 rs0 )如果需要的话。

(接着,)在这个成员上跟上(主节点的)复制同步。

在所有从节点上创建索引

在 2.6 版更改: 从节点限制可以 后台创建索引 。此前,在从节点上的所有索引创建都是在前台进行。

对于复制集中的每个从节点,按如下步骤创建索引:

  1. 停止一个从节点
  2. 创建索引
  3. 重启 mongod 进程

Build the Index on the Primary

在主节点上创建索引,您可以选择其中一种方式:

  1. 在主节点是:doc:后台创建索引 </tutorial/build-indexes-in-the-background>

  2. 使用 mongo shell 中的 rs.stepDown() 方法让主节点下野(step down),这样主节点平滑地过渡为从节点,且允许复制集选举其他成员为主节点。

    然后重启上述索引创建步骤,在(原)主节点上创建索引:

    1. 停止一个从节点
    2. 创建索引
    3. 重启 mongod 进程

在后台创建索引会比前台方式耗时更久,且会生成不够紧凑的索引 结构。此外,后台创建索引可能会影响主节点的写性能。但是,在后台建立索引允许复制集在MongoDB建立索引期间持续写操作。