原文
当成员在故障转移后重新加入副本集的时候,回滚将在故障转移之前的主服务器上恢复写操作。:只有在主服务器退为备份服务器前已经接受了写入操作但是备份服务器并没有成功把数据同步的时候,才需要回滚操作。当故障转移之前身份为主服务器的成员已备份服务器的身份重新加入到副本集,考虑到该成员与其他成员数据的一致性,这个时候需要回滚,因为这时该成员具有写操作。
MongDB会尽量避免回滚,这应该是比较罕见的。通常只有网络分区操作才会出现回滚。备份服务器无法跟上故障转移前的主服务器的操作吞吐量,增加了回滚的大小和影响。
在主服务器退为备份服务器前成功将写入权限转移给了某个成员,那么回滚操作将不会触发,前提是接受写入操作的该成员对于副本集的大多数成员说是可访问且可用的。
收集回滚数据
当发生了回滚操作的时候,MongDB会将回滚数据文件以Bson格式存放在数据库的dbpath/rollback/文件夹下,文件名称的格式如下:
<database>.<collection>.<timestamp>.bson
例如:
records.accounts.2011-05-09T18-10-04.0.bson
你可以使用 bsondump来阅读回滚数据文件。管理员可以根据数据文件当中的内容采取相关操作。
避免副本集回滚
对于副本集来说,默认的 write concern {w: 1}只确认主服务器是否拥有写操作,在这样的情况下,如果主服务器将自己的写权限转交给副本集其他成员前就退为了备份服务器,那么可能就会触发回滚。
为了避免数据已经被客户端确认后回滚,将所有的投票成员的日志记录开启并在错误的客户端返回数据前使用 w: majority write concern来允许数据集的大部分节点传播写权限。
回滚限制
mongd仅支持300字节以内数据回滚,如果你必须进行300字节以上的数据回滚操作,你的数据恢复只能通过手动干预进行。如果是这样的话,下面这行日志会出现在你的mongd log中:
[replica set sync] replSet syncThread: 13410 replSet too much data to roll back
在这样的情况下,直接保存数据或者强制成员执行同步初始化。如果使用强制成员执行同步初始化,首先将需要大数据回滚的成员的相关文件从 dbPath
中删除,然后再从"当前"的成员里面重新同步。
网友评论