一.Mongodb副本集:

注:本文涉及命令中的引号皆为英文引号。

1.概念:

                    实际生产生活中我们无法保证数据库会一直不出现故障,为了防范意外故障对业务带来的损失,需要做一些冗余备份操作,mongodb采用复制功能来为mongodb增加高可用性,mongodb常用的replica Set,即副本集,或复制集,副本集中有类似主从的概念,mongodb的主机点称为:primary,从节点称为:secondary。

2.副本集原理:

                   Primary节点将数据修改的操作记录到本地oplog(操作日志,再local库下)中,secondary节点定期到primary节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证secondary与primary的数据一致性。

3.副本集特性:

                    两个及两个以上的mongodb实例建立的群集(两个实例的可能会有故障转移错误,建议最少为三个实例)

                    任何节点都可以作为primary

                    所有写操作都通过primary

                    自动故障转移

                    自动恢复

二.搭建mongodb副本集

1.环境:

(1)三台mongodb实例,组成的副本集:

                       mongodb1    192.168.146.25:27017

                       mongodb2    192.168.146.26:27017

                       mongodb3    192.168.146.27:27017

(2)mongodb版本(1.6版本后支持副本集Replica set):

                       mongodb  --version

2.编辑各实例配置文件:

(1)三台mongodb实例配置文件中添加(红色部分为需要添加修改的地方,同一个副本集的副本集名称(replSetName)必须相同,此处为test)           

cat  /data/mongodb/27017/mongodb.conf  

Mongodb副本集 故障转移 负载均衡 主从复制 数据的备份恢复

3.启动各实例节点:

                    mongod  -f  /data/mongodb/27017/mongod.conf

4.添加端口或关闭防火墙确保实例之间互相可以访问到其他实例的27017端口。

                   mongo  192.168.146.25:27017

                   mongo  192.168.146.26:27017

                   mongo  192.168.146.27:27017

 

5.初始化群集:

(1)在192.168.146.25主机上登陆mongodb,定义变量,首先指定id,就是副本集名称,members里面是一组数组,数组中是各mongodb实例的地址和监听端口.

                    >config={_id:”test”,members:[{_id:0,host:”192.168.146.25:27017”},{_id:1,host:”192.168.146.26:27017”},{_id:2,host:”192.168.146.27:27017”}]}

(2)打开admin库,使用rs.initiate方法,引用刚刚定义的变量config,来初始化群集.

                   >use admin

                   >rs.initiate(“config”)

(3)当副本集初始化完成后,终端提示符会由”>”变为”test:PRIMARY>”  ,test是副本集名称,PRIMARY代表当前实例为primary主节点。一个mongodb副本集中只有一个primary,其他都是secondary,并且只有primary才能写入数据,secondary只能读不能写。

(4)当副本集初始化完成后,还需要在secondary上声明自己是从节点,才能查看数据:

                   test:SECONDARY> rs.slaveOk()                 ## 在 192.168.146.26上

                   test:SECONDARY> rs.slaveOk()                 ## 在 192.168.146.27上

(5)查看secondary延迟情况:

                   test:SECONDARY>rs.printSlaveReplicationInfo()

Mongodb副本集 故障转移 负载均衡 主从复制 数据的备份恢复

6.查看群集状态:

                 test:PRIMARY>rs.status()

                 test:SECONDARY>rs.status()

                 test:SECONDARY>rs.status()

7.验证数据复制:

(1)在primary节点上写入数据:

(2)在各secondary节点上查看是否同步成功

(3)查看一下secondary延迟情况

                 test:SECONDARY> rs.printSlaveReplicationInfo()

8.副本集的优先级:

(1)MongoDB 副本集的中,Secondary 会不断检测 Primary 的健康状况,一旦 Primary 故障,各 Secondary 会根据优先级来选举一个新的 Primary。在没有指定优先级的情况下,各实例的默认优先级为 1。在优先级一样的情况下,无法预料到到底哪个 Secondary 会成为 Primary。

(2)查看副本集的配置信息,查看各节点优先级

                 test:PRIMARY> conf = rs.config()

(3)配置各节点的优先级,只可以在primary节点上可以更改优先级,根据 rs.config().members 中的输出,各实例的索引号从 0 开始,每次递增 1,类似数组。

                 test:PRIMARY> conf.members[0].priority = 10

                 test:PRIMARY> conf.members[1].priority = 20

                 test:PRIMARY> conf.members[2].priority = 30

(4)更新mongodb副本集配置:

                 test:PRIMARY> rs.reconfig(conf)

(5)再次查看优先级:

                 test:PRIMARY>rs.config()

三.Auto failover(故障自动切换)

1.Mongodb当primary挂掉,会自动从各secondary节点选出一个升级为主,条件是剩下的集群实例数>=2,如果当primary宕机后集群只剩下一个实例的话,会报错。

2.模拟primary宕机:

                  test:PRIMARY> use admin

                  test:PRIMARY> db.shutdownServer()

3.查看群集状态,优先级高的会被提升为primary:

                  test:SECONDARY> rs.status()

四.副本集的伸缩(添加与删除节点):

1.删除一台集群中的节点:

                   test:PRIMARY> use admin

                   test:PRIMARY> rs.remove(“192.168.146.25:27017”)

2.添加节点:

                   test:PRIMARY> use admin

                   test:PRIMARY> rs.add(“192.168.146.25:27017”)

3. 注意:  删除节点再加入后节点id和顺序会发生改变,设置优先级时应注意。不可以删除primary节点.

五.mongodb的数据备份与恢复(可用作数据迁移):

1.备份数据库:

mongodump -h dbhost:port  -o dbdirectory(放到一个指定的目录下)   备份全库

mongodump -h dbhost:port  -d dbname -o dbdirectory(放到一个指定的目录)  备份单库

mongodump -h dbhost:port  -d dbname -c collectionname -o dbdirectory  备份库中单表

2.恢复数据库:

mongorestore -h dbhost:port    dbdirectory(这是一个目录)   导入目录下所有库

mongorestore -h dbhost:port  -d dbname    dbdirectory(这是一个目录)  导入目录下指定库

mongorestore -h dbhost:port  -d dbname -c collectionname  dbdirectory/file.json(这是库目录下的.json格式表文件) 导入目录下指定库中表文件。

3.​​​​​​​注意:导入时,恢复目录下必须有恢复所需的库目录,导入单表时,需指定表所在的库,并且库中备份了有这个表,否则会出错。

 

 

 

                  

 

相关文章: