独立的 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:27017mongodb1.example.net:27017mongodb2.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 文档维护者。本文为中文翻译,代码及命令保留原文。











暂无评论内容