本教程描述了如何从三个现有的 mongod 实例创建一个三成员 replica set,这些实例在禁用 access control 的情况下运行。

要部署启用了 access controlreplica set,请参阅 Deploy Replica Set With Keyfile Authentication。 如果您希望从单个 MongoDB 实例部署 replica set,请参阅 Convert a Standalone to Replica Set
有关 replica set 部署的更多信息,请参阅 ReplicationReplica 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 二进制文件 mongodmongos 默认绑定到 localhost。如果为二进制设置了 net.ipv6 配置文件设置或 --ipv6 命令行选项,则二进制额外绑定到 localhost IPv6 地址。默认情况下,绑定到 localhostmongodmongos 只接受来自在同一台计算机上正在运行的客户端的连接。此绑定行为包括 mongoshreplica setsharded 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

  1. mongod --bind_ip localhost,My-Example-Associated-Hostname

为了连接到这个实例,远程客户端必须指定主机名或其关联的 IP 地址 198.51.100.1

  1. mongosh --host My-Example-Associated-Hostname
  2. # or
  3. 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。至少,考虑启用身份验证强化网络基础设施。 :::

  1. 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)

  1. replication:
  2. replSetName: "rs0"
  3. net:
  4. bindIp: localhost,<hostname(s)|ip addresss(es)>

要使用配置文件启动 mongod,请使用 —config 选项指定配置文件的路径

  1. mongod --config <path-to-config>

在生产部署中,您可以配置一个 init script 来管理此过程。 初始化脚本超出了本文档的范围。

2. 将 mongosh 连接到其中一个 mongod 实例

在运行 mongod 的同一台机器上(在本教程中为 mongodb0.example.net),启动 mongosh。 要连接到在默认端口 27017 上监听 localhost 的 mongod,只需执行:

  1. 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 地址的节点将无法启动验证并且不会启动。 :::

  1. rs.initiate( {
  2. _id : "rs0",
  3. members: [
  4. { _id: 0, host: "mongodb0.example.net:27017" },
  5. { _id: 1, host: "mongodb1.example.net:27017" },
  6. { _id: 2, host: "mongodb2.example.net:27017" }
  7. ]
  8. })

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

  1. rs.conf()

replica set configuration obejct 类似于以下内容:

  1. {
  2. "_id" : "rs0",
  3. "version" : 1,
  4. "protocolVersion" : NumberLong(1),
  5. "members" : [
  6. {
  7. "_id" : 0,
  8. "host" : "mongodb0.example.net:27017",
  9. "arbiterOnly" : false,
  10. "buildIndexes" : true,
  11. "hidden" : false,
  12. "priority" : 1,
  13. "tags" : {
  14. },
  15. "secondaryDelaySecs" : NumberLong(0),
  16. "votes" : 1
  17. },
  18. {
  19. "_id" : 1,
  20. "host" : "mongodb1.example.net:27017",
  21. "arbiterOnly" : false,
  22. "buildIndexes" : true,
  23. "hidden" : false,
  24. "priority" : 1,
  25. "tags" : {
  26. },
  27. "secondaryDelaySecs" : NumberLong(0),
  28. "votes" : 1
  29. },
  30. {
  31. "_id" : 2,
  32. "host" : "mongodb2.example.net:27017",
  33. "arbiterOnly" : false,
  34. "buildIndexes" : true,
  35. "hidden" : false,
  36. "priority" : 1,
  37. "tags" : {
  38. },
  39. "secondaryDelaySecs" : NumberLong(0),
  40. "votes" : 1
  41. }
  42. ],
  43. "settings" : {
  44. "chainingAllowed" : true,
  45. "heartbeatIntervalMillis" : 2000,
  46. "heartbeatTimeoutSecs" : 10,
  47. "electionTimeoutMillis" : 10000,
  48. "catchUpTimeoutMillis" : -1,
  49. "getLastErrorModes" : {
  50. },
  51. "getLastErrorDefaults" : {
  52. "w" : 1,
  53. "wtimeout" : 0
  54. },
  55. "replicaSetId" : ObjectId("585ab9df685f726db2c6a840")
  56. }
  57. }

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