一.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
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()
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.注意:导入时,恢复目录下必须有恢复所需的库目录,导入单表时,需指定表所在的库,并且库中备份了有这个表,否则会出错。