部署用于测试和开发的自管理副本集
此过程介绍如何在开发或测试环境中部署副本集。对于生产部署,请参阅 部署自管理副本集教程。
Overview
三个成员副本集提供了足够的冗余,足以应对大多数网络分区和其他系统故障。这些副本集的容量也足以满足许多分布式读操作的需求。副本集的成员数应始终为奇数。这将确保选举顺利进行。有关设计副本集的更多信息,请参阅复制概述。
要求
对于测试和开发系统,可以在本地系统上或虚拟实例内运行您的 mongod
实例。
在部署副本集之前,必须在每个将成为副本集一部分的系统上安装 MongoDB。如果您尚未安装 MongoDB,请参阅安装教程。
每个成员均须能连接到所有其他成员。关于如何检查连接,请参阅《测试所有成员之间的连接》。
Considerations
重要
要避免因 IP 地址变更而更新配置,请使用 DNS 主机名而非 IP 地址。在配置副本集成员或分片集群成员时,使用 DNS 主机名而非 IP 地址尤为重要。
在水平分割网络配置下,请使用主机名而非 IP 地址来配置集群。从 MongoDB 5.0 开始,仅配置了 IP 地址的节点将无法通过启动验证,因而不会启动。
IP 绑定
警告
将实例绑定到可公开访问的 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
在此测试部署中,这三个成员运行于同一台机器上。
副本集命名
重要
这些说明只应用于测试或开发部署。
此过程中的示例创建名为 rs0
的新副本集。
如果您的应用程序连接到多个副本集,则每个副本集的名称必须不同。有些驱动程序会按副本集名称对副本集连接进行分组。
步骤
重要
要避免因 IP 地址变更而更新配置,请使用 DNS 主机名而非 IP 地址。在配置副本集成员或分片集群成员时,使用 DNS 主机名而非 IP 地址尤为重要。
在水平分割网络配置下,请使用主机名而非 IP 地址来配置集群。从 MongoDB 5.0 开始,仅配置了 IP 地址的节点将无法通过启动验证,因而不会启动。
发出类似于以下内容的命令,为每个节点创建必要的数据目录:
mkdir -p /srv/mongodb/rs0-0 /srv/mongodb/rs0-1 /srv/mongodb/rs0-2 这样可创建名为 "rs0-0"、"rs0-1" 和 "rs0-2" 的目录,其中将包含实例的数据库文件。
发出以下命令,在相应 shell 窗口中启动
mongod
实例:警告
将实例绑定到可公开访问的 IP 地址之前,必须保护集群免遭未经授权的访问。有关安全建议的完整列表,请参阅自管理部署的安全清单。至少应考虑启用身份验证和强化网络基础设施。
第一个节点:
mongod --replSet rs0 --port 27017 --bind_ip localhost,<hostname(s)|ip address(es)> --dbpath /srv/mongodb/rs0-0 --oplogSize 128 第二个节点:
mongod --replSet rs0 --port 27018 --bind_ip localhost,<hostname(s)|ip address(es)> --dbpath /srv/mongodb/rs0-1 --oplogSize 128 第三个节点:
mongod --replSet rs0 --port 27019 --bind_ip localhost,<hostname(s)|ip address(es)> --dbpath /srv/mongodb/rs0-2 --oplogSize 128 它会将每个实例作为名为
rs0
的副本集的某一成员来启动,且每个成员均运行于不同端口上;同时,使用--dbpath
设置来指定数据目录的路径。如果您已在使用推荐的端口,则请选择其他端口。实例绑定到主机的 IP 地址以及本地主机。
--oplogSize
设置可减少每个mongod
实例使用的磁盘空间。[1] 这非常适合测试和开发部署,因为它可以防止机器过载。有关此选项和其他配置选项的更多信息,请参阅自管理配置文件选项。通过
mongosh
连接到您的一个mongod
实例。您需要通过指定端口号来指示具体实例。选择第一个会更加简单明了,如以下命令所示;mongosh --port 27017 在
mongosh
中,使用rs.initiate()
启动副本集。您可以在mongosh
环境中创建副本集配置对象,如以下示例所示:rsconf = { _id: "rs0", members: [ { _id: 0, host: "<hostname>:27017" }, { _id: 1, host: "<hostname>:27018" }, { _id: 2, host: "<hostname>:27019" } ] } 将
<hostname>
替换为系统的主机名,然后将rsconf
文件传递给rs.initiate()
,如下所示:rs.initiate( rsconf ) 通过发出以下命令显示,当前副本集配置:
rs.conf() 副本集配置对象与以下内容类似:
{ "_id" : "rs0", "version" : 1, "protocolVersion" : NumberLong(1), "members" : [ { "_id" : 0, "host" : "<hostname>:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "secondaryDelaySecs" : NumberLong(0), "votes" : 1 }, { "_id" : 1, "host" : "<hostname>:27018", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "secondaryDelaySecs" : NumberLong(0), "votes" : 1 }, { "_id" : 2, "host" : "<hostname>:27019", "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("598f630adc9053c6ee6d5f38") } }
使用 rs.status()
操作可随时检查副本集的状态。
[1] | oplog 的大小可能会超过其配置的大小限制,从而避免删除 majority commit point 。 |