副本集(Replica Set)是一组MongoDB实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成。通过Replication,将数据的更新由Primary推送到其他实例上,在一定的延迟之后,每个MongoDB实例维护相同的数据集副本。通过维护冗余的数据库副本,能够实现数据的异地备份,读写分离和自动故障转移
主节点(Primary)
接收所有的写请求,然后把修改同步到所有Secondary。一个Replica Set只能有一个Primary节点,当Primary挂掉后,其他Secondary或者Arbiter节点会重新选举出来一个主节点。默认读请求也是发到Primary节点处理的,可以通过修改客户端连接配置以支持读取Secondary节点。
副本节点(Secondary)
与主节点保持同样的数据集。当主节点挂掉的时候,参与选主。
仲裁者(Arbiter)
不保有数据,不参与选主,只进行选主投票。使用Arbiter可以减轻数据存储的硬件需求,Arbiter几乎没什么大的硬件资源需求,但重要的一点是,在生产环境下它和其他数据节点不要部署在同一台机器
· N 个节点的集群 · 任何节点可作为主节点 · 所有写入操作都在主节点上 · 自动故障转移 · 自动恢复
由图可以看到客户端连接到整个副本集,不关心具体哪一台机器是否挂掉。主服务器负责整个副本集的读写,副本集定期同步数据备份,一但主节点挂掉,副本节点就会选举一个新的主服务器,这一切对于应用服务器不需要关心。我们看一下主服务器挂掉后的架构:
副本集中的副本节点在主节点挂掉后通过心跳机制检测到后,就会在集群内发起主节点的选举机制,自动选举一位新的主服务器。
为了快速搭建,我是采用docker-compose来构建mongodb副本集,在用docker-compose构建之前,需要安装一下docker和docker-compose。默认在centos7安装 1、docker安装教程可以查看如下链接
https://www.cnblogs.com/qingyunzong/p/9011006.html
2、docker-compose安装教程可以查看如下链接
https://docs.docker.com/compose/install/
3、docker-compose常用命令 通过docker-compose --help来查看
4、编写docker-compose.yml
version: '2.1'
services:
master:
image: docker.io/mongo
container_name: master
restart: always
privileged: true
ports:
- 27017:27017
volumes:
- ./data/master:/data/db
command: mongod --dbpath /data/db --replSet rs --oplogSize 128
slave1:
image: docker.io/mongo
container_name: slave1
restart: always
privileged: true
ports:
- 27018:27017
volumes:
- ./data/slave1:/data/db
command: mongod --dbpath /data/db --replSet rs --oplogSize 128
slave2:
image: docker.io/mongo
container_name: slave2
restart: always
privileged: true
ports:
- 27019:27017
volumes:
- ./data/slave2:/data/db
command: mongod --dbpath /data/db --replSet rs --oplogSize 128
5、在 docker-compose.yml 所在路径下执行该命令 compose 就会自动构建镜像并使用镜像启动容器
docker-compose up -d // 后台启动并运行容器
以上就是使用docker-compose构建mongodb副本集的过程,如果对docker-compose不熟的朋友,也可以使用如下链接,直接通过shell操作搭建
https://www.linuxidc.com/Linux/2017-11/148740p3.htm。
或者可以直接通过docker来搭建,具体教程可以参考如下链接
https://blog.csdn.net/dengzhongmingabc/article/details/81188613
rs.status() //查看成员的运行状态等信息
rs.config() //查看配置信息
rs.slaveOk() //允许在SECONDARY节点上进行查询操作,默认从节点不具有查询功能
rs.isMaster() //查询该节点是否是主节点
rs.add({}) //添加新的节点到该副本集中
rs.remove() //从副本集中删除节点
本文简要论述mongodb副本集一些基本概念和搭建,写这篇文章的目的,主要是为了下篇文章springboot实战之mongodb事务支持做铺垫。因为mongodb4.0+才支持副本集事务,也就意味着如果想在springboot启用mongodb事务,其mongodb的版本至少要>=4,而且其架构是使用了副本集。不过4.0的事务存在最大修改16MB、事务执行时间不能过长的限制。在我写这篇文章的时候,我发现mongodb的最新版本4.2,已经可以支持分布式事务,包括分片事务,而不仅仅局限于多文档副本集事务,感兴趣的朋友可以关注下
https://docs.mongodb.com/manual/core/transactions/
https://docs.mongodb.com/manual/replication/
mongodb副本集的原理及命令
https://blog.csdn.net/caiqiandu/article/details/89928151
mongodb副本集高可用架构
https://www.cnblogs.com/littleatp/p/8562842.html