【MongoDB】docker部署mongdb多机集群(跨主机副本集)

目录

概述-MongoDB Replication(官方英文文档)

​​​​​​冗余&&数据可用性

MongoDB副本集

多主机多节点docker部署流程

概述

环境准备:

部署步骤:

参考文献


概述-MongoDB Replication(官方英文文档)

        单主机多节点的集群docker部署请移步至该参考文献

        MongoDB中的副本集可以理解为同一组维护相同数据集的mongod进程。副本集作为所有生产部署的基础,它提供了冗余性、高可用性。下面主要介绍MongoDB中的副本以及副本集的组件及其架构。

  • ​​​​​​冗余&&数据可用性

      副本集相当于在多个数据库服务端(或者说多个节点)进行了数据备份,这种方式有效提高了单节点数据库服务段的容错能力。也就是说当某个节点发生异常后,仍然可以从其他节点获取数据。副本集允许客户端从不同的服务端读取数据,因此该部署方式提供了更强大的数据读取的能力。在不同节点上维护副本集可以提高数据局部性以及数据可用性。

  • MongoDB副本集

        一个副本集由多个mongod实例组成,这些mongod实例维护着相同的数据集。副本集的组成包括多个数据负载节点1个可选的仲裁节点。其中,多个数据负载节点中=1个主节点+多个从节点

       主从节点及其关系:如下方左图所示,主节点能够接受所有的读写操作;对于某个副本集来讲,通常只允许1个主节点存在。如下方右图所示,从节点相当于继承了主节点的操作,复制了主节点的数据集以保证各个节点的数据统一。

​  

        如下左图所示,当存在主、从节点时,可以添加仲裁节点。其作用面对异常情况(比如说主节点出现连接超时的情况时候,其他从节点就会被选举为主节点,这种情况可以粗浅对应下右图所示的状态)通过选举机制推选主节点。仲裁节点不存储数据集,并且其本身不会参与选举,也就是说不管总、从节点如何变化,仲裁节点都不会变化。

         此外,客户端进行数据查询等操作时默认是请求主节点的,不过MongoDB副本集允许客户端优先从指定的从节点进行数据库的读取操作。


多主机多节点docker部署流程

概述

        分别部署主节点、从节点、仲裁节点至3台服务器;

环境准备:

        安装docker、提前拉取mongo镜像等;

部署步骤:


  •  修改3台服务器的/etc/hosts
# vim /etc/hosts
192.168.***.131:node1.example.com(主节点)
192.168.***.132:node2.example.com(从节点)
192.168.***.133:node3.example.com(仲裁节点)

  • 创建数据库文件存放路径结构(其中data用于存放数据库文件)
# 在3台服务器上的自定义路径下创建如下路径
|-- mongo_replication
    |-- data

  • 创建主节点密钥文件(其他节点进行远程复制)
cd /data/mongo_replication
openssl rand -base64 741 > mongodb-keyfile
# 创建的密钥文件拷贝到其他各节点的相同路径下
chmod 600 mongodb-keyfile
chown 999 mongodb-keyfile

  • 创建主节点的mongodb服务并创建用户 
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"}]});

【MongoDB】docker部署mongdb多机集群(跨主机副本集)_第1张图片


  • 利用密钥文件创建MongoDB服务
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 # 初始化副本集

【MongoDB】docker部署mongdb多机集群(跨主机副本集)_第2张图片最初想在此处直接配置从节点、仲裁节点,但忽略了未创建从节点服务时无法进行连接,因此先使用默认配置初始化主节点,我们在后面再在集群内通过添加节点的方法进行从节点/仲裁节点的分配。


  •  启动各从节点与仲裁节点:
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为仲裁节点时发生报错,根据官方文档结合网上解决办法进行解决了该问题,如下:

【MongoDB】docker部署mongdb多机集群(跨主机副本集)_第3张图片   

加入仲裁节点成功,此时查看集群配置:node1、node2、node3已分别配置为主、从、仲裁节点。

【MongoDB】docker部署mongdb多机集群(跨主机副本集)_第4张图片

到这里,实际已经完成了本次跨主机的集群部署,后文我们验证下结果。

附配置成功的命令行:

rs.add("node2.example.com")  # 添加从节点
db.adminCommand({"setDefaultRWConcern":1, "defaultWriteConcern":{"w":2}})
rs.addArb("node3.example.com")  # 添加仲裁节点

  • 数据同步测试等 

 在主节点执行数据插入操作:

【MongoDB】docker部署mongdb多机集群(跨主机副本集)_第5张图片

 在从节点查看数据同步情况: 

【MongoDB】docker部署mongdb多机集群(跨主机副本集)_第6张图片

 利用mongo-compass查看集群情况:

【MongoDB】docker部署mongdb多机集群(跨主机副本集)_第7张图片

参考文献

  • 官方文档:What is MongoDB? — MongoDB Manual
  • http://www.jianshu.com/p/7bfda4943034
  • 【MongoDB】docker部署MongoDB单机多节点集群_docker 部署mongodb集群

你可能感兴趣的:(数据库,mongodb,docker,数据库)