mongodb - 将 mongoDB 集群转换为副本集时出错
问题描述
我们按照说明将具有单个分片的集群转换为副本集,但是一旦我们重新启动第一个辅助节点(总共 3 个辅助节点 + 1 个主节点)而没有该--shardsvr
选项,所有数据库客户端(已经直接连接到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。如何进行?谢谢!
解决方案
我认为可能的情况是矢量时钟 clusterTime在副本和/或您的客户端之间不同步。
本节专门讨论如何将 clusterTime 用于HMAC 签名。
clusterTime基本上每次写入 PRIMARY 时都会打勾,因此如果您以某种方式更改集群的配置,则会捕获一个刻度。如果您的客户端在该滴答之后没有正确更新其clusterTime,它可能会在尝试使用旧密钥对其请求进行HMAC签名时被发现。
如上所述,集群可能有问题,并且客户端心跳没有更正时钟。
也可能是您的客户端库在根据此票证进行身份验证握手时未更新 clusterTime:https ://jira.mongodb.org/browse/GODRIVER-1584 。
我只是在这里做一些笔记,因为从 3.6 升级到 4.0.21 时我也看到了这个错误。
我发现这是通过使用sourcegraph搜索存储库从 MongoDB 返回的。
该错误来自KeysCollectionManager::getKeysForValidation,并且根源于KeysCollectionCache::getInternalByKeyId方法。
这个特殊的 KeysCollectionManager似乎只为副本集实例化自己。它使用kKeyManagerPurposeString实例化,其值始终为“HMAC”。这是目的,我不确定。
go 客户端的globalsign/mgo fork 有一些测试工具,表明他们以前遇到过这种情况,但不一定知道它来自哪里。他们假设它仅在您的副本集使用内部身份验证密钥文件时发生。
我希望这种情况可以通过多次重试来解决,直到成功。我打赌这主要是集群未处于就绪状态的问题。
我的情况与问题大不相同,因为我使用的是没有分片的独立副本集。我希望重试请求会有所帮助,但这可能是一个集群成员问题,需要在 MongoDB 本身上解决。
MongoDB 社区中的这篇文章可能表明这是一个集群内部问题,寻找可疑的 MongoDB 日志将是关键。
推荐阅读
- javascript - 'node' 不是内部或外部命令、可运行程序或批处理文件
- python - 如何修复 AttributeError:“int”对象在双向层中没有属性“get_config”
- .net - CodeDeploy 完成部署后如何保持应用程序运行
- sql - Oracle SQL 过程 - 从一个 API 的结果输出作为另一个 API 的输入
- reactjs - 反应超时和清除超时
- bash - 如何从 rsync 目标路径中删除 /Volume
- firebase - Flutter:如何收听 FirebaseUser 是电子邮件验证的布尔值?
- javascript - 有人在研究 ECMAScript ReDoS 保护吗?
- javascript - axios请求后如何显示项目名称
- javascript - javascript:如何使用空格拆分此命令行字符串,但 args 包含空格