概述
由三个成员组成的副本集提供了足够的冗余,能够应对大多数网络分区和其他系统故障。这样的副本集也足以承担许多分布式读取操作。副本集应始终拥有奇数个成员,以确保选举顺利进行。关于副本集设计的更多信息,请参阅 复制概述。
本文介绍如何为自托管部署建立副本集。如果要在 MongoDB Atlas 托管的部署中建立副本集,请参阅 创建集群。
要求
在生产部署中,每个 mongod 实例都应部署在独立机器上,并使用冗余供电线路与冗余网络路径。虚拟机中运行的实例也应遵循这一要求。
部署副本集之前,必须在将要加入副本集的每台系统上安装 MongoDB。如果尚未安装,请参阅 安装教程。
部署副本集时的注意事项
架构
在生产环境中,将副本集的每个成员部署到各自的机器上。如果可以,确保 MongoDB 监听默认端口 27017。
注意:除滚动升级期间外,副本集中的所有 mongod 成员都应使用相同的 MongoDB 主版本。
更多信息请参阅 副本集部署架构。
主机名
重要:为避免 IP 地址变化导致配置需要更新,请使用 DNS 主机名,而不是 IP 地址。配置副本集成员或分片集群成员时,这一点尤其重要。
配置跨分割网络视域的集群时,应使用主机名,而不是 IP 地址。从 MongoDB 5.0 开始,只配置 IP 地址的节点将无法通过启动验证,也不会启动。
IP 绑定
使用 --bind_ip 选项,确保 MongoDB 在配置的地址上监听来自应用程序的连接。
警告:在将实例绑定到可公开访问的 IP 地址之前,必须保护集群,防止未经授权的访问。完整的安全建议请参阅 自托管部署安全检查清单。至少应考虑启用身份验证,并加固网络基础设施。
MongoDB 的 mongod 和 mongos 二进制程序默认绑定到 localhost。如果为程序设置了配置文件中的 net.ipv6 选项或命令行的 --ipv6 选项,程序还会绑定到 localhost 的 IPv6 地址。
默认情况下,绑定到 localhost 的 mongod 和 mongos 只接受同一台计算机上运行的客户端连接。mongosh 以及副本集或分片集群中的其他成员也受此绑定行为约束。远程客户端无法连接到只绑定 localhost 的程序。
要覆盖默认绑定并绑定其他 IP 地址,请通过配置文件中的 net.bindIp 或命令行中的 --bind_ip 指定主机名或 IP 地址列表。
警告:从 MongoDB 5.0 开始,仅配置 IP 地址的分割视域 DNS 节点会在启动验证时失败并报告错误。请参阅 disableSplitHorizonIPCheck。
例如,下面的 mongod 实例同时绑定到 localhost 和主机名 My-Example-Associated-Hostname,后者对应 IP 地址 198.51.100.1:
mongod --bind_ip localhost,My-Example-Associated-Hostname
远程客户端要连接此实例,必须指定该主机名或其对应的 IP 地址 198.51.100.1:
mongosh --host My-Example-Associated-Hostname
mongosh --host 198.51.100.1
连通性
确保副本集所有成员与网络中的所有客户端之间都可以安全地传输网络流量。请考虑以下事项:
- 建立虚拟专用网络。确保网络拓扑将同一站点内所有成员之间的流量都路由到局域网。
- 配置访问控制,防止未知客户端连接副本集。
- 配置网络与防火墙规则,仅允许部署内部的流量通过 MongoDB 默认端口收发。请同时考虑前面的 IP 绑定说明。
确保副本集的每个成员都能通过可解析的 DNS 名称或主机名访问。可以正确配置 DNS 名称,也可以在系统的 /etc/hosts 文件中反映这一配置。
每个成员都必须能够连接其他所有成员。连接检查的操作说明见 测试所有成员之间的连接。
配置
部署 MongoDB 之前,先创建 MongoDB 存储数据文件的目录。
在 /etc/mongod.conf 或相关位置的配置文件中指定 mongod 配置。
配置选项的更多信息见 自托管配置文件选项。
在终端部署副本集
以下步骤使用三个现有的 mongod 实例创建一个三成员副本集,这些实例在禁用访问控制的状态下运行。
若要部署启用访问控制的副本集,请参阅 使用密钥文件身份验证部署自托管副本集。若要从单个 MongoDB 实例建立副本集,请参阅 将独立的自托管 mongod 转换为副本集。其他部署信息见 复制 与 副本集部署架构 文档。
1. 使用适当的选项启动各个副本集成员
针对每个成员,使用以下设置启动一个 mongod 实例:
- 将
replication.replSetName设置为副本集名称。如果应用程序连接多个副本集,每个副本集都必须有不同的名称。 - 将
net.bindIp设置为主机名或 IP 地址,或者以逗号分隔的主机名、IP 地址列表。 - 根据部署需求设置其他选项。
在本教程中,三个 mongod 实例分别对应以下主机:
| 副本集成员 | 主机名 |
|---|---|
| 成员 0 | mongodb0.example.net |
| 成员 1 | mongodb1.example.net |
| 成员 2 | mongodb2.example.net |
下面通过命令行选项 --replSet 和 --bind_ip 指定副本集名称与 IP 绑定。
警告:在将实例绑定到可公开访问的 IP 地址之前,必须保护集群免受未经授权的访问。完整建议见 自托管部署安全检查清单;至少应考虑启用身份验证和加固网络基础设施。
mongod --replSet "rs0" --bind_ip localhost,<hostname(s)|ip address(es)>
对于 <hostname(s)|ip address(es)>,请填写此 mongod 实例的主机名和/或 IP 地址,远程客户端,包括副本集的其他成员,将使用这些地址连接实例。
也可以在配置文件中指定副本集名称与 IP 地址:
replication:
replSetName: "rs0"
net:
bindIp: localhost,<hostname(s)|ip address(es)>
要使用配置文件启动 mongod,通过 --config 指定配置文件路径:
mongod --config <path-to-config>
在生产部署中,可以配置 init 脚本管理此进程。init 脚本不在本文的讨论范围内。
2. 使用 mongosh 连接一个 mongod 实例
在某个 mongod 所在的机器上启动 mongosh;本教程使用 mongodb0.example.net。连接监听 localhost 默认端口 27017 的 mongod 时,只需运行:
mongosh
根据 PATH 的配置,可能需要指定 mongosh 二进制文件的完整路径。如果 mongod 没有使用默认端口,则需要为 mongosh 指定 --port。
3. 初始化副本集
在副本集成员 0 的 mongosh 中运行 rs.initiate()。
重要:仅在副本集的一个 mongod 实例上运行 rs.initiate()。
重要:为避免 IP 地址变化导致配置需要更新,应使用 DNS 主机名而不是 IP 地址。配置副本集或分片集群成员时尤其如此。跨分割网络视域配置集群时也应使用主机名。从 MongoDB 5.0 开始,只配置 IP 地址的节点无法通过启动验证,也不会启动。
rs.initiate( {
_id : "rs0",
members: [
{ _id: 0, host: "mongodb0.example.net:27017" },
{ _id: 1, host: "mongodb1.example.net:27017" },
{ _id: 2, host: "mongodb2.example.net:27017" }
]
})
MongoDB 使用默认的副本集配置初始化副本集。
4. 查看副本集配置
使用 rs.conf() 显示副本集配置对象:
rs.conf()
副本集配置对象类似下面的内容:
{
"_id" : "rs0",
"version" : 1,
"protocolVersion" : Long(1),
"members" : [
{
"_id" : 0,
"host" : "mongodb0.example.net:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : Long(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "mongodb1.example.net:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : Long(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "mongodb2.example.net:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"secondaryDelaySecs" : Long(0),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : -1,
"getLastErrorModes" : {
},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("585ab9df685f726db2c6a840")
}
}
5. 确保副本集存在主节点
使用 rs.status() 识别副本集中的主节点。
延伸阅读:使用密钥文件身份验证部署自托管副本集。
原文:Deploy a Self-Managed Replica Set。作者/维护者:MongoDB 文档团队。本文为原文的中文译文;代码保留原文内容。











暂无评论内容