部署副本集以进行测试和开发

在本页面

此过程描述了在开发或测试环境中部署副本集。对于生产部署,请参考部署副本集教程。

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

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

Overview

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

Requirements

对于测试和开发系统,您可以在本地系统上或虚拟实例中运行mongod实例。

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

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

Considerations

IP Binding

从 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

在此测试部署中,三个成员在同一台计算机上运行。

副本集命名

Important

这些说明仅应用于测试或开发部署。

此过程中的示例创建一个名为rs0的新副本集。

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

Procedure

  • 通过发出类似于以下内容的命令,为每个成员创建必要的数据目录:
mkdir -p /srv/mongodb/rs0-0  /srv/mongodb/rs0-1 /srv/mongodb/rs0-2

这将创建名为“ rs0-0”,“ rs0-1”和“ rs0-2”的目录,其中将包含实例的数据库文件。

  • 通过发出以下命令,在自己的 Shell 窗口中启动mongod实例:

Warning

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

First member:

mongod --replSet rs0 --port 27017 --bind_ip localhost,<ip address of mongod host> --dbpath /srv/mongodb/rs0-0 --smallfiles --oplogSize 128

Second member:

mongod --replSet rs0 --port 27018 --bind_ip localhost,<ip address of mongod host> --dbpath /srv/mongodb/rs0-1 --smallfiles --oplogSize 128

Third member:

mongod --replSet rs0 --port 27019 --bind_ip localhost,<ip address of mongod host> --dbpath /srv/mongodb/rs0-2 --smallfiles --oplogSize 128

这将使每个实例作为名为rs0的副本集的成员开始,每个副本集都在不同的端口上运行,并使用--dbpath设置指定数据目录的路径。如果您已经在使用建议的端口,请选择其他端口。

这些实例同时绑定到主机的 localhost 和 ip 地址。

--smallfiles--oplogSize设置会减少每个mongod实例使用的磁盘空间。这是测试和开发部署的理想选择,因为它可以防止计算机过载。有关这些和其他配置选项的更多信息,请参见配置文件选项

  • 通过mongo Shell 连接到您的mongod实例之一。您需要通过指定其端口号来指示哪个实例。为了简单明了,您可能希望选择第一个,如以下命令所示;
mongo --port 27017
  • mongo shell 中,使用rs.initiate()初始化副本集。您可以在mongo shell 环境中创建副本集配置对象,如以下示例所示:
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" : {

         },
         "slaveDelay" : NumberLong(0),
         "votes" : 1
      },
      {
         "_id" : 1,
         "host" : "<hostname>:27018",
         "arbiterOnly" : false,
         "buildIndexes" : true,
         "hidden" : false,
         "priority" : 1,
         "tags" : {

         },
         "slaveDelay" : NumberLong(0),
         "votes" : 1
      },
      {
         "_id" : 2,
         "host" : "<hostname>:27019",
         "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("598f630adc9053c6ee6d5f38")
   }
}

随时通过rs.status()操作检查副本集的状态。

See also

以下 shell 函数的文档以获取更多信息:

您也可以将简单的安装脚本作为自动配置的基本副本集的示例。

请参阅复制集读取和写入语义,以获取有关 MongoDB 中读写语义的详细说明。