Mongodb Mongo可能的数据损坏将辅助数据返回到副本集
我正在试图了解一些数据损坏的来源,这些数据损坏发生在次服务器返回到副本集的同一时间 我们有一个具有4个节点的生产副本集—3个数据承载节点和一个仲裁器 我从生产副本集中取出一个辅助副本(称之为Mongodb Mongo可能的数据损坏将辅助数据返回到副本集,mongodb,mongodb-replica-set,Mongodb,Mongodb Replica Set,我正在试图了解一些数据损坏的来源,这些数据损坏发生在次服务器返回到副本集的同一时间 我们有一个具有4个节点的生产副本集—3个数据承载节点和一个仲裁器 我从生产副本集中取出一个辅助副本(称之为X),并使用它为新的测试副本集播种种子,以进行一些性能基准测试。在为新副本集设定种子之后,我将X放回生产副本集中。在大约10小时内,我们接到客户投诉,称他们丢失了大约2天的数据X也已停产两天。因此,我们想知道重新引入X是否导致了一些数据恢复 时间安排非常接近,我们还没有找到任何合理的替代理论——因此这篇文章
X
),并使用它为新的测试副本集播种种子,以进行一些性能基准测试。在为新副本集设定种子之后,我将X
放回生产副本集中。在大约10小时内,我们接到客户投诉,称他们丢失了大约2天的数据<代码>X也已停产两天。因此,我们想知道重新引入X
是否导致了一些数据恢复
时间安排非常接近,我们还没有找到任何合理的替代理论——因此这篇文章
奇怪的是,只有一些mongo收藏被“还原”。我们的数据库似乎是主数据库和X
数据库的混合
更详细地说,我是这样做的:
- 运行
rs.remove(X)
- 从其
mongod.conf
- 重新启动
X
- 连接到
数据库并运行local
清除生产副本集信息db.dropDatabase()
- 在
中恢复了副本信息,但使用了新的副本集名称mongod.conf
- 重新启动
X
- 调出3个空mmapv1节点和一个仲裁器,并将它们连接到新副本集中的
X
- 让它们复制大约48小时
- 运行
和rs.steppdown()
rs.remove(X)
- 从其
mongod.conf
- 如上所述,连接并删除了
数据库本地
- 在
中恢复了副本信息,但使用了生产副本集名称mongod.conf
- 使用
将rs.add(X)
添加回生产副本集中X
X
是测试副本集中的主要数据时,没有向其添加新数据
以下是一些可能相关的信息: 所有节点都是运行mongo 3.2.7的mmapv1 从生产副本集中删除
X
后,/etc/hosts
中的生产主副本条目意外被删除。它能够直接与另一个二级仲裁人和仲裁人通信,但不能与一级仲裁人通信。有很多心跳错误日志
我发现这些日志似乎表明X
的数据在重新进入生产副本集时被删除:
2017-01-13T10:00:59.497+0000 I REPL [ReplicationExecutor] syncing from: (other secondary)
2017-01-13T10:00:59.552+0000 I REPL [rsSync] initial sync drop all databases
2017-01-13T10:00:59.554+0000 I STORAGE [rsSync] dropAllDatabasesExceptLocal 3
2017-01-13T10:00:59.588+0000 I JOURNAL [rsSync] journalCleanup...
2017-01-13T10:00:59.588+0000 I JOURNAL [rsSync] removeJournalFiles
在此之前,开发人员还报告了一些问题,即主服务器有时在较高负载下没有响应。以下是来自reactivemongo驱动程序的一些错误:
No primary node is available!
The primary is unavailable, is there a network problem?
not authorized for query on [db]:[collection]
节点位于aws上:主节点在m3.xlarge
上运行,辅助节点在m3.large
上运行,仲裁节点在m3.medium
上运行
在接到客户投诉大约30小时后,我们的复制集举行了一次选举,X
成为主要的。以下是日志:
2017-01-15T16:00:33.332+0000 I REPL [ReplicationExecutor] Starting an election, since we've seen no PRIMARY in the past 10000ms
2017-01-15T16:00:33.333+0000 I REPL [ReplicationExecutor] conducting a dry run election to see if we could be elected
2017-01-15T16:00:33.347+0000 I REPL [ReplicationExecutor] dry election run succeeded, running for election
2017-01-15T16:00:33.370+0000 I REPL [ReplicationExecutor] election succeeded, assuming primary role in term 2
2017-01-15T16:00:33.370+0000 I REPL [ReplicationExecutor] transition to PRIMARY
2017-01-15T16:00:33.502+0000 I REPL [rsSync] transition to primary complete; database writes are now permitted
这发生在我意识到/etc/hosts
文件在X
上被破坏之前
在复制一个非常大的集合(2.6亿个文档)时,我在日志中也发现了很多这样的错误:
这是一个不同的集合,但与损坏的集合不同。首先注意,您不应该有3+1,因为票数应该是奇数,而不是偶数。因此,有3个数据节点,没有仲裁器!为了防止选择“错误”节点作为主节点。看起来你已经碰到了3.2.7的已知错误,在这个错误中,secondary被选为primary,即使它没有最新的数据。i、 e.本例比初选晚2天。要防止这种情况发生,应将protocolVersion更改为0。cfg=rs.conf();cfg.protocolVersion=0;rs.reconfig(cfg)@谢谢你的回复。但是我没有发现选举的证据,直到被破坏的数据出现很久之后。当我们第一次注意到错误时,我们确认主服务器没有更改,然后我检查了日志。不过我会再查一查。4节点设置是临时的(说来话长)。感谢您指出这个bug——很可怕的是,一个辅助服务器可能会像这样升级并破坏整个复制集上的数据。这可能真的会伤害我们的客户和我们。幸运的是,它只破坏了一些小的集合。@JJussi您还能够提供到该bug的链接吗?有问题页面吗?SERVER-23663和SERVER-22502Thank@JJussi我仔细检查了所有节点上的所有日志,没有选择。所以回到绘图板上…首先,你不应该有3+1,因为计票应该是奇数,而不是偶数。因此,有3个数据节点,没有仲裁器!为了防止选择“错误”节点作为主节点。看起来你已经碰到了3.2.7的已知错误,在这个错误中,secondary被选为primary,即使它没有最新的数据。i、 e.本例比初选晚2天。要防止这种情况发生,应将protocolVersion更改为0。cfg=rs.conf();cfg.protocolVersion=0;rs.reconfig(cfg)@谢谢你的回复。但是我没有发现选举的证据,直到被破坏的数据出现很久之后。当我们第一次注意到错误时,我们确认主服务器没有更改,然后我检查了日志。不过我会再查一查。4节点设置是临时的(说来话长)。感谢您指出这个bug——很可怕的是,一个辅助服务器可能会像这样升级并破坏整个复制集上的数据。这可能真的会伤害我们的客户和我们。幸运的是,它只破坏了一些小的集合。@JJussi您还能够提供到该bug的链接吗?有问题页面吗?SERVER-23663和SERVER-22502Thank@JJussi我仔细检查了所有节点上的所有日志,没有选择。那么它回来了
2017-01-13T13:01:35.576+0000 E REPL [repl writer worker 9] update of non-mod failed: { ts: Timestamp 1484301755000|10, t: 1, h: -7625794279778931676, v: 2, op: "u", ns: ...