部署副本集

在本页面

本教程描述了如何从禁用access control的三个现有mongod实例中创建一个三成员的replica set

要部署启用了access control的副本集,请参阅使用密钥文件访问控制部署新副本集。如果您希望从单个 MongoDB 实例部署副本集,请参见将独立版本转换为副本集。有关副本集部署的更多信息,请参见Replication副本集部署体系结构文档。

Overview

三个成员replica sets提供足够的冗余性以承受大多数网络分区和其他系统故障。这些集合对于许多分布式读取操作也具有足够的容量。副本集的成员数应始终为奇数。这样可以确保elections顺利进行。有关设计副本集的更多信息,请参见复制概述

Requirements

对于生产部署,应通过在单独的计算机上托管mongod实例来保持成员之间的最大隔离。将虚拟机用于生产部署时,应将每个mongod实例放置在由冗余电源电路和冗余网络路径提供服务的单独主机服务器上。

在部署副本集之前,必须在将成为replica set一部分的每个系统上安装 MongoDB。如果尚未安装 MongoDB,请参阅installation tutorials

部署副本集时的注意事项

Architecture

在 Producing,将副本集的每个成员部署到其自己的计算机上,并尽可能绑定到标准 MongoDB 端口27017

有关更多信息,请参见副本集部署体系结构

IP Binding

使用bind_ip选项可确保 MongoDB 在配置的地址上侦听来自应用程序的连接。

在 3.6 版中进行了更改:从 MongoDB 3.6 开始,MongoDB 二进制文件mongodmongos默认绑定到 localhost(127.0.0.1)。如果为二进制文件设置了net.ipv6配置文件设置或--ipv6命令行选项,则该二进制文件还会绑定到 IPv6 地址::1

以前,从 MongoDB 2.6 开始,默认情况下,只有正式 MongoDB RPM(Red Hat,CentOS,Fedora Linux 和派生版本)和 DEB(Debian,Ubuntu 和派生版本)程序包中的二进制文件绑定到 localhost。

当仅绑定到 localhost 时,这些 MongoDB 3.6 二进制文件只能接受来自同一台计算机上运行的 Client 端(包括mongo shell,部署中其他成员(副本集和分片群集)的连接)。远程 Client 端无法连接到仅绑定到 localhost 的二进制文件。

要覆盖并绑定到其他 IP 地址,可以使用net.bindIp配置文件设置或--bind_ip命令行选项来指定 IP 地址列表。

Warning

绑定到非 localhost(例如可公开访问)的 IP 地址之前,请确保已保护群集免受未经授权的访问。有关安全建议的完整列表,请参见Security Checklist。至少考虑enabling authentication加强网络基础设施

例如,以下mongod实例同时绑定到 localhost 和示例 IP 地址198.51.100.1

mongod --bind_ip localhost,198.51.100.1

为了连接到该实例,远程 Client 端必须指定 IP 地址198.51.100.1或与该 IP 地址关联的主机名:

mongo --host 198.51.100.1

mongo --host My-Example-Associated-Hostname

Connectivity

确保网络流量可以在集合的所有成员与网络中的所有 Client 端之间安全地传递。

考虑以下:

  • 构建虚拟专用网。确保您的网络拓扑在局域网中路由单个站点内成员之间的所有流量。

  • 配置访问控制以防止从未知 Client 端到副本集的连接。

  • 配置网络和防火墙规则,以使传入和传出数据包仅在默认的 MongoDB 端口上并且仅在您的部署中才允许。请参阅 IP 绑定注意事项。

确保可以通过可解析的 DNS 或主机名访问副本集的每个成员。您应该适当地配置 DNS 名称或设置系统的/etc/hosts文件以反映此配置。

每个成员都必须能够连接到其他每个成员。有关如何检查连接的说明,请参阅测试所有成员之间的连接

Configuration

在部署 MongoDB 之前,请创建 MongoDB 用来存储数据文件的目录。

/etc/mongod.conf或相关位置中存储的configuration file中指定mongod配置。

有关配置选项的更多信息,请参见配置文件选项

Procedure

以下过程概述了禁用访问控制时部署副本集的步骤。

使用适当的选项启动副本集的每个成员。

对于每个成员,使用以下设置启动mongod实例:

如果您的应用程序连接到多个副本集,则每个副本集应具有不同的名称。某些驱动程序通过副本集名称对副本集连接进行分组。

  • net.bindIp选项设置为 IP 或以逗号分隔的 IP 列表,然后

  • 根据您的部署设置任何其他设置。

在本教程中,三个mongod实例与以下主机关联:

副本集成员Hostname
Member 0mongodb0.example.net
Member 1mongodb1.example.net
Member 2mongodb2.example.net

以下示例通过--replSet--bind_ip命令行选项指定副本集名称和 ip 绑定:

Warning

绑定到非 localhost(例如可公开访问)的 IP 地址之前,请确保已保护群集免受未经授权的访问。有关安全建议的完整列表,请参见Security Checklist。至少考虑enabling authentication加强网络基础设施

mongod --replSet "rs0" --bind_ip localhost,<ip address of the mongod host>

对于<ip address>,请指定mongod实例的 IP 地址或主机名,远程 Client 端(包括副本集的其他成员)可以使用该 IP 地址或主机名连接到该实例。

另外,您也可以在configuration file中指定副本集名称ip addresses

replication:
   replSetName: "rs0"
net:
   bindIp: localhost,<ip address>

要以配置文件开始mongod,请使用--config选项指定配置文件的路径:

mongod --config <path-to-config>

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

将 mongo shell 连接到其中一个 mongod 实例。

从运行mongod的同一台计算机(在本教程中为mongodb0.example.net)中,启动mongo Shell。要连接mongod并在27017的默认端口上监听 localhost,只需发出:

mongo

根据您的路径,您可能需要指定mongo二进制文件的路径。

启动副本集。

mongo shell 中,对副本集成员 0 运行rs.initiate()

Important

在副本集的仅一个且仅一个 mongod实例上运行rs.initiate()

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" : {

         },
         "slaveDelay" : NumberLong(0),
         "votes" : 1
      },
      {
         "_id" : 1,
         "host" : "mongodb1.example.net:27017",
         "arbiterOnly" : false,
         "buildIndexes" : true,
         "hidden" : false,
         "priority" : 1,
         "tags" : {

         },
         "slaveDelay" : NumberLong(0),
         "votes" : 1
      },
      {
         "_id" : 2,
         "host" : "mongodb2.example.net:27017",
         "arbiterOnly" : false,
         "buildIndexes" : true,
         "hidden" : false,
         "priority" : 1,
         "tags" : {

         },
         "slaveDelay" : 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()标识副本集中的主副本。