Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb Mongo可能的数据损坏将辅助数据返回到副本集_Mongodb_Mongodb Replica Set - Fatal编程技术网

Mongodb Mongo可能的数据损坏将辅助数据返回到副本集

Mongodb Mongo可能的数据损坏将辅助数据返回到副本集,mongodb,mongodb-replica-set,Mongodb,Mongodb Replica Set,我正在试图了解一些数据损坏的来源,这些数据损坏发生在次服务器返回到副本集的同一时间 我们有一个具有4个节点的生产副本集—3个数据承载节点和一个仲裁器 我从生产副本集中取出一个辅助副本(称之为X),并使用它为新的测试副本集播种种子,以进行一些性能基准测试。在为新副本集设定种子之后,我将X放回生产副本集中。在大约10小时内,我们接到客户投诉,称他们丢失了大约2天的数据X也已停产两天。因此,我们想知道重新引入X是否导致了一些数据恢复 时间安排非常接近,我们还没有找到任何合理的替代理论——因此这篇文章

我正在试图了解一些数据损坏的来源,这些数据损坏发生在次服务器返回到副本集的同一时间

我们有一个具有4个节点的生产副本集—3个数据承载节点和一个仲裁器

我从生产副本集中取出一个辅助副本(称之为
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: ...