短版:有没有办法将新的 SECONDARY 服务器添加到现有的生产 MongoDB 副本集而无需停机,并且无需暂时禁用现有服务器上的“auth”和“keyfile”配置设置?
长版:我当前的生产环境由三台 Windows 2012 R2 DataCenter 服务器组成,运行 MongoDB 版本 2.4.9 作为服务:
PRIMARY - ServerA.example.org:27017
SECONDARY - ServerB.example.org:27017
ARBITER - ServerC.example.org:27017
我在环境中有两个 MongoDB 用户帐户:
{ "_id" : ObjectId("XXXXXXXXXX"), "pwd" : "XXXXXXXXXX", "user" : "mongo-admin", "roles" : [ "userAdminAnyDatabase" ] }
{ "_id" : ObjectId("XXXXXXXXXX"), "pwd" : "XXXXXXXXXX", "user" : "mongo-cluster-admin", "roles" : [ "clusterAdmin" ] }
现有服务器上的配置文件如下所示:
logpath=C:\mongo\logs\mongo.log
dbpath=C:\mongo\data
replSet=rs
oplogSize=700
port=27017
auth=true
keyFile=C:\mongo\config\keyfile.txt
我想将 ServerD 和 ServerE 添加为新的 SECONDARY 服务器。
我已经从我的工作站和 ServerA 上的本地控制台尝试了以下操作,在 ServerD 的配置中使用和不使用“auth”和“keyfile”,但在所有情况下我都得到相同的结果:
D:\MongoDB\bin>mongo ServerA.example.org:27017
MongoDB shell version: 2.4.7
connecting to: ServerA.example.org:27017/test
> use admin
switched to db admin
> db.auth("mongo-cluster-admin", "XXXXXXXXXX")
1
rs:PRIMARY> rs.add("ServerD.example.org:27017")
Mon May 19 11:41:42.050 count failed: { "ok" : 0, "errmsg" : "unauthorized" } at src/mongo/shell/query.js:180
我能够在测试环境中使用它的唯一方法是,如果我禁用所有五台服务器上的“auth”和“keyfile”设置,然后使用“rs.add()”将新服务器添加到副本集中" 在 PRIMARY 上,最后在所有服务器上重新启用 "auth" 和 "keyfile"。这需要在每个盒子上重新启动几次 MongoDB 服务来更新配置设置,我真的想避免这种情况。
有没有办法在不首先更改现有服务器上的“auth”和“keyfile”设置的情况下将新的 SECONDARY 服务器添加到副本集中?
只需添加启用身份验证并从一开始就使用相同密钥文件的新辅助节点。如果您这样做,他们将连接,使用密钥文件进行身份验证,然后从头开始同步 - 没有理由更改集合的原始成员,只需确保您添加的新成员具有正确(相同的)密钥文件作为原始成员。
要确保的另一件事是您通过身份验证的用户具有执行添加的正确权限(因为关闭身份验证也可以解决该问题)。作为参考,具有相关权限的内置角色是2.6+的 clusterManager - clusterAdmin应该也可以工作,并且具有 2.4 中存在的优势。
根据评论讨论,
clusterAdmin
2.4 中的警告是,尽管您有权运行相关命令,但您需要对本地数据库具有读取权限(根据 2.4 文档的组合访问部分)才能使用rs.conf ()命令。它不是严格要求的,但是如果没有它,您将不得不从头开始构建整个配置文档以执行重新配置命令,这肯定不方便。