OPTIONS
翻译或纠错本页面

复制集的数据同步

为了维持数据集镜像中数据的实时性,复制集的节点会从其他节点上 sync 或者复制数据。Mongodb在 初始同步 的时候将完整的数据集传输给新的节点,然后通过复制不间断的将数据集的变动应用在从节点上。

初始同步

初始同步会将完整的数据集复制到各个节点上。当一个节点没有数据的适合,就会进行初始同步,比如,当它是新加的节点,或者它的数据已经无法通过复制追上最新的数据了,也会进行初始同步。

当我们进行初始同步的时候,MongoDB会做如下的事情:

  1. 复制所有的数据库。 mongod 会查询所有的表和数据库,然后将所有的数据插入这些表的备份中,同时也会建立_id的索引。

  2. 应用数据集中所有的数据变动。 mongod 通过oplog来更新数据,从而让数据集保持最新的状态。

  3. 建立所有表上的索引(除了_id ,这个之前已经建立完成)。

    mongod 完成了所有的索引的建立,该节点将会变为正常的状态i.e. secondary

参见 复制集成员的重新同步 以获得更多有关初始同步的信息。

复制

在初始同步后,复制集节点就会开始不断的复制数据了,这也就保证了节点上的数据总是最新的。大多数时候,从节点从主节点上同步数据。从节点也可能会根据网络的延时与其他节点的复制情况来自动的变更其自己的 复制标记

如果希望从别的节点上复制数据,所有节点需要有一致的 buildIndexes 值/每个节点的 buildIndexes 必须是 true 或者 false

在2.2版本之后,从节点将不会从 延时节点隐藏节点 上复制数据。

准确性与持久化(Validity and Durability)

复制集中,只有主节点才能接收写操作。只在主节点上进行写为节点间的 数据一致性 提供了保障。

Journaling provides single-instance write durability. Without journaling, if a MongoDB instance terminates ungracefully, you must assume that the database is in an invalid state.

多线复制

MongoDB允许通过多线程进行批量写操作来提高并发能力。MongoDB将批操作通过命名空间来分组,

While applying a batch, MongoDB blocks all reads. As a result, secondaries can never return data that reflects a state that never existed on the primary.

Pre-Fetching Indexes to Improve Replication Throughput

To help improve the performance of applying oplog entries, MongoDB fetches memory pages that hold affected data and indexes. This pre-fetch stage minimizes the amount of time MongoDB holds the write lock while applying oplog entries. By default, secondaries will pre-fetch all Indexes.

Optionally, you can disable all pre-fetching or only pre-fetch the index on the _id field. See the secondaryIndexPrefetch setting for more information.