目录
概述-MongoDB Replication(官方英文文档)
冗余&&数据可用性
MongoDB副本集
多主机多节点docker部署流程
概述
环境准备:
部署步骤:
参考文献
单主机多节点的集群docker部署请移步至该参考文献
MongoDB中的副本集可以理解为同一组维护相同数据集的mongod进程。副本集作为所有生产部署的基础,它提供了冗余性、高可用性。下面主要介绍MongoDB中的副本以及副本集的组件及其架构。
副本集相当于在多个数据库服务端(或者说多个节点)进行了数据备份,这种方式有效提高了单节点数据库服务段的容错能力。也就是说当某个节点发生异常后,仍然可以从其他节点获取数据。副本集允许客户端从不同的服务端读取数据,因此该部署方式提供了更强大的数据读取的能力。在不同节点上维护副本集可以提高数据局部性以及数据可用性。
一个副本集由多个mongod实例组成,这些mongod实例维护着相同的数据集。副本集的组成包括多个数据负载节点和1个可选的仲裁节点。其中,多个数据负载节点中=1个主节点+多个从节点。
主从节点及其关系:如下方左图所示,主节点能够接受所有的读写操作;对于某个副本集来讲,通常只允许1个主节点存在。如下方右图所示,从节点相当于继承了主节点的操作,复制了主节点的数据集以保证各个节点的数据统一。
如下左图所示,当存在主、从节点时,可以添加仲裁节点。其作用面对异常情况(比如说主节点出现连接超时的情况时候,其他从节点就会被选举为主节点,这种情况可以粗浅对应下右图所示的状态)通过选举机制推选主节点。仲裁节点不存储数据集,并且其本身不会参与选举,也就是说不管总、从节点如何变化,仲裁节点都不会变化。
此外,客户端进行数据查询等操作时默认是请求主节点的,不过MongoDB副本集允许客户端优先从指定的从节点进行数据库的读取操作。
分别部署主节点、从节点、仲裁节点至3台服务器;
安装docker、提前拉取mongo镜像等;
# vim /etc/hosts
192.168.***.131:node1.example.com(主节点)
192.168.***.132:node2.example.com(从节点)
192.168.***.133:node3.example.com(仲裁节点)
# 在3台服务器上的自定义路径下创建如下路径
|-- mongo_replication
|-- data
cd /data/mongo_replication
openssl rand -base64 741 > mongodb-keyfile
# 创建的密钥文件拷贝到其他各节点的相同路径下
chmod 600 mongodb-keyfile
chown 999 mongodb-keyfile
docker run --network host --name mongo -v /data/mongo_replication/data:/data/db \
-v /data/mongo_replication:/opt/keyfile --hostname="node1.example.com" \
-p 27017:27017 -d mongo
# 进入容器进行用户创建
docker exec -it mongo mongosh admin
# 创建用户
db.createUser({user:"UserAdmin", pwd:"user_123456", roles:[{role:"userAdminAnyDatabase", db: "admin"}]});
# 创建管理员用户
db.createUser({user:"RootAdmin", pwd:"root_123456", roles:[{role:"root", db: "admin"}]});
docker stop mongo && docker rm mongo
#
docker run --network host --name mongo -v /data/mongo_replication/data:/data/db \
-v /data/mongo_replication:/opt/keyfile --hostname="node1.example.com" \
--add-host node1.example.com:${node1} \
--add-host node2.example.com:${node2} \
--add-host node3.example.com:${node3} \
-p 27017:27017 -d mongo \
--keyFile /opt/keyfile/mongodb-keyfile --replSet "rs0"
# 进入容器进行用户创建
docker exec -it mongo mongosh admin
db.auth("RootAdmin", "root_123456"); # 登录用户
rs.initiate # 初始化副本集
最初想在此处直接配置从节点、仲裁节点,但忽略了未创建从节点服务时无法进行连接,因此先使用默认配置初始化主节点,我们在后面再在集群内通过添加节点的方法进行从节点/仲裁节点的分配。
docker run --network host --name mongo -v /data/mongo_replication/data:/data/db \
-v /data/mongo_replication:/opt/keyfile --hostname="node2.example.com" \
--add-host node1.example.com:${node1} \
--add-host node2.example.com:${node2} \
--add-host node3.example.com:${node3} \
-p 27017:27017 -d mongo \
--keyFile /opt/keyfile/mongodb-keyfile --replSet "rs0"
docker run --network host --name mongo -v /data/mongo_replication/data:/data/db \
-v /data/mongo_replication:/opt/keyfile --hostname="node3.example.com" \
--add-host node1.example.com:${node1} \
--add-host node2.example.com:${node2} \
--add-host node3.example.com:${node3} \
-p 27017:27017 -d mongo \
--keyFile /opt/keyfile/mongodb-keyfile --replSet "rs0"
依次启动从节点/仲裁节点的服务后,首先在集群内添加从节点,也就是节点2,添加成功!
在添加节点3为仲裁节点时发生报错,根据官方文档结合网上解决办法进行解决了该问题,如下:
加入仲裁节点成功,此时查看集群配置:node1、node2、node3已分别配置为主、从、仲裁节点。
到这里,实际已经完成了本次跨主机的集群部署,后文我们验证下结果。
附配置成功的命令行:
rs.add("node2.example.com") # 添加从节点
db.adminCommand({"setDefaultRWConcern":1, "defaultWriteConcern":{"w":2}})
rs.addArb("node3.example.com") # 添加仲裁节点
在主节点执行数据插入操作:
在从节点查看数据同步情况:
利用mongo-compass查看集群情况: