Mongodb的副本集:(有两种情况,主从复制,副本集)
这次我来说一下mongodb的副本集,副本集的出现可以有效的保证mongodb的单点问题,对数据的稳健性有一定辅助作用:
MongoDB复制:是将数据同步在多个服务器的过程。
1.复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。
2.复制还允许您从硬件故障和服务中断中恢复数据。
什么是复制?
- 保障数据的安全性
- 数据高可用性 (24*7)
- 灾难恢复
- 无需停机维护(如备份,重建索引,压缩)
- 分布式读取数据
MongoDB复制原理:
mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。
mongodb各个节点常见的搭配方式为:一主一从、一主多从。
主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。
Mongodb的主从复制:
由于我本地已经装载了一个mongodb服务,我就在本地模拟两个mongdb启动做数据备份的操作:
1> 配置路径如下:
2> 进入各服务下的bin目录启动mongodb 并指定端口:Server1的对应master port = 27011
mongod.exe --dbpath=E:\mongodbRs\db1 --master --port=27011
Server2下是复制的mongodb port=27012 mongod.exe --dbpath=E:\mongodbRs\db2 --port=27012 --slave --source=127.0.0.1:27011
启动后一直监控:
3>在27011 上插入一条记录:
27012上就能看到变化:
· 报错的解决办法:
注意:丛库只允许查询,插入会报错
4>动态追加从属数据库 有印象就行,
上面介绍的是在mongodb启动的时候,就知道主数据是哪个,下面我来说一种动态追加的方式:
启动mongodb,不指定主库:mongod.exe --dbpath=E:\mongodbRs\db3 --port=27013 --slave
上面显示信息是指没有master库配置:配置方式如下:
查看mongodb3的服务启动信息可以查看到:slave生效了
到这动态追加从库也配置完成:
5>读写分离
这种手段在大一点的架构中都有实现,在mongodb中其实很简单,在默认的情况下,从属数据库不支持数据的读取,但是没关系,
在驱动中给我们提供了一个叫做“slaveOkay"来让我们可以显示的读取从属数据库来减轻主数据库的性能压力
对比:一主两从
到这主从复制就基本上说完了,下面说副本集的搭建和介绍
Mongdb的副本集:
副本集的特点:
1> 副本集没有特定的主数据库。
2>如果哪个主数据库宕机了,集群中就会推选出一个从属数据库作为主数据库顶上,这就具备了自动故障恢复功能,
副本集在搭建过程中,要保证数据是清空的,因为我上面搭建的主从复制的数据都保存在db1 db2 db3中,所以在搭建副本集时,要先清空数据,保证搭建副本集的纯净环境
副本集:(搭建命令)
mongod.exe --port 27011 --dbpath=E:\mongodbRs\db1 --replSet rs0
mongod.exe --port 27012 --dbpath=E:\mongodbRs\db2 --replSet rs0
mongod.exe --port 27013 --dbpath=E:\mongodbRs\db3 --replSet rs0
副本集搭建过程:
rs.status():查询副本集的状态:截图如下:
6>刚说副本集是没有主节点的集群,主节点宕机后其他节点会自动切换回来,下面我模拟这种场景,把27011干掉:
7>我再把27011节点起来,这时候他作为一个从节点的状态又回到了集群中:
至此,mongodb的主从复制和副本集的搭建已经全部完成,不会的搭建可以参考:http://www.runoob.com/mongodb/mongodb-replication.html