副本集指南(一)
一、副本集部署指南
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 128 mongod --port 27018 --dbpath /srv/mongodb/rs0-1 --replSet rs0 --smallfiles --oplogSize 128 mongod --port 27019 --dbpath /srv/mongodb/rs0-2 --replSet rs0 --smallfiles --oplogSize 128
·step3 使用mongod shell连接到任一mongod实例,并执行副本集初始化操作:
mongo --port 27017 rsconf = { _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=0 rs.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" } ] }
- 副本集指南(二)
- 副本集指南(三)
- 基于Django框架的web设计指南(1)
- HBase权威指南阅读——第四章(一)
- 数据整理实践指南
- chrome源码学习之知识体系指南
- mongodb指南(翻译)(二十) - developer zone - 索引(四)地理信息索引(转载)
- 新手看招 Unix和Linux下C语言学习指南
- 性能测试学习内容指南
- TypeScript学习指南--目录索引
- Java 7 并发编程指南中文版
- Asterisk1.4安装指南
- Eclipse Polish 2.1 安装指南
- Java并发编程-并发工具包(java.util.concurrent)使用指南(全)
- PyTorch还是TensorFlow?这有一份新手指南
- web调试优化-chrome开发者工具不完全指南
- AJAX.NET用户开发指南
- OpenSolaris安装指南