On this page本页内容
This tutorial outlines the process for deploying a replica set with members in multiple locations. 本教程概述了在多个位置部署具有成员的副本集的过程。The tutorial addresses three-member replica sets and five-member replica sets. 本教程介绍了三个成员副本集和五个成员副本集中的内容。If you have an even number of replica set members, add another data bearing member, if possible, to deploy an odd number of voting members. 如果您有偶数个副本集成员,如果可能,请添加另一个数据承载成员,以部署奇数个投票成员。[1]
For more information on distributed replica sets, see Replica Sets Distributed Across Two or More Data Centers. 有关分布式副本集的更多信息,请参阅跨两个或多个数据中心分布的副本集。See also Replica Set Deployment Architectures and see Replication.另请参见复制集部署体系结构和复制。
[1] | |
In production, deploy each member of the replica set to its own machine and if possible bind to the standard MongoDB port of 在生产中,将副本集的每个成员部署到自己的机器上,如果可能,绑定到27017
.27017
的标准MongoDB端口。
See Replica Set Deployment Architectures for more information.有关详细信息,请参阅副本集部署体系结构。
To avoid configuration updates due to IP address changes, use DNS hostnames instead of IP addresses. 为了避免由于IP地址更改而导致的配置更新,请使用DNS主机名而不是IP地址。It is particularly important to use a DNS hostname instead of an IP address when configuring replica set members or sharded cluster members.在配置副本集成员或分片群集成员时,使用DNS主机名而不是IP地址尤为重要。
Use hostnames instead of IP addresses to configure clusters across a split network horizon. 使用主机名而不是IP地址来跨拆分的网络范围配置群集。Starting in MongDB 5.0, nodes that are only configured with an IP address will fail startup validation and will not start.从MongDB 5.0开始,仅配置IP地址的节点将无法启动验证,无法启动。
Use the 使用--bind_ip
option to ensure that MongoDB listens for connections from applications on configured addresses.--bind_ip
选项确保MongoDB侦听来自配置地址上的应用程序的连接。
Changed in version 3.6.在版本3.6中更改。
mongod
and mongos
, bind to localhost by default. mongod
和mongos
默认绑定到localhost。net.ipv6
configuration file setting or the --ipv6
command line option is set for the binary, the binary additionally binds to the localhost IPv6 address.net.ipv6
配置文件设置或--ipv6
命令行选项,则该二进制文件还将绑定到本地主机ipv6地址。mongod
and mongos
that are bound to localhost only accept connections from clients that are running on the same computer. mongod
和mongos
只接受来自同一台计算机上运行的客户端的连接。mongosh
and other members of your replica set or sharded cluster. mongosh
和复制集或分片集群的其他成员。net.bindIp
configuration file setting or the --bind_ip
command-line option to specify a list of hostnames or IP addresses.net.bindIp
配置文件设置或--bind_ip
命令行选项指定主机名或IP地址列表。disableSplitHorizonIPCheck
.disableSplitHorizonIPCheck
。mongod
instance binds to both the localhost and the hostname My-Example-Associated-Hostname
, which is associated with the IP address 198.51.100.1
:mongod
实例绑定到本地主机和主机名My-Example-Associated-Hostname
,该主机名与IP地址198.51.100.1
关联:mongod --bind_ip localhost,My-Example-Associated-Hostname
198.51.100.1
:198.51.100.1
:mongosh --host My-Example-Associated-Hostname mongosh --host 198.51.100.1
Ensure that network traffic can pass securely between all members of the set and all clients in the network .确保网络流量可以在集合的所有成员和网络中的所有客户端之间安全传递。
Consider the following:考虑以下内容:
Ensure that each member of a replica set is accessible by way of resolvable DNS or hostnames. 确保可以通过可解析DNS或主机名访问副本集的每个成员。You should either configure your DNS names appropriately or set up your systems' 您应该适当配置DNS名称或设置系统的/etc/hosts
file to reflect this configuration./etc/hosts
文件以反映此配置。
Each member must be able to connect to every other member. 每个成员必须能够连接到其他每个成员。For instructions on how to check your connection, see Test Connections Between all Members.有关如何检查连接的说明,请参阅测试所有成员之间的连接。
Create the directory where MongoDB stores data files before deploying MongoDB.在部署MongoDB之前,创建MongoDB存储数据文件的目录。
Specify the 在mongod
configuration in a configuration file stored in /etc/mongod.conf
or a related location./etc/mongod.conf
或相关位置中存储的配置文件中指定mongod
配置。
For more information about configuration options, see Configuration File Options.有关配置选项的详细信息,请参阅配置文件选项。
If possible, use an odd number of data centers, and choose a distribution of members that maximizes the likelihood that even with a loss of a data center, the remaining replica set members can form a majority or at minimum, provide a copy of your data.如果可能,请使用奇数个数据中心,并选择一种成员分布,以最大限度地提高即使丢失数据中心,其余副本集成员也可以形成多数或至少提供数据副本的可能性。
Never deploy more than seven voting members.不得部署超过七名投票成员。
For all configurations in this tutorial, deploy each replica set member on a separate system. 对于本教程中的所有配置,请在单独的系统上部署每个副本集成员。Although you may deploy more than one replica set member on a single system, doing so reduces the redundancy and capacity of the replica set. Such deployments are typically for testing purposes.尽管您可以在单个系统上部署多个副本集成员,但这样做会减少副本集的冗余和容量。此类部署通常用于测试目的。
This tutorial assumes you have installed MongoDB on each system that will be part of your replica set. 本教程假定您已在每个将成为副本集一部分的系统上安装了MongoDB。If you have not already installed MongoDB, see the installation tutorials.如果尚未安装MongoDB,请参阅安装教程。
To avoid configuration updates due to IP address changes, use DNS hostnames instead of IP addresses. 为了避免由于IP地址更改而导致的配置更新,请使用DNS主机名而不是IP地址。It is particularly important to use a DNS hostname instead of an IP address when configuring replica set members or sharded cluster members.在配置副本集成员或分片群集成员时,使用DNS主机名而不是IP地址尤为重要。
Use hostnames instead of IP addresses to configure clusters across a split network horizon. 使用主机名而不是IP地址来跨拆分的网络范围配置群集。Starting in MongDB 5.0, nodes that are only configured with an IP address will fail startup validation and will not start.从MongDB 5.0开始,仅配置IP地址的节点将无法启动验证,无法启动。
For a geographically redundant three-member replica set deployment, you must decide how to distribute your system. 对于地理上冗余的三成员副本集部署,您必须决定如何分发系统。Some possible distributions for the three members are:三个成员的一些可能分布如下:
Distributing replica set members across two data centers provides benefit over a single data center. 跨两个数据中心分布副本集成员比单个数据中心更具优势。In a two data center distribution,在双数据中心分布中,
If possible, distribute members across at least three data centers. 如果可能,将成员分布到至少三个数据中心。For config server replica sets (CSRS), the best practice is to distribute across three (or more depending on the number of members) centers. 对于配置服务器副本集(CSRS),最佳做法是跨三个(或更多,取决于成员数量)中心进行分发。If the cost of the third data center is prohibitive, one distribution possibility is to evenly distribute the data bearing members across the two data centers and store the remaining member in the cloud if your company policy allows.如果第三个数据中心的成本太高,一种分发的可能性是将承载数据的成员均匀分布在两个数据中心中,如果您的公司政策允许,将剩余的成员存储在云中。
For each member, start a 对于每个成员,使用以下设置启动mongod
instance with the following settings:mongod
实例:
replication.replSetName
option to the replica set name. replication.replSetName
选项设置为副本集名称。net.bindIp
option to the hostname/ip or a comma-delimited list of hostnames/ips.net.bindIp
选项设置为主机名/ip或以逗号分隔的主机名/ips列表。In this tutorial, the three 在本教程中,三个mongod
instances are associated with the following hosts:mongod
实例与以下主机关联:
Member 0 | mongodb0.example.net |
Member 1 | mongodb1.example.net |
Member 2 | mongodb2.example.net |
The following example specifies the replica set name and the ip binding through the 以下示例通过--replSet
and --bind_ip
command-line options:--replSet
和--bind_ip
命令行选项指定副本集名称和ip绑定:
Before binding to a non-localhost (e.g. publicly accessible) IP address, ensure you have secured your cluster from unauthorized access. 在绑定到非本地主机(例如,可公开访问的)IP地址之前,请确保已保护您的集群免受未经授权的访问。For a complete list of security recommendations, see Security Checklist. 有关安全建议的完整列表,请参阅安全检查表。At minimum, consider enabling authentication and hardening network infrastructure.至少要考虑启用身份验证和加强网络基础设施。
mongod --replSet "rs0" --bind_ip localhost,<hostname(s)|ip address(es)>
For <hostname(s)|ip address(es)>
, specify the hostname(s) and/or ip address(es) for your mongod
instance that remote clients (including the other members of the replica set) can use to connect to the instance.
Alternatively, you can also specify the replica set name
and the ip addresses
in a configuration file:
replication: replSetName: "rs0" net: bindIp: localhost,<hostname(s)|ip address(es)>
To start 要使用配置文件启动mongod
with a configuration file, specify the configuration file's path with the --config
option:mongod
,请使用--config
选项指定配置文件的路径:
mongod --config <path-to-config>
In production deployments, you can configure a init script to manage this process. 在生产部署中,您可以配置init脚本来管理此过程。Init scripts are beyond the scope of this document.初始化脚本超出了本文档的范围。
mongosh
to one of the mongod
instances.mongosh
连接到其中一个mongod
实例。From the same machine where one of the mongod
is running (in this tutorial, mongodb0.example.net
), start mongosh
. To connect to the mongod
listening to localhost on the default port of 27017
, simply issue:
mongo
Depending on your path, you may need to specify the path to the 根据您的路径,您可能需要指定mongosh
binary.mongosh
二进制文件的路径。
From mongosh
, run rs.initiate()
on replica set member 0.
Run rs.initiate()
on just one and only onemongod
instance for the replica set.
To avoid configuration updates due to IP address changes, use DNS hostnames instead of IP addresses. It is particularly important to use a DNS hostname instead of an IP address when configuring replica set members or sharded cluster members.
Use hostnames instead of IP addresses to configure clusters across a split network horizon. Starting in MongDB 5.0, nodes that are only configured with an IP address will fail startup validation and will not start.
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 initiates a replica set, using the default replica set configuration.MongoDB使用默认副本集配置启动副本集。
Use 使用rs.conf()
to display the replica set configuration object:rs.conf()
显示副本集配置对象:
rs.conf()
The replica set configuration object resembles the following:副本集配置对象类似于以下内容:
{ "_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") } }
In some cases, you may prefer that the members in one data center be elected primary before the members in the other data centers. 在某些情况下,您可能希望一个数据中心中的成员在其他数据中心中成员之前被选为主要成员。You can modify the priority
of the members such that the members in the one data center has higher priority
than the members in the other data centers.
Some members of the replica set, such as members that have networking restraint or limited resources, should not be able to become primary in a failover. Configure members that should not become primary to have priority 0.
For example, to lower the relative eligibility of the member located in one of the sites (in this example, 例如,要降低位于其中一个站点(在本例中为mongodb2.example.net
), set the member's priority to 0.5
.mongodb2.example.net
)的成员的相对资格,请将成员的优先级设置为0.5
。
View the replica set configuration to determine the members
array position for the member. Keep in mind the array position is not the same as the _id
:
rs.conf()
Copy the replica set configuration object to a variable (to cfg
in the example below). Then, in the variable, set the correct priority for the member. Then pass the variable to rs.reconfig()
to update the replica set configuration.
For example, to set priority for the third member in the array (i.e., the member at position 2), issue the following sequence of commands:
cfg = rs.conf() cfg.members[2].priority = 0.5 rs.reconfig(cfg)
The rs.reconfig()
shell method can force the current primary to step down, causing an election. When the primary steps down, all clients will disconnect. This is the intended behavior. While median time to elect a new primary should not typically exceed 12 seconds, always make sure any replica configuration changes occur during scheduled maintenance periods.
After these commands return, you have a geographically redundant three-member replica set.这些命令返回后,您将拥有一个地理上冗余的三成员副本集。
Use 使用rs.status()
to identify the primary in the replica set.rs.status()
标识副本集中的主副本。
To avoid configuration updates due to IP address changes, use DNS hostnames instead of IP addresses. 为了避免由于IP地址更改而导致的配置更新,请使用DNS主机名而不是IP地址。It is particularly important to use a DNS hostname instead of an IP address when configuring replica set members or sharded cluster members.在配置副本集成员或分片群集成员时,使用DNS主机名而不是IP地址尤为重要。
Use hostnames instead of IP addresses to configure clusters across a split network horizon. Starting in MongDB 5.0, nodes that are only configured with an IP address will fail startup validation and will not start.
For a geographically redundant five-member replica set deployment, you must decide how to distribute your system. Some possible distributions for the five members are:
Distributing replica set members across two data centers provides benefit over a single data center. In a two data center distribution,
If possible, distribute members across at least three data centers. For config server replica sets (CSRS), the best practice is to distribute across three (or more depending on the number of members) centers. If the cost of the third data center is prohibitive, one distribution possibility is to evenly distribute the data bearing members across the two data centers and store the remaining member in the cloud if your company policy allows.
For each member, start a mongod
instance with the following settings:
Set replication.replSetName
option to the replica set name,
If your application connects to more than one replica set, each set must have a distinct name. Some drivers group replica set connections by replica set name.
net.bindIp
option to the hostname/ip address or a comma-delimited list of hostnames/ip addresses, andIn this tutorial, the five mongod
instances are associated with the following hosts:
Replica Set Member | Hostname |
---|---|
Member 0 | mongodb0.example.net |
Member 1 | mongodb1.example.net |
Member 2 | mongodb2.example.net |
Member 3 | mongodb3.example.net |
Member 4 | mongodb4.example.net |
The following example specifies the replica set name and the ip binding through the --replSet
and --bind_ip
command-line options:
Before binding to a non-localhost (e.g. publicly accessible) IP address, ensure you have secured your cluster from unauthorized access. For a complete list of security recommendations, see Security Checklist. At minimum, consider enabling authentication and hardening network infrastructure.
mongod --replSet "rs0" --bind_ip localhost,<hostname(s)|ip address(es)>
For <hostname(s)|ip address(es)>
, specify the hostname(s) and/or ip address(es) for your mongod
instance that remote clients (including the other members of the replica set) can use to connect to the instance.
Alternatively, you can also specify the replica set name
and the hostnames/ip addresses
in a configuration file:
replication: replSetName: "rs0" net: bindIp: localhost,<hostname(s)|ip address(es)>
To start mongod
with a configuration file, specify the configuration file's path with the --config
option:
mongod --config <path-to-config>
In production deployments, you can configure a init script to manage this process. Init scripts are beyond the scope of this document.
mongosh
to one of the mongod
instances.From the same machine where one of the mongod
is running (in this tutorial, mongodb0.example.net
), start mongosh
. To connect to the mongod
listening to localhost on the default port of 27017
, simply issue:
mongo
Depending on your path, you may need to specify the path to the mongosh
binary.
From mongosh
, run rs.initiate()
on replica set member 0.
Run rs.initiate()
on just one and only onemongod
instance for the replica set.
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" }, { _id: 3, host: "mongodb3.example.net:27017" }, { _id: 4, host: "mongodb4.example.net:27017" } ] })
Use rs.conf()
to display the replica set configuration object:
rs.conf()
The replica set configuration object resembles the following:
{ "_id" : "rs0", "version" : 1, "protocolVersion" : NumberLong(1), "writeConcernMajorityJournalDefault" : true, "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 }, { "_id" : 3, "host" : "mongodb3.example.net:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "secondaryDelaySecs" : NumberLong(0), "votes" : 1 }, { "_id" : 4, "host" : "mongodb4.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, "catchUpTakeoverDelayMillis" : 30000, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 }, "replicaSetId" : ObjectId("5df2c9ccc21c478b838b98d6") } }
In some cases, you may prefer that the members in one data center be elected primary before the members in the other data centers. You can modify the priority
of the members such that the members in the one data center has higher priority
than the members in the other data centers.
Some members of the replica set, such as members that have networking restraint or limited resources, should not be able to become primary in a failover. Configure members that should not become primary to have priority 0.
For example, to lower the relative eligibility of the member located in one of the sites (in this example, mongodb2.example.net
), set the member's priority to 0.5
.
View the replica set configuration to determine the members
array position for the member. Keep in mind the array position is not the same as the _id
:
rs.conf()
Copy the replica set configuration object to a variable (to cfg
in the example below). Then, in the variable, set the correct priority for the member. Then pass the variable to rs.reconfig()
to update the replica set configuration.
For example, to set priority for the third member in the array (i.e., the member at position 2), issue the following sequence of commands:
cfg = rs.conf() cfg.members[2].priority = 0.5 rs.reconfig(cfg)
The rs.reconfig()
shell method can force the current primary to step down, causing an election. When the primary steps down, all clients will disconnect. This is the intended behavior. While median time to elect a new primary should not typically exceed 12 seconds, always make sure any replica configuration changes occur during scheduled maintenance periods.
After these commands return, you have a geographically redundant five-member replica set.
Use rs.status()
to identify the primary in the replica set.