将mongoDB群集转换为副本集时出错

将mongoDB群集转换为副本集时出错,mongodb,Mongodb,我们遵循将具有单个碎片的集群转换为副本集的步骤,但一旦我们在不使用--shardsvr选项的情况下重新启动第一个辅助服务器(总共3个辅助服务器+1个主服务器),所有数据库客户机(它们已经直接连接到replSet,而没有问题,而是连接到mongoS路由器)查询数据库时收到以下错误: 查询失败,错误代码211,错误消息“缓存读取器找不到对时间有效的HMAC密钥:{ts:Timestamp(158520564422)},id:68029550283544040016”,在服务器上我们的db serve

我们遵循将具有单个碎片的集群转换为副本集的步骤,但一旦我们在不使用
--shardsvr
选项的情况下重新启动第一个辅助服务器(总共3个辅助服务器+1个主服务器),所有数据库客户机(它们已经直接连接到replSet,而没有问题,而是连接到mongoS路由器)查询数据库时收到以下错误:

查询失败,错误代码211,错误消息“缓存读取器找不到对时间有效的HMAC密钥:{ts:Timestamp(158520564422)},id:68029550283544040016”,在服务器上我们的db server.domain.com:27017

因此,我们立即扭转了这一变化。 这个错误使得我们无法将单个碎片集群转换为独立的复制集。 如何进行?
谢谢

我认为可能的情况是副本和/或您的客户端之间的数据不同步

这涉及如何使用clusterTime来完成任务

基本上,对主服务器的每次写入都会有滴答声,因此如果您以某种方式更改集群的配置,就会捕获滴答声。如果您的客户端在打勾后没有正确更新其密码,则可能会被发现试图使用旧密钥对其请求进行签名

如上所述,集群可能有问题,客户端没有更正时钟

也可能是您的客户端库在按照以下票证进行身份验证握手时未更新clusterTime:


我将在这里做一些记录,因为我在从3.6升级到4.0.21时也看到了这个错误

通过使用搜索repo,我发现这是从MongoDB返回的

错误来自于方法,并且根源于方法

这一特殊情况似乎只是为复制集实例化了自身。它是使用实例化的,其值始终为“HMAC”。这是目的,我不确定

go客户机的fork有一些测试工具,表明他们以前遇到过这种情况,但不一定知道它来自哪里。他们假设只有当副本集使用内部身份验证密钥文件时才会发生这种情况

我希望通过多次重试来解决这种情况,直到成功。我打赌这主要是集群没有处于就绪状态的问题

我的情况与问题大不相同,因为我使用的是没有切分的独立副本集。我希望重试请求会有所帮助,但这可能是一个集群成员问题,需要在MongoDB本身上解决


这可能表明这是一个集群内部问题,寻找可疑的MongoDB日志将是关键。

我认为可能的情况是副本和/或您的客户端之间不同步

这涉及如何使用clusterTime来完成任务

基本上,对主服务器的每次写入都会有滴答声,因此如果您以某种方式更改集群的配置,就会捕获滴答声。如果您的客户端在打勾后没有正确更新其密码,则可能会被发现试图使用旧密钥对其请求进行签名

如上所述,集群可能有问题,客户端没有更正时钟

也可能是您的客户端库在按照以下票证进行身份验证握手时未更新clusterTime:


我将在这里做一些记录,因为我在从3.6升级到4.0.21时也看到了这个错误

通过使用搜索repo,我发现这是从MongoDB返回的

错误来自于方法,并且根源于方法

这一特殊情况似乎只是为复制集实例化了自身。它是使用实例化的,其值始终为“HMAC”。这是目的,我不确定

go客户机的fork有一些测试工具,表明他们以前遇到过这种情况,但不一定知道它来自哪里。他们假设只有当副本集使用内部身份验证密钥文件时才会发生这种情况

我希望通过多次重试来解决这种情况,直到成功。我打赌这主要是集群没有处于就绪状态的问题

我的情况与问题大不相同,因为我使用的是没有切分的独立副本集。我希望重试请求会有所帮助,但这可能是一个集群成员问题,需要在MongoDB本身上解决


这可能表明这是一个集群内部问题,寻找可疑的MongoDB日志将是关键。

如果您仅从一些成员中删除
--shardsvr
选项,副本集将无法正常工作。我认为您需要停止所有成员,删除shardsvr选项,然后重新启动所有成员。感谢Joe提供的见解。因此,这意味着没有停机,转换就无法进行。这应该在mongodb文档中提到!哪个存储引擎?MMAPv1或WiredTiger?@Breely WiredTiger如果仅从某些成员中删除
--shardsvr
选项,副本集将无法正常工作。我认为您需要停止所有成员,删除shardsvr选项,然后重新启动所有成员。感谢Joe提供的见解。因此,这意味着没有停机,转换就无法进行。这应该在mongodb文档中提到!哪个存储引擎?MMAPv1还是WiredTiger?@Breely WiredTiger这个问题很有希望:我在最初的问题中没有提到我们的客户机只使用java驱动程序。我们所有的服务器都有相同的时间,因为它们的时间是由ntp服务器同步的。你认为你的答案可能仍然与我们的问题有关吗?当我们在MMAP上进行测试时,我们的答案是可复制的。因此,似乎有不同的原因引起了这个问题。什么版本的Java驱动程序?您是否继续体验到这种情况?我们正在使用3.10版或更高版本。