我们按照instructions将带有单个碎片的集群转换为副本集,但在不使用--shardsvr
选项的情况下重新启动第一个辅助节点(总共3个辅助节点+ 1个主节点)后,所有数据库客户端(它们已经直接连接到replSet,而不是连接到mongoS路由器,没有问题)在查询数据库时收到以下错误:Query failed with error code 211 and error message 'Cache Reader No keys found for HMAC that is valid for time: { ts: Timestamp(1585205456, 422) } with id: 6802955028354040016' on server our-db-server.domain.com:27017
因此,我们已经立即撤销了更改。此错误使我们无法将单碎片集群转换为独立的replSet。如何继续?谢谢!
2条答案
按热度按时间jdzmm42g1#
我认为可能的情况是,复制副本和/或客户端之间的向量clockclusterTime不同步。
本节专门介绍如何将clusterTime用于HMAC signatures。
clusterTime基本上在每次写入PRIMARY时都会发出嘀嗒声,因此如果您以某种方式更改群集的配置,则会捕获嘀嗒声。如果您的客户端在该嘀嗒声后未正确更新其clusterTime,则可能会捕获它尝试使用旧密钥对其请求进行HMAC签名。
如上所述,群集可能出现问题,客户端心跳信号无法校正时钟。
也可能是您的客户端库在按照以下票证执行身份验证握手时未更新clusterTime:https://jira.mongodb.org/browse/GODRIVER-1584。
我在这里做一些记录,因为我在从3.6升级到4.0.21时 * 也 * 看到了此错误。
我发现这是通过使用sourcegraph搜索repo从MongoDB返回的。
该错误来自KeysCollectionManager::getKeysForValidation,并且根源在于KeysCollectionCache::getInternalByKeyId方法。
这个特殊的KeysCollectionManager似乎只为副本集示例化了它自己。它是用kKeyManagerPurposeString示例化的,它的值总是“HMAC”。我不确定它的用途。
go客户端的globalsign/mgo fork有一些测试工具表明他们以前遇到过这种情况,但不一定知道它来自哪里。他们假设只有当你的副本集使用内部auth密钥文件时才会发生这种情况。
我希望这种情况可以通过多次重试直到成功来解决。我打赌这主要是集群没有处于就绪状态的问题。
我的情况与问题有很大的不同,因为我使用的是一个没有分片的独立副本集。我希望重试请求会有所帮助,但这可能是一个集群成员问题,需要在MongoDB上解决。
此post in the MongoDB community可能表明这是群集内部问题,查找可疑的MongoDB日志将是关键。
h9a6wy2h2#
我们也有这个错误,重新启动所有成员后,它的修复!