基本架构
MongoDB 复制集基本构成是 1 主 2 从的结构,自带互相监控投票机制(通过 Raft 实现,mysql MGR 用的是 Paxos 的变种)。
如果主库宕机了,复制集内部会进行投票选举,选择一个新的主库替代原有主库对外提供服务。同时复制集会自动通知客户端程序,主库已经发生切换了。应用就会连接到新的主库。
一个三成员的复制集的基本架构有如下两种类型:
- 三个有数据;
- 两个有数据,一个仅参与仲裁,这个参与仲裁的节点被称为 arbiter 节点;
下面对这两种类型的架构做一下简单的说明。
三个数据节点
一个主库,两个从库,主库宕机时,这两个从库都可以被选为主库。
当主库宕机后,两个从库都会进行竞选,其中一个变为主库,当原主库恢复后,作为从库加入当前的复制集群即可。
存在 arbiter 节点
一个主库,一个从库,一个 aribiter 节点,如果主库挂了,该从库就会被选举成为主库, 在选举中,aribiter 节点仅参与仲裁投票,不能成为主库。
由于 arbiter 节点没有复制数据,因此这个架构中仅提供一个完整的数据副本。arbiter 节点只需要更少的资源,代价是更有限的冗余和容错。
当主库宕机时,将会选择从库成为主,主库修复后,将其加入到现有的复制集群中即可。
环境规划
所以对于 MongoDB 复制集架构的部署我们需要三个以上的节点(实验环境可使用单机多实例),我这里就使用单机多实例的方式演示了。
我这里实验环境大致如下:
- 系统:CentOS 7.8;
- 内存大小:2G;
- 规划实例端口:28017、28018、28019、28020;
做如下操作之前请按上一篇文章将 MongoDB 二进制包解压到指定路径并配置好环境变量。
复制集应用
多实例配置
1、切换到 mongod
用户:
2、为每个实例准备一套目录:
3、添加配置文件:
4、配置每个实例被 systemd 管理:
5、启动多个实例并检查端口是否已占用:
至此,MongoDB 的 4 个实例就已经正常启动了。
普通复制集
1、以配置 1 主 2 从为例,随便连入一个实例,我这里以连入 28017 为例:
2、再查看另外两个节点,会发现它们是从库了:
3、测试关闭主库,即 28017 实例,检查新主库:
4、启动 28017 实例,然后检查该实例状态:
存在 arbiter 节点的复制集
以一主一从一 arbiter 节点的复制集为例,配置很简单,仅需要在初始化复制集时设定要作为 arbiter 的节点的 arbiterOnly
属性为 true
,如下:
除了在初始化复制集时指定 arbiter 节点,还可通过下面的复制集管理操作来动态添加新的 arbiter 节点到复制集中,继续往下看吧~~~
复制集管理
常用的复制集管理操作有如下:
特殊复制集
除了普通的数据节点外,MongoDB 复制集中可存在如下三类特殊的节点:
- arbiter 节点:主要负责选主过程中的投票,但是不存储任何数据,也不提供任何服务;
- hidden 节点:隐藏节点,不参与选主,也不对外提供服务;
- delay 节点:延时节点,数据落后于主库一段时间,因为数据是延时的,也不应该提供服务或参与选主,所以通常会配合 hidden(隐藏)一起使用;
下面就以配置 28020 节点为延时节点为例,即需要同时配置它为隐藏节点,随便选择复制集中的一个实例登入,执行如下操作:
做完上述操作,28020 节点就成为了一个延时节点。
查看从库的同步状态:
可以看到,28020 节点当前落后于主库 124 秒。
评论区