1、概述:
组成:
Mongodb复制集(副本集replica set)由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写入Primary,Secondary通过oplog来同步Primary的数据,保证主节点和从节点数据的一致性,复制集在完成主从复制的基础上,通过心跳机制,一旦primary节点出现宕机,则触发选举一个新的主节点,剩下的secondary节点指向新的primary,时间应该在10-30s内完成感知primary节点故障,实现高可用数据库集群;
特点:
主是唯一的,但不是固定的;
由大多数据原则保证数据的一致性;
从库无法写入(默认情况下,不使用驱动连接时,也是不能查询的);
相对于传统的主从结构,复制集可以自动容灾;
2、原理:
角色(按是否存储数据划分):
Primary:主节点,由选举产生,负责客户端的写操作,产生oplog日志文件;
Secondary:从节点,负责客户端的读操作,提供数据的备份和故障的切换;
Arbiter:仲裁节点,只参与选举的投票,不会成为primary,也不向Primary同步数据,若部署了一个2个节点的复制集,1个Primary,1个Secondary,任意节点宕机,复制集将不能提供服务了(无法选出Primary),这时可以给复制集添加一个Arbiter节点,即使有节点宕机,仍能选出Primary;
角色(按类型区分):
Standard(标准):这种是常规节点,它存储一份完整的数据副本,参与投票选举,有可能成为主节点;
Passive(被动):存储完整的数据副本,参与投票,不能成为活跃节点。
Arbiter(投票):仲裁节点只参与投票,不接收复制的数据,也不能成为活跃节点。
注:每个参与节点(非仲裁者)有个优先权(0-1000),优先权(priority)为0则是被动的,不能成为活跃节点,优先权不为0的,按照由大到小选出活跃节点,优先值一样的则看谁的数据比较新;
注:Mongodb 3.0里,复制集成员最多50个,参与Primary选举投票的成员最多7个;
选举:
每个节点通过优先级定义出节点的类型(标准、被动、投票);
标准节点通过对比自身数据进行选举出peimary节点或者secondary节点;
影响选举的因素:
1.心跳检测:复制集内成员每隔两秒向其他成员发送心跳检测信息,若10秒内无响应,则标记其为不可用;
2.连接:在多个节点中,最少保证两个节点为活跃状态,如果集群中共三个节点,挂掉两个节点,那么剩余的节点无论状态是primary还是处于选举过程中,都会直接被降权为secondary;
触发选举的情况:
1.初始化状态
2.从节点们无法与主节点进行通信 3.主节点辞职
主节点辞职的情况:
1.在接收到replSetStepDown命令后;
2.在现有的环境中,其他secondary节点的数据落后于本身10s内,且拥有更高优先级;
3.当主节点无法与群集中多数节点通信;
注:当主节点辞职后,主节点将关闭自身所有的连接,避免出现客户端在从节点进行写入操作;
3、应用案例:

异常处理:
当Primary宕机时,如果有数据未同步到Secondary,当Primary重新加入时,如果新的Primary上已经发生了写操作,则旧Primary需要回滚部分操作,以保证数据集与新的Primary一致。旧Primary将回滚的数据写到单独的rollback目录下,数据库管理员可根据需要使用mongorestore进行恢复。
4、部署MongoDB副本集集群
4.1 下载mongo版本
https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.5.tgz
4.2 解压重命名:
1 | tar xf mongodb-linux-x86_64-4.0.5.tgz |
4.3 优化系统参数:
1 | sudo vim /etc/security/limits.conf |
修改用户的 max user process
1 | sudo vim /etc/security/limits.d/20-nproc.conf |
4.4 生成集群认证文件
1 | openssl rand -base64 756 > mongodb/mongokey |
5、配置服务启动
5.1 安装supervisor
1 | wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate |
5.2 配置supervisor启动mongo服务
1 | mkdir supervisor |
5.3 启动mongo看有没有报错
1 | supervisord -c supervisor/supervisor.conf |
5.4 报错有点多,我们一一解决:
5.4.1 第一个没有启动认证登录,第二个没有绑定IP地址,可以通过修改启动配置来解决
1 | [program:mongod] |
5.4.2 第三四个通用问题,这是centos7的解决办法
1 | sudo mkdir /etc/tuned/no-thp |
重新启动mongo
1 | ./mongodb/bin/mongo |
6、配置集群
6.1 集群配置
1 | config = { _id:"vbox", members:[ |
6.2 初始化集群
1 | vbox:SECONDARY> rs.initiate(config); |
6.3 创建最高权限root用户
1 | vbox:PRIMARY> use admin |
6.4 配置从节点可读
1 | vbox:PRIMARY> rs.slaveOk() |
但是这种方式有一个缺点就是,下次再通过mongo进入实例的时候,查询仍然会报错,为此可以通过下列方式
第二种方法:
1 | vi ~/.mongorc.js |
这样的话以后每次通过mongo命令进入都可以查询了
6.5 配置supervisor开启启动
1 | sudo vim /usr/lib/systemd/system/supervisord.service |
1 | sudo systemctl enable supervisord |