故障切换时的回滚¶
之前的 主节点 在 a 故障切换 后重新回归 复制集 时将会发生写操作的回滚。回滚只会发生在主节点的写操作 没能 成功在 从节点 上应用就辞职的情况下。当主节点重新以一个从节点加入复制集,它将进行 “回滚” ,其上得写操作将与复制集中其他成员的保持一致。
MongoDB会尽量避免回滚的发生。回滚如果确实发生了,往往是由于网络导致的。从节点如果无法跟上之前主节点上的写操作的吞吐,那么将会加剧回滚的影响范围。
当主节点在从节点完成写操作的复制后才辞职的或是主节点一直是可用的或是与多数节点可以沟通的,将 不会 发生回滚。
选取回滚的数据¶
当回滚发生后,管理员需要决定是恢复回滚的数据还是忽视它。MongoDB将回滚的数据以 BSON 文件的形式写到数据库 dbPath 文件夹中的 rollback/ 目录。回滚数据文件的命名是按照以下规则进行的:
<database>.<collection>.<timestamp>.bson
例如:
records.accounts.2011-05-09T18-10-04.0.bson
当节点完成回滚并退回从节点的状态后,管理员必须手动的获取回滚的数据。通过使用 bsondump 来获取回滚的数据内容。然后使用 mongorestore 来将这些数据应用到新的主节点中。
回滚的限制¶
A mongod instance will not rollback more than 300 megabytes of data. If your system must rollback more than 300 megabytes, you must manually intervene to recover the data. If this is the case, the following line will appear in your mongod log:
[replica set sync] replSet syncThread: 13410 replSet too much data to roll back
这种情况下,直接保存数据或者强制节点执行数据初始化同步。如果进行数据的初始化同步呢,我们可以通过将该节点 dbPath 目录中的数据删除来从 “现有” 节点上进行数据同步。