记录一下,MongoDB的角色创建及配置,以便以后使用

经过大量血的教训,一个分片配置两个副本集时(一个是primary一个是secondary),如果primary挂掉,secondary是不会升级的,必须要加上一个不存储数据的仲裁节点

config = {"_id" : "tonghao", "members" : [ {"_id" : 0, "host" : "10.2.42.101:27017", priority:2},{"_id" : 1, "host" : "10.2.40.104:27017", priority:1},{"_id" : 2, "host":"10.2.40.104:27016", arbiterOnly:true}]}

priority:2,数字越大级别越高,级别高的作为主节点。

主从复制原理:

假如副本集的数据主从同步不一致,则需要把local db下的文件全复制。
也就是要迁移oplog时间戳

当Mongo DB 被设置成主库时(这一点很重要),在 local db 下有个 collection 叫oplog.$main ,这个就是Mongo 的 oplog。

当Primary节点完成数据操作后,Secondary会做出一系列的动作保证数据的同步:
1:检查自己local库的oplog.rs集合找出最近的时间戳。
2:检查Primary节点local库oplog.rs集合,找出大于此时间戳的记录。
3:将找到的记录插入到自己的oplog.rs集合中,并执行这些操作。

Secondary节点同步到哪了:
1:Primary节点插入一条数据
2:同时,会把该数据写入到Primary的oplog中,并且记录一个时间戳
3:db.runCommand({getlasterror:1,w:2})在Primary节点被调用时,Primary就完成了写入操作,等待其他非仲裁节点来同步数据
4:Secondary节点查询Primary的oplog并且拉去oplog
5:Secondary根据时间戳应用oplog
6:Secondary请求大于本身oplog时间戳的oplog
7:Primary更新时间戳