部署自托管副本集
概述
三个成员副本集(replica sets)提供足够的冗余,以应对大多数网络分区和其他系统故障。这些集还具备足够的容量来执行大量分布式读操作。副本集应始终包含奇数个成员。这确保了选举可以顺利执行。有关设计副本集的更多信息,请参阅复制概述。
本页涵盖如何部署副本集用于自托管部署。
要了解更多关于部署副本集的信息请参阅在MongoDB Atlas中托管的部署创建集群.
要求
对于生产部署,您应该通过在不同的机器上托管 mongod
实例来尽可能保持成员之间的分离。当使用虚拟机进行生产部署时,应将每个 mongod
实例放置在由冗余电源电路和冗余网络路径服务的独立主机服务器上。
在您能够部署副本集之前,必须在将成为您 副本集一部分的每个系统上安装MongoDB。如果您尚未安装MongoDB,请参阅安装教程。
部署副本集时的注意事项
架构
在生产中,将副本集的每个成员部署到其自己的机器上。如果可能的话,请确保MongoDB监听默认端口27017
。
更多信息,请参阅副本集部署架构。
主机名
重要
为了避免由于IP地址变化而进行的配置更新,请使用DNS主机名而不是IP地址。当配置副本集成员或分片集群成员时,使用DNS主机名而不是IP地址尤为重要。
在跨越分割网络视界的集群中配置时,请使用主机名而不是IP地址。从MongoDB 5.0开始,仅配置了IP地址的节点将无法通过启动验证并无法启动。
IP 绑定
使用 --bind_ip
选项确保 MongoDB 在配置的地址上监听来自应用程序的连接。
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。
例如,以下 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 | mongodb0.example.net |
成员 1 | mongodb1.example.net |
成员 2 | mongodb2.example.net |
以下示例指定了副本集名称和通过 --replSet
和 --bind_ip
命令行选项绑定的 ip
mongod --replSet "rs0" --bind_ip localhost,<hostname(s)|ip address(es)>
<hostname(s)|ip address(es)>
:指定远程客户端(包括副本集的其他成员)可以用来连接实例的主机名(s)和/或 ip 地址。
或者,您也可以在配置文件中指定 副本集名称
和 ip 地址
:
replication: replSetName: "rs0" net: bindIp: localhost,<hostname(s)|ip address(es)>
要使用配置文件启动 mongod
,请使用 --config
选项指定配置文件的路径
mongod --config <path-to-config>
在生产部署中,您可以配置一个 init 脚本 来管理此过程。init 脚本超出了本文档的范围。
初始化副本集。
从 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()
显示副本集配置对象:
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()
识别副本集中的主节点。