将独立部署的 MongoDB mongod 转换为副本集

独立的 mongod 实例适合测试与开发,不适合生产部署,因为它可能成为单点故障。副本集提供冗余和可用性,生产环境应始终使用副本集。

如果独立服务器上已经有数据,并且希望用于生产,应先把它转换为副本集。

重要:将开发服务器转换为生产副本集之前,请先查阅安全检查清单。务必在集群暴露到互联网之前完成。

也可以将独立服务器迁移到 MongoDB Atlas 集群。Atlas 是面向云端 MongoDB 部署的全托管服务。详情参阅 Atlas 文档中的数据迁移或导入说明。

本任务的服务器架构

本教程使用以下服务器:

主机名 端口 说明
mongodb0.example.net 27017 正在运行、已有数据的独立 MongoDB 服务器
mongodb1.example.net 27017 准备加入副本集的新 MongoDB 服务器
mongodb2.example.net 27017 准备加入副本集的新 MongoDB 服务器

开始之前

集群类型

转换独立实例之前,应考虑副本集还是分片集群更适合工作负载。分片集群通过把数据分布到各个分片来提供冗余和可用性;分片通常部署在多台服务器上,以支持水平扩展。

授权

如果副本集需要启用授权,还必须配置成员使用 X.509 证书或密钥文件进行内部身份验证。详情参阅 MongoDB 文档中“使用 X.509 验证自管理集群成员资格”和“使用密钥文件身份验证部署自管理副本集”。

操作步骤

1. 关闭独立实例

使用 mongosh 连接现有的 mongod:

mongosh "mongodb://mongodb0.example.net:27017"

切换到 admin 数据库,运行 shutdown:

use admin
db.adminCommand(
   {
      shutdown: 1,
      comment: "Convert to replica set"
   }
)

执行关闭命令后,服务器会返回类似信息:

MongoNetworkError: connection <connection number> to <host>:<port> closed

2. 配置副本集成员

更新每台服务器的配置文件,设置 replSetName:

replication:
  replSetName: "rs0"

3. 配置成员身份验证

为副本集中的每台服务器配置成员身份验证。

使用 X.509 证书

将副本集配置为使用 X.509 证书进行内部成员身份验证。

配置项 命令行选项 说明
net.tls.mode --tlsMode 设置身份验证的 TLS 模式。要求 X.509 证书验证时,设为 requireTLS
net.tls.certificateKeyFile --tlsCertificateKeyFile 包含客户端连接 TLS 证书的 .pem 文件路径
net.tls.CAFile --tlsCAFile 包含证书颁发机构(CA)根证书链的文件路径
net.tls.clusterFile --tlsClusterFile 包含集群成员连接 TLS 证书的 .pem 文件路径
security.clusterAuthMode --clusterAuthMode 集群成员身份验证模式。使用 X.509 时设为 x509

例如:

replication:
  replSetName: "rs0"
security:
  clusterAuthMode: x509
net:
  tls:
    mode: requireTLS
    certificateKeyFile: /etc/mongodb/client.pem
    CAFile: /etc/mongodb/ca.pem
    clusterFile: /etc/mongodb/member.pem

使用密钥文件

将副本集配置为使用密钥文件进行内部成员身份验证。每个成员都必须拥有同一密钥文件的副本。

配置项 命令行选项 说明
security.keyFile --keyFile 副本集密钥文件的路径

例如:

replication:
   replSetName: "rs0"
security:
    keyFile: /etc/mongodb/keyfile

不启用授权

也可以配置不启用授权的副本集。

警告:这种配置只应当用于无法通过网络访问的内部副本集。

配置项 命令行选项 说明
net.bindIp --bind_ip MongoDB 监听客户端连接的主机名或 IP 地址。要阻止网络访问,设为 localhost

例如:

replication:
  replSetName: "rs0"
net:
   bindIp: localhost

4. 启动 MongoDB

为每个成员启动 mongod。

5. 初始化副本集

使用 mongosh 重新连接服务器实例:

mongosh "mongodb://mongodb0.example.net:27017"

然后执行 rs.initiate():

rs.initiate()

副本集只需要初始化一次。使用 rs.conf() 查看配置,使用 rs.status() 检查状态。

6. 向副本集添加节点

此时新的副本集只有一个主节点。添加更多节点前,请阅读副本集架构,以及向副本集添加成员的文档。

使用 rs.add() 添加节点:

rs.add("mongodb1.example.net:27017")
rs.add("mongodb2.example.net:27017")

7. 检查复制状态

运行 rs.status(),检查 members 字段是否列出了新成员,以确认副本集配置正确:

rs.status()

8. 更新应用连接字符串

转换完成后,将应用使用的连接字符串改为副本集连接字符串,包含以下成员:

  • mongodb0.example.net:27017
  • mongodb1.example.net:27017
  • mongodb2.example.net:27017
mongodb://mongodb0.example.net:27017,mongodb1.example.net:27017,mongodb2.example.net:27017

然后重启应用。

延伸阅读

  • MongoDB 配置选项。
  • 部署独立实例。
  • 部署新的副本集。

原文:Convert a Standalone Self-Managed mongod to a Replica Set。作者/维护方:MongoDB 文档维护者。本文为中文翻译,代码及命令保留原文。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容