副本集介绍
- MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组成。类似于MySQL的MMM架构。
- 副本集中数据同步过程:
Primary节点写入数据,Secondary通过读取Primary的oplog得到复制信息,开始复制数据并且将复制信息写入到自己的oplog。如果某个操作失败,则备份节点停止从当前数据源复制数据。如果某个备份节点由于某些原因挂掉了,当重新启动后,就会自动从oplog的最后一个操作开始同步,同步完成后,将信息写入自己的oplog,由于复制操作是先复制数据,复制完成后再写入oplog,有可能相同的操作会同步两份,不过MongoDB在设计之初就考虑到这个问题,将oplog的同一个操作执行多次,与执行一次的效果是一样的。
简单的说就是:
当Primary节点完成数据操作后,Secondary会做出一系列的动作保证数据的同步:
1:检查自己local库的oplog.rs集合找出最近的时间戳。
2:检查Primary节点local库oplog.rs集合,找出大于此时间戳的记录。
3:将找到的记录插入到自己的oplog.rs集合中,并执行这些操作。
副本集的同步和主从同步一样,都是异步同步的过程,不同的是副本集有个自动故障转移的功能。其原理是:slave端从primary端获取日志,然后在自己身上完全顺序的执行日志所记录的各种操作(该日志是不记录查询操作的),这个日志就是local数据 库中的oplog.rs表,默认在64位机器上这个表是比较大的,占磁盘大小的5%,oplog.rs的大小可以在启动参数中设 定:–oplogSize 1000,单位是M。
副本集搭建
- 配置文件
27017.config
1 2 3 4 5 6 7 8 9
dbpath = /data/mongo/db/27017 logpath = /data/mongo/log/27107.log pidfilepath = /data/mongo/db/27017/27017.pid replSet = mongo_sep ---> 副本集名称 bind_ip = task ---> 绑定服务ip port = 27017 ---> 服务占有端口 oplogSize = 30720 ---> 设置oplog大小 logappend = true ---> 追加日志 fork = true ---> 以守护进程运行
- 启动mongod服务
./bin/mongod -f ./conf/27017.config &
- 查看mongo状态
1 2 3 4 5 6 7 8
./mongo 192.168.177.11:27017 use admin rs.status(); conf = {_id : 'mongo_sep', members: [{_id: 0, host: 'task:27017', priority: 10}, {_id : 1, host: 'task:28017', priority: 1}, {_id : 2, host: 'task:29017', arbiterOnly : true}]}; rs.initiate(conf); rs.reconfig(conf); 若修改配置的话 rs.reconfig(conf, {'force': true}) 强行修改配置 rs.status(); 查看副本集是否成功
- 注意,配置文件需要三份,用于分别启动三个不同的mongod服务,端口分别为27017,28017,29017。