目录
概述-MongoDB Replication(副本集,可参考官方英文)
冗余&&数据可用性
MongoDB副本集
单机多节点docker部署流程
参考文献
跨主机多节点的集群docker部署可移步至该参考文献
MongoDB中的副本集可以理解为同一组维护相同数据集的mongod进程。副本集作为所有生产部署的基础,它提供了冗余性、高可用性。下面主要介绍MongoDB中的副本以及副本集的组件及其架构。
副本集相当于在多个数据库服务端(或者说多个节点)进行了数据备份,这种方式有效提高了单节点数据库服务段的容错能力。也就是说当某个节点发生异常后,仍然可以从其他节点获取数据。副本集允许客户端从不同的服务端读取数据,因此该部署方式提供了更强大的数据读取的能力。在不同节点上维护副本集可以提高数据局部性以及数据可用性。
一个副本集由多个mongod实例组成,这些mongod实例维护着相同的数据集。副本集的组成包括多个数据负载节点和1个可选的仲裁节点。其中,多个数据负载节点中=1个主节点+多个从节点。
主从节点及其关系:如图1所示,主节点能够接受所有的读写操作;对于某个副本集来讲,通常只允许1个主节点存在。如图2所示,从节点相当于继承了主节点的操作,复制了主节点的数据集以保证各个节点的数据统一。
图1 图2
如图3所示,当存在主、从节点时,可以添加仲裁节点。其作用面对异常情况(比如说主节点出现连接超时的情况时候,其他从节点就会被选举为主节点,这种情况可以粗浅对应下图4所示的状态)通过选举机制推选主节点。仲裁节点不存储数据集,并且其本身不会参与选举,也就是说不管总、从节点如何变化,仲裁节点都不会变化。
图3 图4
此外,客户端进行数据查询等操作时默认是请求主节点的,不过MongoDB副本集允许客户端优先从指定的从节点进行数据库的读取操作。
sudo docker pull mongo
配置MongoDB容器挂载文件
# 创建本地文件夹作为各docker容器的挂载目录
sudo mkdir -p /data/application/mongo1/db
sudo mkdir -p /data/application/mongo2/db
sudo mkdir -p /data/application/mongo3/db
sudo mkdir -p /data/application/mongo1/configdb
sudo mkdir -p /data/application/mongo2/configdb
sudo mkdir -p /data/application/mongo3/configdb
# 在对应文件夹内创建配置文件
sudo vim /data/application/mongo1/configdb/mongod.conf
sudo cp /data/application/mongo1/configdb/mongod.conf /data/application/mongo2/configdb/
sudo cp /data/application/mongo1/configdb/mongod.conf /data/application/mongo3/configdb/
# 粘贴下面的配置文件后保存
# net:
# port: 27017
# bindIp: 0.0.0.0
# systemLog:
# logAppend: true
# security:
# keyFile: "/data/configdb/mongodbKeyfile.key" # 注意该路径为稍后创建容器内的路径,非本地宿主机
# clusterAuthMode: "keyFile"
# #authorization: "enabled"
# replication:
# replSetName: "mongoRs"
# 生成Key文件,这里需要切换至root
openssl rand -base64 756 > /data/application/mongo1/configdb/mongodbKeyfile.key
# 复制Key文件至各节点配置
sudo cp /data/application/mongo1/configdb/mongodbKeyfile.key /data/application/mongo2/configdb
sudo cp /data/application/mongo1/configdb/mongodbKeyfile.key /data/application/mongo3/configdb
# Key文件可读权限
sudo chmod 400 /data/application/mongo1/configdb/mongodbKeyfile.key
sudo chmod 400 /data/application/mongo2/configdb/mongodbKeyfile.key
sudo chmod 400 /data/application/mongo3/configdb/mongodbKeyfile.key
启动容器(3个节点):
# 实例化docker容器
sudo docker run -di --name=mongo_server1 -p 37017:27017 -v /data/application/mongo1/configdb:/data/configdb/ -v /data/application/mongo1/db:/data/db/ mongo --replSet "mongoRs" --bind_ip_all -f /data/configdb/mongod.conf
sudo docker run -di --name=mongo_server2 -p 47017:27017 -v /data/application/mongo2/configdb:/data/configdb/ -v /data/application/mongo2/db:/data/db/ mongo --replSet "mongoRs" --bind_ip_all -f /data/configdb/mongod.conf
sudo docker run -di --name=mongo_server3 -p 57017:27017 -v /data/application/mongo3/configdb:/data/configdb/ -v /data/application/mongo3/db:/data/db/ mongo --replSet "mongoRs" --bind_ip_all -f /data/configdb/mongod.conf
查看当前容器运行状态:
分别配置容器1、配置容器2、配置容器3为主节点、从节点、仲裁节点
# 进入容器
sudo docker exec -it mongo_server1 mongosh admin
# 配置节点
rs.initiate({_id:"mongoRs", members:[{_id:0, host:"你的IP:37017"}, {_id:1, host:"你的IP:47017"}, {_id:2, host:"你的IP:57017", arbiterOnly:true}]})
创建用户用mongodb-compass连接验证下数据集的同步
Ubuntu如何安装mongodb-compass的方法可以参考下面:
wget https://downloads.mongodb.com/compass/mongodb-compass_1.32.3_amd64.deb
sudo dpkg -i mongodb-compass_1.32.3_amd64.deb
mongodb-compass # 执行compass
从下图可以看出,在主节点创建记录,从节点同步产生记录!
上述已完成!!!