部署自管理副本集
Overview
三个节点副本集提供了足够的冗余,足以应对大多数网络分区和其他系统故障。这些副本集的容量也足以满足许多分布式读操作的需求。副本集的节点数应始终为奇数。这将确保选举 顺利进行。有关设计副本集的更多信息,请参阅复制概述。
本页介绍如何部署用于自我管理部署的副本集。
要了解有关为 MongoDB Atlas 中托管的部署部署副本集的更多信息,请参阅 创建集群。
要求
对于生产部署,您应通过在不同的计算机上托管 mongod
实例来尽可能保持各节点之间的分离。使用虚拟机进行生产部署时,应将每个 mongod
实例放在由冗余电源电路和冗余网络路径提供服务的独立主机服务器上。
在部署副本集之前,必须在每个将成为副本集一部分的系统上安装 MongoDB。如果您尚未安装 MongoDB,请参阅安装教程。
部署副本集时的注意事项
架构
在生产中,将副本集的每个成员部署到其自己的计算机上。如果可能,请确保 MongoDB 监听默认端口 27017
。
有关详细信息,请参阅《副本集部署架构》。
主机名
重要
要避免因 IP 地址变更而更新配置,请使用 DNS 主机名而非 IP 地址。在配置副本集成员或分片集群成员时,使用 DNS 主机名而非 IP 地址尤为重要。
在水平分割网络配置下,请使用主机名而非 IP 地址来配置集群。从 MongoDB 5.0 开始,仅配置了 IP 地址的节点将无法通过启动验证,因而不会启动。
IP 绑定
使用 --bind_ip
选项确保 MongoDB 在配置地址监听来自应用程序的连接。
警告
将实例绑定到可公开访问的 IP 地址之前,必须保护集群免遭未经授权的访问。有关安全建议的完整列表,请参阅自管理部署的安全清单。至少应考虑启用身份验证和强化网络基础设施。
MongoDB 二进制文件 mongod
和 mongos
默认绑定到本地主机。如果为此二进制文件设置了 net.ipv6
配置文件设置或 --ipv6
命令行选项,则该二进制文件还会绑定到本地主机 IPv6 地址。
默认情况下,绑定到本地主机的 mongod
和 mongos
只接受来自同一计算机上运行的客户端的连接。这种绑定行为包括 mongosh
和副本集或分片集群的其他节点。远程客户端无法连接到仅绑定到本地主机的二进制文件。
要覆盖默认绑定并绑定到其他 IP 地址,请使用 net.bindIp
配置文件设置或 --bind_ip
命令行选项来指定主机名或 IP 地址的列表。
警告
从 MongDB5.0 开始, 水平分割 DNS 仅配置了 IP 地址的节点无法启动验证并报告错误。请参阅disableSplitHorizonIPCheck
。
例如,以下 mongod
实例会绑定到本地主机和主机名 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 转换为副本集。有关副本集部署的更多信息,请参阅复制和副本集部署架构文档。
使用适当的选项启动副本集的每个成员。
为每个成员启动一个 mongod
实例,设置如下:
将
replication.replSetName
选项设置为副本集名称。如果您的应用程序连接到多个副本集,则每个副本集的名称必须不同。将
net.bindIp
选项设置为主机名/IP,或使用逗号隔开的主机名/IP 列表。设置适合您的部署的任何其他设置。
在本教程中,三个 mongod
实例与以下主机相关联:
副本集成员 | 主机名 |
---|---|
成员 0 |
|
成员 1 |
|
成员 2 |
|
以下示例通过 --replSet
和 --bind_ip
命令行选项指定副本集名称和 IP 绑定:
警告
将实例绑定到可公开访问的 IP 地址之前,必须保护集群免遭未经授权的访问。有关安全建议的完整列表,请参阅自管理部署的安全清单。至少应考虑启用身份验证和强化网络基础设施。
mongod --replSet "rs0" --bind_ip localhost,<hostname(s)|ip address(es)>
对于 <hostname(s)|ip address(es)>
,指定您的 mongod
实例的主机名和/或 IP 地址,远程客户端(包括副本集的其他成员)可以使用它们连接到该实例。
或者,您也可以在配置文件中指定 replica set name
和 ip addresses
:
replication: replSetName: "rs0" net: bindIp: localhost,<hostname(s)|ip address(es)>
要使用配置文件启动 mongod
,请使用 --config
选项指定配置文件的路径:
mongod --config <path-to-config>
在生产部署中,您可以配置一个初始化脚本来管理此进程。初始化脚本超出了本文档的范围。
启动新副本集。
通过 mongosh
,在副本集成员 0 上运行 rs.initiate()
。
重要
仅在副本集的一个 mongod
实例上运行 rs.initiate()
。
重要
要避免因 IP 地址变更而更新配置,请使用 DNS 主机名而非 IP 地址。在配置副本集成员或分片集群成员时,使用 DNS 主机名而非 IP 地址尤为重要。
在水平分割网络配置下,请使用主机名而非 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 使用默认副本集配置启动副本集。
查看副本集配置。
rs.conf()
副本集配置对象与以下内容类似:
{ "_id" : "rs0", "version" : 1, "protocolVersion" : NumberLong(1), "members" : [ { "_id" : 0, "host" : "mongodb0.example.net:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "secondaryDelaySecs" : NumberLong(0), "votes" : 1 }, { "_id" : 1, "host" : "mongodb1.example.net:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "secondaryDelaySecs" : NumberLong(0), "votes" : 1 }, { "_id" : 2, "host" : "mongodb2.example.net:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "secondaryDelaySecs" : NumberLong(0), "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatIntervalMillis" : 2000, "heartbeatTimeoutSecs" : 10, "electionTimeoutMillis" : 10000, "catchUpTimeoutMillis" : -1, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 }, "replicaSetId" : ObjectId("585ab9df685f726db2c6a840") } }
确保副本集有一个主节点。
使用 rs.status()
标识副本集中的主节点。