为自管理分片集群旋转密钥
分片集群成员可以使用密钥文件来验证彼此是该部署的成员。
一个 密钥文件可以包含多个密钥,如果成员之间至少有一个密钥是共同的,则建立成员身份验证。这允许在不中断服务的情况下滚动升级密钥。
以下教程逐步介绍了一个过程,该过程可以在不停机的情况下更新分片集群的密钥。[1]
警告
本教程中的示例密钥仅用于说明目的。请勿用于您的部署。相反,使用您选择的方法(例如openssl rand -base64 756
等)生成密钥文件。
考虑一个分片集群,其中每个成员的密钥文件包含以下密钥

以下过程更新分片集群成员以使用新密钥

[1] | 本教程不适用于用于MongoDB本地密钥管理的MongoDB加密存储引擎的密钥文件。该密钥文件只能包含一个密钥。 |
开始之前
从MongoDB 8.0开始,您可以使用directShardOperations
角色执行需要直接针对分片执行命令的维护操作。
警告
使用directShardOperations
角色运行命令可能会导致您的集群无法正确工作并可能导致数据损坏。仅在使用维护目的或MongoDB支持的指导下使用directShardOperations
角色。一旦完成维护操作,请停止使用directShardOperations
角色。
过程
1. 修改密钥文件以包含旧密钥和新密钥
修改每个成员的密钥文件以包含旧密钥和新密钥。
警告
本教程中的示例密钥仅用于说明目的。请不要用于您的部署。相反,使用您选择的任何方法生成密钥文件(例如,openssl rand -base64 756
等)。
您可以将多个密钥字符串指定为一系列密钥字符串(可选地用引号括起来)。

1. 重启每个成员
一旦所有密钥文件都包含旧密钥和新密钥,逐个重启每个成员。
配置服务器
对于配置服务器副本集(CSRS)的每个次要副本,连接到成员并mongosh
到成员并
使用
db.shutdownServer()
方法关闭成员use admin db.shutdownServer() 重启成员。
对于主节点,连接到成员的 mongosh
并
使用
rs.stepDown()
将成员降级rs.stepDown() 使用
db.shutdownServer()
方法关闭成员use admin db.shutdownServer() 重启成员。
分片副本集
对于每个分片副本集的次要成员,连接到成员的 mongosh
并
使用
db.shutdownServer()
方法关闭成员use admin db.shutdownServer() 重启成员。
对于每个分片副本集的主节点,连接到成员的 mongosh
并
使用
rs.stepDown()
将成员降级rs.stepDown() 使用
db.shutdownServer()
方法关闭成员use admin db.shutdownServer() 重启成员。
mongos
路由器
对于每个 mongos/router 实例,连接到 mongosh
的 mongos
实例并
使用
db.shutdownServer()
方法关闭成员use admin db.shutdownServer() 重启成员。
一旦所有成员都已重启,成员现在可以接受旧的或新的密钥进行成员身份验证。
3. 仅将密钥文件内容更新为新密钥
警告
本教程中的示例密钥仅用于说明目的。请不要用于您的部署。相反,使用您选择的任何方法生成密钥文件(例如,openssl rand -base64 756
等)。
修改每个成员的密钥文件,仅包含新密码。

4. 重启每个成员
一旦所有密钥文件只包含新密钥,逐个重启每个成员。
配置服务器
对于配置服务器副本集(CSRS)的每个次要成员,连接到 mongosh
并
使用
db.shutdownServer()
方法关闭成员use admin db.shutdownServer() 重启成员。
对于主节点,连接到成员的 mongosh
并
使用
rs.stepDown()
将成员降级rs.stepDown() 使用
db.shutdownServer()
方法关闭成员use admin db.shutdownServer() 重启成员。
分片副本集
对于每个分片副本集的次要成员,连接到成员的 mongosh
并
使用
db.shutdownServer()
方法关闭成员use admin db.shutdownServer() 重启成员。
对于每个分片副本集的主节点,连接到成员的 mongosh
并
使用
rs.stepDown()
将成员降级rs.stepDown() 使用
db.shutdownServer()
方法关闭成员use admin db.shutdownServer() 重启成员。
mongos
路由器
对于每个 mongos/router 实例,连接到 mongosh
的 mongos
实例并
使用
db.shutdownServer()
方法关闭成员use admin db.shutdownServer() 重启成员。
所有成员重启后,成员现在只接受新的密钥进行成员身份验证。