欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MongoDB数据库部署副本集的教程

程序员文章站 2022-06-17 19:20:40
本文介绍如何把没有访问控制的三个已存在的mongo实例创建成包含3个成员的副本集。 如果要部署有访问控制的副本集,可以查看Deploy Replica Set With Keyf...

本文介绍如何把没有访问控制的三个已存在的mongo实例创建成包含3个成员的副本集。

如果要部署有访问控制的副本集,可以查看Deploy Replica Set With Keyfile Access Control。如果要把单独的mongo实例部署为副本集,可以查看Convert a Standalone to a Replica Set。

简介

3个成员的副本集提供了足够的冗余以保证大部分的网络问题和其他系统失败问题。这些副本集有足够的能力应对很多分布式的读操作。副本集应该包含奇数个成员,这保证选举能平稳进行。

基本步骤是启动mongo实例,使其变成副本集成员,配置副本集,添加mongo实例到副本集。

要求

对于生产部署,要保证在不同机器上的mongo实例尽可能分开。如果生产部署使用虚拟机,要把每个mongo实例部署在单独的主机服务器上,其由不同的电源和网络提供服务。

部署副本集之前,必须安装mongo,其将成为副本集的一部分。如何安装不再赘述。

在创建副本集之前,要验证成员之间的网络配置保证它们之间能够通信。

注意事项

架构

在生产环境,部署副本集的每个成员到自己的机器,如果可能绑定其到标准的mongo端口27017。使用bind_ip选项保证mongo监听来自配置地址的应用的连接。

连通性

保证副本集的成员之间的网络连通,以及客户端之间网络的安全性和有效性。考虑以下情况:

1. 建立虚拟私有网络,保证网络拓扑通过本地局域网络对单一站点的成员路由通信

2. 配置访问控制以阻止未知客户端连接到该副本集

3. 配置网络和防火墙规则,这样只有默认的mongo端口和来自部署内的进出的数据包才被允许。

最后确保副本集的每个成员可以通过可辨别的DNS或主机名访问。你应该合理地配置DNS名字或系统的/etc/hosts来反映这个配置。

配置

通过保存在/etc/mongod.conf的配置文件或相应的位置指定每个系统的运行时配置。在部署mongo之前创建保存数据文件的目录。

步骤

以下步骤概括了在没有访问控制的情况下部署副本集的步骤。

1. 使用合适的选项启动副本集的每个成员

对于每个成员,启动mongo并通过replSet选项指定副本集。也可以指定其他特殊的参数,具体可以查询官方文档。

如果程序连接了不止一个副本集,每个副本集应该有唯一的名字。有些驱动根据副本集名字对副本集连接分组。

下面例子通过--replSet指定了副本集名字。

mongod --replSet "rs0"

默认mongo数据保存在/data/db,请确认该目录存在,否则启动失败。也可以指定保存目录。

你也可以指定在配置文件中指定副本集名字。然后通过--config参数指定配置文件路径,以配置文件启动mongo。

默认有一个配置文件在/etc/mongod.conf,可参考该文件修改成自己需要的配置。

mongod --config 

在生产环境,可以配置初始化脚本管理该过程。

2. 通过mongo shell连接到副本集成员

例如,连接到本地默认端口27017mongo实例,执行命令:

mongo

3. 初始化副本集

仅在一个副本集成员中使用rs.initiate():

rs.initiate( {
   _id : "rs0",
   members: [ { _id : 0, host : "mongodb0.example.net:27017" } ]
})

mongo初始化副本集是由当前的成员组成,并且使用了默认副本集配置。

4. 检查初始化副本集配置

使用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
      }
   ],
   "settings" : {
      "chainingAllowed" : true,
      "heartbeatIntervalMillis" : 2000,
      "heartbeatTimeoutSecs" : 10,
      "electionTimeoutMillis" : 10000,
      "catchUpTimeoutMillis" : 2000,
      "getLastErrorModes" : {

      },
      "getLastErrorDefaults" : {
         "w" : 1,
         "wtimeout" : 0
      },
      "replicaSetId" : ObjectId("585ab9df685f726db2c6a840")
   }
}

5. 添加其他成员到副本集

使用rs.add()方法添加其他成员。必须连接到primary添加成员到副本集。

在一些情况下,rs.add()会触发选举。如果你连接的mongo变成了secondary,需要通过mongo shell连接到新的primary以继续添加新的成员。使用rs.status()可以确认副本集的primary。

下面例子添加两个成员:

rs.add("mongodb1.example.net")
rs.add("mongodb2.example.net")

完成后,你就拥有了全部功能的副本集。新副本集会选举primary。

6. 检查副本集状态

使用rs.status操作:

rs.status()