副本集指南(一)

来源:互联网 发布:激光笔软件 编辑:程序博客网 时间:2024/05/18 02:15

一、副本集部署指南

1.部署一个副本集

这个指南介绍了,如何使用3个现有的mongod实例,创建一个3成员副本集。一个3成员副本集提供了足够的冗余来适应大多数网络分区以及系统故障。这种模式也有足够的能力来适应分布式读操作。副本集应该有奇数个成员,才能保证选举的顺利。基本的过程是:启动一个mongod实例,进行副本集配置,添加其他mongod实例到此副本集中。

1.1部署准备

    生产部署时,你需要管理分开运行在不同机器上的mongod实例。当使用虚拟机时,你需要放置每一个mongod实例于分开的host服务器上,冗余的电源电路和冗余的网络路径。    部署副本集前,你需要在每一台机器上安装MongoDB。    创建副本集前,你需要核实你的网络环境,保障所有的机器间的连接正常。一个成功的副本集,每一个成员必须能够连接到其他的任意成员。

1.2部署注意事项

  • 架构 在每台机器上部署成员时,尽可能绑定到默认的MongoDB端口27017,也可以使用bind_ip选项来保证对配置ip的应用监听。在一个地理分布的副本集中,保证大多数的副本集mongod实例存在于primay附近。
  • 连接 保证所有的间网络连接的通畅,进行权限控制,以及防火墙控制
  • 配置 指定每台机器运行时的配置文件为/etc/mongod.conf或者相关位置,或者指定文件存储位置

1.3部署过程

·step1 使用合适的选项,启动每一个成员上的实例,连接到同一个副本集。

mongod --replSet "rs0" /etc/mongod.conf

·step2 使用mongod shell连接到一个成员实例,初始化副本集:

rs.initate()

·step3 在同一mongod shell中,修改初始化副本集的配置:

rs.conf()

执行结果如下

{    "_id" : "rs0",    "version" : 1,    "members" : [        {            "_id" : 1,            "host" : "mongodb0.example.net:27017"        }    ]}

·step4 在同一mongod shell中,将其他成员添加到该副本集,完成后,副本集将选举出一个primary:

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

·step5 在同一mongod shell中,检查副本集的状态:

rs.status()

2、部署一个开发测试用的副本集


在开发测试环境中,可以使用一台机器来模拟3成员的副本集。原理是在单台机器上运行多个不同port的mongod实例,然后将他们添加到副本集。

·step1 为每一个port的mongod实例创建一个文件目录:

mkdir -p /srv/mongodb/rs0-0 /srv/mongodb/rs0-1 /srv/mongodb/rs0-2

·step2 启动mongod实例,指定port,dbpath,replset等参数:

mongod --port 27017 --dbpath /srv/mongodb/rs0-0 --replSet rs0 --smallfiles --oplogSize 128mongod --port 27018 --dbpath /srv/mongodb/rs0-1 --replSet rs0 --smallfiles --oplogSize 128mongod --port 27019 --dbpath /srv/mongodb/rs0-2 --replSet rs0 --smallfiles --oplogSize 128

·step3 使用mongod shell连接到任一mongod实例,并执行副本集初始化操作:

mongo --port 27017rsconf = {    _id: "rs0",    members: [            {                _id: 0,                host: "<hostname>:27017"            }        ]    }rs.initiate(rsconf)

·step4 在port为27017的mongod shell中,检查当前的副本集配置:

rs.conf()

结果类似为:

{    "_id" : "rs0",    "version" : 4,    "members" : [            {                "_id" : 1,                "host" : "localhost:27017"            }        ]}

·step5 在port为27017的mongod shell中添加其余port的实例到副本集,完成后,副本集会选举一个primary:

rs.add("<hostname>:27018")rs.add("<hostname>:27019")

·step6 检查副本集状态:

rs.status()

3、部署一个地理上冗余的副本集


该方法是为了部署一个副本集,成员分散在多个地理位置上。适合于3成员、4成员以及4成员以上的副本集。

3.1 注意事项

尽管副本集对单实例故障提供了基础的保护,部署在同一个设备中心的成员可能会收到设备中心的影响。断电、网络中断和自然灾害等会影响集中部署的副本集。为了预防这种故障,部署成员分布在多个地理位置上的不同数据中心的副本集变得有意义。

3.2 前提条件

    保证大多数的选举成员部署在同一个数据中心,包括优先级为0的成员和仲裁者。在其他数据中心处,存放提供额外数据冗余的成员。    如果你的成员数量为偶数,可以添加一个仲裁者,仲裁者必须部署在拥有大多数成员的数据中心处。例如,3成员的副本集,2个在数据中心A,1个在数据中心B。而且数据中心A和你的业务服务器应该相近。一个4成员的副本集,至少需要2个成员在数据中心A,2个成员在数据中心B,同时有一个仲裁者部署在A上。    尽可能地在不同的机器上运行单个mongod实例,而不是,在单个机器上运行多个实例作为副本集成员。

3.3 部署过程
·step1 使用合适的选项,启动每一个成员上的实例,连接到同一个副本集。

mongod --replSet "rs0" /etc/mongod.conf

·step2 使用mongod shell连接到一个成员实例,初始化副本集:

rs.initate()

·step3 在同一mongod shell中,核实初始化副本集的配置:

rs.conf()

执行结果如下

{    "_id" : "rs0",    "version" : 1,    "members" : [        {            "_id" : 1,            "host" : "mongodb0.example.net:27017"        }    ]}

·step4 在同一mongod shell中,将其他成员添加到该副本集,完成后,副本集将选举出一个primary:

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

·step5 配置外地成员的优先级为0,即数据中心B的成员:

rs.status()cfg=rs.conf()cfg.member[3].priority=0rs.reconfig(cfg)

使用reconfig后,当前的primary会降位,并导致选举。当primary降位后,所有的客户端军不可连接,这是正常的反应。大多数选举都能在一分钟内结束,确保副本集的有计划的进行配置变更。

rs.addArb("mongodb4.example.net")

如果成员数量为偶数个,可以通过以上指令添加仲裁者,达到奇数成员的目的。
·step6 在同一mongod shell中,检查副本集的状态:

rs.status()

4、将一个单机实例转变为副本集

将一个单机mongod实例转变为一个3成员的副本集,单机通常用于开发和测试,生产中都是使用副本集。

4.1 过程
step1 关闭目标单机mongod进程
step2 重启进程,使用–replset选项来指定新副本集的名称,注意replset指定的副本集名称不能够重复:

mongod --port 27017 --dbpath /srv/mongodb/db0 --replSet rs0

step3 连接到此实例,使用rs.initate()来进行初始化

rs.initiate()

step4 检查新副本集的配置,使用rs.conf()指令,检查状态使用rs.status()指令

rs.conf()rs.status()

4.2 扩展副本集
step1 在其他的机器上,启动mongod实例,使用–replset参数。
step2 连接之前的mongod实例,使用mongo shell来执行指令rs.add()进而添加其他mongod实例到副本集中:

rs.add("<hostname><:port>")

4.3 分片注意事项
如果这个新的副本集作为一个分片集群的一部分,需要在分片集群的配置服务器上修改分片信息:
step1 连接分片集群的一个实例,执行以下命令:

db.getSiblingDB("config").shards.save( {_id: "<name>", host: "<replica-set>/<member,><member,><...>"

使用新集群名称来代替replica-sit,使用成员名称代替member
step2 重启所有的分片集群实例


5、为副本集新增一个成员

5.1 最大的可选举成员数量
一个副本集最多可以有7个可选举成员,向一个已有7个可选举成员的副本集中,新增一个成员时,要么指定该成员为不可选举成员,要么先移除掉已有可选举。
5.2 现存成员
你可以新增一个成员到现存的副本集中,亦可以重新将一个已删除的成员添加进来。
5.3 数据文件
如果你有现存成员的数据文件,你可以复制这些数据文件到新成员中,方便快速同步。这些数据文件必须满足:
· 副本集的一个成员的可用数据备份,可以使用文件系统的快照
· 数据文件必须是最新的,新成员才能应用primary的oplog
5.4 过程
step1 准备好新成员的数据目录
·方法一,使用空目录。新成员需要花费时间来从一个现有成员复制数据。
·方法二,使用现有成员的数据文件备份,并以window allowed by oplog启动
·使用rs.printReplicationInfo()来检查副本集的实时状态信息
step2 启动新成员的mongod实例:

mongod --dbpath /srv/mongodb/db0 --replSet rs0

或者通过配置文件启动,配置文件中记录的有dbpath,replset等信息:

mongod --config /etc/mongod.conf

step3 mongo shell查找并连接到副本集的primary实例

db.isMaster()

step4 在primary上使用rs.add()指令,新增一个成员。

--方法一rs.add("mongodb3.example.net:27017")--方法二<此处可以指定其他参数>rs.add({_id: 1, host: "mongodb3.example.net:27017", priority: 0, hidden: true})

step5 检查副本集的状态,是否有新成员

rs.conf()

6、从副本集移除一个成员

6.1 使用rs.remove()指令移除成员
step1 使用mongo shell关闭待移除成员的mongod实例

db.shutdownServer()

step2 使用mongo shell连接到副本集的primary,通过db.isMaster指令进行判断
step3 使用rs.remove()指令移除(未指定端口则为默认的27017)

rs.remove("mongod3.example.net:27017")

执行完后,副本集将进行重新选举primary。
6.2 使用re.reconfig()移除成员
step1 使用mongo shell关闭待移除成员的mongod实例

db.shutdownServer()

step2 使用mongo shell连接到副本集的primary,通过db.isMaster指令进行判断
step3 使用rs.conf()来查看当前的配置文档,并决定需要移除的成员所在的位置

rs.conf()

返回结果类似于:

{    "_id" : "rs",    "version" : 7,    "members" : [                {                    "_id" : 0,                    "host" : "mongod_A.example.net:27017"                },                {                    "_id" : 1,                    "host" : "mongod_B.example.net:27017"                },                {                    "_id" : 2,                    "host" : "mongod_C.example.net:27017"                }    ]}

step4 修改配置文档,并应用

cfg=rs.cnf()cfg.members.splice(2,1)rs.reconfig(cfg)

step5 确认新的配置文档结果

rs.conf()

结果类似于:

{    "_id" : "rs",    "version" : 8,    "members" : [                {                    "_id" : 0,                    "host" : "mongod_A.example.net:27017"                },                {                    "_id" : 1,                    "host" : "mongod_B.example.net:27017"                }    ]}
0 0
原创粉丝点击