MongoDB副本集搭建

Posted by yan on February 20, 2019

副本集介绍

  1. MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组成。类似于MySQL的MMM架构。
  2. 副本集中数据同步过程:
      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。

副本集搭建

  1. 配置文件 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                  ---> 以守护进程运行
    
  2. 启动mongod服务
    ./bin/mongod -f ./conf/27017.config &
  3. 查看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();  查看副本集是否成功
    
  4. 注意,配置文件需要三份,用于分别启动三个不同的mongod服务,端口分别为27017,28017,29017。