本教程描述了如何从三个现有的 mongod 实例创建一个三成员 replica set,这些实例在禁用 access control 的情况下运行。
要部署启用了 access control 的 replica set
,请参阅 Deploy Replica Set With Keyfile Authentication。 如果您希望从单个 MongoDB 实例部署 replica set
,请参阅 Convert a Standalone to Replica Set。
有关 replica set
部署的更多信息,请参阅 Replication 和 Replica Set Deployment Architectures。
Overview 概述
三成员 replica sets 提供了足够的冗余来承受大多数网络分区和其他系统故障。 这些 sets
也有足够的容量用于许多分布式读取操作。 replica sets
应始终具有奇数个成员。 这样可以确保 elections(选举) 顺利进行。 有关设计 replica sets
的更多信息,请参阅 the Replication overview。
Requirements 必要条件
对于生产部署,您应该通过在不同的机器上托管 mongod 实例来尽可能多地保持成员之间的分离。 使用虚拟机进行生产部署时,您应该将每个 mongod 实例放在由冗余电源电路和冗余网络路径提供服务的单独主机服务器上。
在部署 replica set
之前,您必须在将成为 replica set 一部分的每个系统上安装 MongoDB。 如果您尚未安装 MongoDB,请参阅 installation tutorials。
Considerations When Deploying a Replica Set 部署 replica set 时的注意事项
Architecture 架构
在生产中,将 replica set
的每个成员部署到自己的机器上,并尽可能绑定到标准 MongoDB 端口 27017
。
有关详细信息,请参阅 Replica Set Deployment Architectures。
Hostnames 主机名称
:::warning
为避免由于 IP 地址更改而导致配置更新,请使用 DNS 主机名而不是 IP 地址。 在配置 replica set
成员或 sharded cluster(分片集群)
成员时,使用 DNS 主机名而不是 IP 地址尤为重要。
使用主机名而不是 IP 地址来配置跨网络分割的集群。 从 MongDB 5.0 开始,仅配置了 IP 地址的节点将无法启动验证并且不会启动。 :::
IP Binding IP 绑定
使用 [--bind_ip](https://www.mongodb.com/docs/manual/reference/program/mongod/#std-option-mongod.--bind_ip)
选项确保 MongoDB 在配置的地址上侦听来自应用程序的连接。
Changed in verion 3.6: :::danger 在绑定到 non-localhost(例如可公开访问的)IP 地址之前,请确保您已保护您的集群免受未经授权的访问。有关安全建议的完整列表,请参阅 Security Checklist。至少,考虑启用身份验证和强化网络基础设施。 :::
MongoDB 二进制文件 mongod 和 mongos 默认绑定到 localhost。如果为二进制设置了 net.ipv6 配置文件设置或 --ipv6
命令行选项,则二进制额外绑定到 localhost IPv6
地址。默认情况下,绑定到 localhost
的 mongod 和 mongos 只接受来自在同一台计算机上正在运行的客户端的连接。此绑定行为包括 mongosh 和 replica set
或 sharded cluster(分片集群)
的其他成员。远程客户端无法连接到仅绑定到 **localhost**
的二进制文件。要覆盖默认绑定并绑定到其他 IP 地址,请使用 net.bindIp 配置文件设置或 --bind_ip
命令行选项指定主机名或 IP 地址列表(a list of hostnames or IP addresses)。
:::danger 从 MongDB 5.0 开始,仅配置了 IP 地址的 split horizon DNS(水平分割 DNS) 节点无法通过启动验证并报告错误。请参阅 disableSplitHorizonIPCheck。 :::
例如,以下 mongod 实例绑定到 localhost
和与 IP 地址 198.51.100.1
关联的主机名 My-Example-Associated-Hostname
:
mongod --bind_ip localhost,My-Example-Associated-Hostname
为了连接到这个实例,远程客户端必须指定主机名或其关联的 IP 地址 198.51.100.1:
mongosh --host My-Example-Associated-Hostname
# or
mongosh --host 198.51.100.1
Connectivity 连接性
确保网络流量可以在 set
的所有成员和网络中的所有客户端之间安全地传递。
考虑以下:
- 建立
虚拟专用网络(a virtual private network)
。 确保您的网络拓扑通过局域网路由单个站点内成员之间的所有流量。 - 配置
access control
以防止未知客户端连接到replica set
。 - 配置网络和防火墙规则,以便仅在默认 MongoDB 端口上允许传入和传出数据包,并且只能来自您的部署。 请参阅 IP 绑定注意事项(IP Binding considerations)。
确保 **replica set**
的每个成员都可以通过可解析的 DNS 或主机名访问。 您应该适当地配置 DNS 名称或设置系统的 /etc/hosts
文件以反映此配置。
每个成员都必须能够连接到其他每个成员。 有关如何检查连接的说明,请参阅 Test Connections Between all Members。
Configuration 配置
在部署 MongoDB 之前创建 MongoDB 存储数据文件的目录。
在存储于 /etc/mongod.conf
或相关位置的配置文件中指定 mongod 配置。
有关配置选项的更多信息,请参阅 Configuration File Options。
Procedure 过程
以下过程概述了在禁用 access control
时部署 replica set
的步骤。
1. 使用适当的选项启动 replica set 的每个成员
对于每个成员,使用以下设置启动一个 mongod 实例:
- 将 replication.replSetName 选项设置为
replica set
名称。 如果您的应用程序连接到多个replica set
,则每个副本集都必须具有不同的名称。 - 将 net.bindIp 选项设置为
hostname/ip
或以逗号分隔的hostname/ip
列表。 - 设置适合您的部署的任何其他设置。
在本教程中,三个 mongod 实例与以下主机关联:
Replica Set Member | Hostname |
---|---|
Member 0 | mongodb0.example.net |
Member 1 | mongodb1.example.net |
Member 2 | mongodb2.example.net |
以下示例通过 —replSet 和 —bind_ip 命令行选项指定 replica set
名称和 ip
绑定:
:::danger
在绑定到 non-localhost(例如可公开访问的)IP 地址之前,请确保您已保护您的集群免受未经授权的访问。有关安全建议的完整列表,请参阅 Security Checklist。至少,考虑启用身份验证和强化网络基础设施。
:::
mongod --replSet "rs0" --bind_ip localhost,<hostname(s)|ip addresss(es)>
对于 <hostname(s)|ip address(es)>
,指定远程客户端(包括 replica set
的其他成员)可以用来连接到的 mongod 实例的 hostname(s)
and/or ip address(es)
。
或者,您也可以在 configuration file 中指定 [replica set name](https://www.mongodb.com/docs/manual/reference/configuration-options/#mongodb-setting-replication.replSetName)
和 [ip addresses](https://www.mongodb.com/docs/manual/reference/configuration-options/#mongodb-setting-net.bindIp)
:
replication:
replSetName: "rs0"
net:
bindIp: localhost,<hostname(s)|ip addresss(es)>
要使用配置文件启动 mongod,请使用 —config 选项指定配置文件的路径:
mongod --config <path-to-config>
在生产部署中,您可以配置一个 init script 来管理此过程。 初始化脚本超出了本文档的范围。
2. 将 mongosh 连接到其中一个 mongod 实例
在运行 mongod 的同一台机器上(在本教程中为 mongodb0.example.net
),启动 mongosh。 要连接到在默认端口 27017
上监听 localhost 的 mongod,只需执行:
mongo
根据您的路径,您可能需要指定 mongosh 二进制文件的路径。
3. 启动 replica set
从 mongosh,在 replica set
成员 0 上运行 [rs.initiate()](https://www.mongodb.com/docs/manual/reference/method/rs.initiate/#mongodb-method-rs.initiate)
。
:::warning
仅在 replica set
的一个且仅一个 [mongod](https://www.mongodb.com/docs/manual/reference/program/mongod/#mongodb-binary-bin.mongod)
实例上运行 [rs.initiate()](https://www.mongodb.com/docs/manual/reference/method/rs.initiate/#mongodb-method-rs.initiate)
。
:::
:::warning
为避免由于 IP 地址更改而导致配置更新,请使用 DNS 主机名而不是 IP 地址。 在配置 replica set
成员或 sharded cluster(分片集群)
成员时,使用 DNS 主机名而不是 IP 地址尤为重要。
使用主机名而不是 IP 地址来配置跨网络分割的集群。 从 MongDB 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 使用默认的 replica set
配置启动 replica set
。
4. 查看 replica set 配置
使用 [rs.conf()](https://www.mongodb.com/docs/manual/reference/method/rs.conf/#mongodb-method-rs.conf)
显示 replica set configuration object:
rs.conf()
replica set configuration obejct
类似于以下内容:
{
"_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")
}
}
5. 确保 replica set 具有 primary(主节点)
使用 [rs.status()](https://www.mongodb.com/docs/manual/reference/method/rs.status/#mongodb-method-rs.status)
来识别 replica set
中的 primary(主节点)
。
:::info
TIP
另请参阅:
Deploy Replica Set With Keyfile Authentication 部署 replica set
与密钥文件认证
:::
参考
https://www.mongodb.com/docs/manual/tutorial/deploy-replica-set