使用 Docker 部署高可用 MongoDB 分片集群
使用 Docker 部署 MongoDB 集群
Mongodb 集群搭建
mongodb 集群搭建的方式有三种:
- 主从备份(Master - Slave)模式,或者叫主从复制模式。
- 副本集(Replica Set)模式。
- 分片(Sharding)模式。
其中,第一种方式基本没什么意义,官方也不推荐这种方式搭建。另外两种分别就是副本集和分片的方式。今天介绍副本集的方式搭建 mongodb 高可用集群
简介以及概述
首先我们先来了解一下 Mongo 集群的概念,Mongo 集群有 3 个主要组件
ConfigServer:在集群中扮演存储整个集群的配置信息,负责配置存储,如果需要高可用的 ConfigServer 那么需要 3 个节点。
Shard:分片,存储真实的数据,每一个 Shard 分片都负责存储集群中的数据,例如一个集群有 3 个分片,然后我们定义分片规则为哈希,那么整个集群的数据就会(分割)到 3 个分片中的某一个分片,那么分片是特别重要的,如果集群中的一个分片全部崩溃了那么集群将不可用,所以我们要保证集群的高可用,那么我们需要一个分片配置 3 个节点,2 个副本集一个仲裁节点,仲裁节点类似于 Redis 的哨兵模式,如果发现主节点挂了那么让另一个副本集进行数据存储。
Mongos:Mongos 我们可以理解为整个集群的入口,类似于 Kafka 的 Broker 代理,也就是客户端,我们通过客户端连接集群进行查询。
下面是 MongoDB 的官方集群架构图,我们看到 Mongos 是一个路由,他们的信息都存储在 ConfigServer 中,我们通过 Mongos 进行添加,然后根据条件将数据进行分片到分片的副本集中
Mongo 分片集群高可用 + 权限 方案
那么我们先来总结一下我们搭建一个高可用集群需要多少个 Mongo
mongos : 3 台
configserver : 3 台
shard : 3 片
每一片 shard 分别 部署两个副本集和一个仲裁节点 : 3 台
那么就是 3 + 3 + 3 * 3 = 15 台,由于服务器数量限制暂时使用 3 台进行部署,设计如下
-
node-1.internal
[Node 1
]: 2 核 4g 部署 1 个 mongos,1 个 configserver,1 个分片组 -
node-2.internal
[Node 3
]: 2 核 4g 部署 1 个 mongos,1 个 configserver,1 个分片组 -
node-3.internal
[Node 2
]: 2 核 4g 部署 1 个 mongos,1 个 configserver,1 个分片组 -
端口分配:
ip host role port node-1.internal mongos 10900 node-1.internal configsvr 10901 node-1.internal shard-master 10902 node-1.internal shard-slave 10903 node-1.internal shard-arbiter 10904 node-2.internal mongos 10900 node-2.internal configsvr 10901 node-2.internal shard-master 10902 node-2.internal shard-slave 10903 node-2.internal shard-arbiter 10904 node-3.internal mongos 10900 node-3.internal configsvr 10901 node-3.internal shard-master 10902 node-3.internal shard-slave 10903 node-3.internal shard-arbiter 10904
MongoDB Cluster 实施
为了达到高可用且控制权限的目的,这里 mongo 之间通信采用秘钥文件,所以我们先进行生成
openssl rand -base64 756 > /mnt/data/docker/mongo-cluster/configsvr/conf/mongo.key
文件如下,我们,之后我们所以 key 都采用这个(请采用自己生成的 key)
tsUtJb3T...SomyNDISXDiSTJQEVym
OhXXzwB+...FC1q39IrUDAEpCikSKS
abGl8RTE...b4I4jzvgStcPcozRgOZ
5kPvXByb...WZe4VcF+iU6jgw73juZ
pbcZR5oT...E8LFPBZ+XLGYrtmDqo0
9tA1x8R+...0afT4ou2w7QHsdF0WRn
nskJ1FCA...pBkj4muKUk7OTHRV6bs
qr2C73bq...BIGiSD1Kyr/iqO7gD4C
GN8iA3Mq...Wt5XLOWP7CBGuTo7KST
Y5HAcblq...gS0GZfUk4bndLTkHrJd
tcR4WreH...Woukw/eViacLlBHKOxB
QVgfo449...qx5MsOlIXiFwA3ue1Lo
kiFq5c6I...ChYow7TkTLf/LsnjL3m
rmkDRgzA...tGIxRnP07pMS9RP4TjS
ZSd9an5y...gFl/Eq5NH60Zd4utxfi
qM2FH7aN...6kA
配置并部署 MongoDB Cluster
PS:由于使用 docker-compose 部署,每个宿主机配置一致,以下操作重复执行即可
配置 Mongos 环境
创建配置文件
mkdir -p /mnt/data/docker/mongo-cluster/mongos/{data,conf}
填入配置文件,这里我们删除了认证的信息,因为 mongos 是不能设置认证的,他也是用的前面使用的密码即可,如 configserver 的密码
echo "net:port: 10900 #端口号
sharding:configDB: configsvr/node-1.internal:10901,node-2.internal:10901,node-3.internal:10901security:keyFile: /data/configdb/mongo.key #keyFile路径
" > /mnt/data/docker/mongo-cluster/mongos/conf/mongo.conf
创建 keyfile
echo "${mongoKey}" > /mnt/data/docker/mongo-cluster/mongos/conf/mongo.key#处理权限为400chmod 400 /mnt/data/docker/mongo-cluster/mongos/conf/mongo.key
配置 Config Server 环境
创建挂载文件目录
mkdir -p /mnt/data/docker/mongo-cluster/configsvr/{data,conf}
写入配置文件
echo "
# 日志文件
#systemLog:
# destination: file
# logAppend: true
# path: /var/log/mongodb/mongod.log# 网络设置
net:port: 10901 #端口号
# bindIp: 127.0.0.1 #绑定ip
replication:replSetName: configsvr
sharding:clusterRole: configsvr
security:authorization: enabled #是否开启认证keyFile: /data/configdb/mongo.key #keyFile路径 " > /mnt/data/docker/mongo-cluster/configsvr/conf/mongo.conf
写入 key 文件
echo "${mongoKey}" > /mnt/data/docker/mongo-cluster/configsvr/conf/mongo.key#处理权限为400chmod 400 /mnt/data/docker/mongo-cluster/configsvr/conf/mongo.key
配置 Shard 分片组环境
在同一台服务器上初始化一组分片
创建挂载文件
mkdir -p /mnt/data/docker/mongo-cluster/shard-master/{data,conf}
mkdir -p /mnt/data/docker/mongo-cluster/shard-slave/{data,conf}
mkdir -p /mnt/data/docker/mongo-cluster/shard-arbiter/{data,conf}
配置配置文件
echo "
# 日志文件
#systemLog:
# destination: file
# logAppend: true
# path: /var/log/mongodb/mongod.log# 网络设置
net:port: 10902 #端口号
# bindIp: 127.0.0.1 #绑定ip
replication:replSetName: shard-{1|2|3}
sharding:clusterRole: shardsvr
security:authorization: enabled #是否开启认证keyFile: /data/configdb/mongo.key #keyFile路径 " > /mnt/data/docker/mongo-cluster/shard-master/conf/mongo.conf
------------------------------------------------------------------------------
echo "
# 日志文件
#systemLog:
# destination: file
# logAppend: true
# path: /var/log/mongodb/mongod.log# 网络设置
net:port: 10903 #端口号
# bindIp: 127.0.0.1 #绑定ip
replication:replSetName: shard-{1|2|3}
sharding:clusterRole: shardsvr
security:authorization: enabled #是否开启认证keyFile: /data/configdb/mongo.key #keyFile路径 " > /mnt/data/docker/mongo-cluster/shard-slave/conf/mongo.conf
------------------------------------------------------------------------------
echo "
# 日志文件
#systemLog:
# destination: file
# logAppend: true
# path: /var/log/mongodb/mongod.log# 网络设置
net:port: 10904 #端口号
# bindIp: 127.0.0.1 #绑定ip
replication:replSetName: shard-{1|2|3}
sharding:clusterRole: shardsvr
security:authorization: enabled #是否开启认证keyFile: /data/configdb/mongo.key #keyFile路径 " > /mnt/data/docker/mongo-cluster/shard-arbiter/conf/mongo.conf
创建 keyfile
echo "${mongoKey}" > /mnt/data/docker/mongo-cluster/shard-master/conf/mongo.key#处理权限为400chmod 400 /mnt/data/docker/mongo-cluster/shard-master/conf/mongo.key#复制
cp /mnt/data/docker/mongo-cluster/shard-master/conf/mongo.key /mnt/data/docker/mongo-cluster/shard-slave/conf/mongo.keycp /mnt/data/docker/mongo-cluster/shard-master/conf/mongo.key /mnt/data/docker/mongo-cluster/shard-arbiter/conf/mongo.key
部署
编写 docker-compose.yaml
version: "3"
services:mongo-cluster-mongos:image: mongo:6.0container_name: mongo-cluster-mongosprivileged: trueentrypoint: "mongos"network_mode: hostports:- "10900:10900"volumes:- /mnt/data/docker/mongo-cluster/mongos/conf:/data/configdb- /mnt/data/docker/mongo-cluster/mongos/data:/data/dbcommand: -f /data/configdb/mongo.conf --bind_ip_all # bind all ip addressrestart: alwaysmongo-cluster-config:image: mongo:6.0container_name: mongo-cluster-configprivileged: truenetwork_mode: hostports:- "10901:10901"volumes:- /mnt/data/docker/mongo-cluster/configsvr/conf:/data/configdb- /mnt/data/docker/mongo-cluster/configsvr/data:/data/dbcommand: mongod -f /data/configdb/mongo.confrestart: alwaysmongo-cluster-shard-master:image: mongo:6.0container_name: mongo-cluster-shard-masterprivileged: truenetwork_mode: hostports:- "10902:10902"volumes:- /mnt/data/docker/mongo-cluster/shard-master/conf:/data/configdb- /mnt/data/docker/mongo-cluster/shard-master/data:/data/dbcommand: mongod -f /data/configdb/mongo.confrestart: alwaysmongo-cluster-shard-slave:image: mongo:6.0container_name: mongo-cluster-shard-slaveprivileged: truenetwork_mode: hostports:- "10903:10903"volumes:- /mnt/data/docker/mongo-cluster/shard-slave/conf:/data/configdb- /mnt/data/docker/mongo-cluster/shard-slave/data:/data/dbcommand: mongod -f /data/configdb/mongo.confrestart: alwaysmongo-cluster-shard-arbiter:image: mongo:6.0container_name: mongo-cluster-shard-arbiterprivileged: truenetwork_mode: hostports:- "10904:10904"volumes:- /mnt/data/docker/mongo-cluster/shard-arbiter/conf:/data/configdb- /mnt/data/docker/mongo-cluster/shard-arbiter/data:/data/dbcommand: mongod -f /data/configdb/mongo.confrestart: always
docker-compose up -d
配置 MongoDB Cluster
由于 mongos 是客户端,所以我们先搭建好 config 以及 shard 之后再搭建 mongos。
初始化 config-server
进入第一台宿主机 (node-1.internal
) 的 config-server 容器
docker exec -it mongo-cluster-config bash
mongosh -port 10901
输入
rs.initiate({_id: "configsvr",members: [{ _id : 1, host : "node-1.internal:10901" },{ _id : 2, host : "node-2.internal:10901" },{ _id : 3, host : "node-3.internal:10901" }]}
)
如果返回 ok 则成功
然后我们创建用户
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
初始化 shard 分片组并制定第三个副本集为仲裁节点
docker exec -it shard-master bashmongosh -port 10902#进行副本集配置rs.initiate({_id : "shard-{1|2|3}",members: [{ _id : 0, host : "node-1.internal:10902" },{ _id : 1, host : "node-1.internal:10903" },{ _id : 2, host : "node-1.internal:10904", arbiterOnly:true }]}
)
返回 ok 后创建用户
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
然后退出,第一台分片组搭建完成,其他两台分片组重复此操作
配置所有 mongos
进入第一台宿主机 (node-1.internal
) 的 mongos 容器
docker exec -it mongos bash
mongosh -port 10900
先登录(使用前面设置的 root 用户密码)
use admin;
db.auth("root","root");
进行配置分片信息
sh.addShard("shard-1/node-1.internal:10902,node-1.internal10903,node-1.internal:10904")
sh.addShard("shard-2/node-2.internal:10902,node-2.internal10903,node-2.internal:10904")
sh.addShard("shard-3/node-3.internal:10902,node-3.internal10903,node-3.internal:10904")
全部返回 ok 则成功
去其他两台 mongos 上重复执行上述操作
功能测试
数据库分片
use test
sh.enableSharding("test")对test库的test集合的_id进行哈希分片
db.users.createIndex({ _id: "hashed" })
sh.shardCollection("test.test", {"_id": "hashed" })
创建用户
use admin;
db.auth("root","root");
use test;
db.createUser({user:"kang",pwd:"kang",roles:[{role:'dbOwner',db:'test'}]})
插入数据
use test
for (i = 1; i <= 300; i=i+1){db.test.insert({'name': "bigkang"})}
相关文章:

使用 Docker 部署高可用 MongoDB 分片集群
使用 Docker 部署 MongoDB 集群 Mongodb 集群搭建 mongodb 集群搭建的方式有三种: 主从备份(Master - Slave)模式,或者叫主从复制模式。副本集(Replica Set)模式。分片(Sharding)…...
树莓派安装64位桌面版Ubuntu教程
事实证明不用显示屏没办法连接64位桌面版的22.04Ubuntu,虽然不用显示屏可以安装64位服务器版的22.04Ubuntu.或者虽然有但是我并不知道,我也不想再花时间去知道了,因为我已经花了3天时间了。 步骤: 1:下载64位22.04Ub…...

【sql注入】sql关卡1~4
前言: 靶场自取 level-1 测试注入点 POC: 1,1,1,1"",1/1,1/0 》存在注入点 爆破 POC: id-1andextractvalue(1,concat(0x7e,user(),0x7e))-- level-2 尝试注入点 POC1:admin POC2:admin POC3:adminandsleep(3)-- POC4: adminandif(1,1,0)0-- POC…...

【机器学习合集】模型设计之注意力机制动态网络 ->(个人学习记录笔记)
文章目录 注意力机制1. 注意力机制及其应用1.1 注意力机制的定义1.2 注意力机制的典型应用 2. 注意力模型设计2.1 空间注意力机制2.2 空间注意力模型2.3 通道注意力机制2.4 空间与通道注意力机制2.5 自注意力机制2.5 级联attention 动态网络1. 动态网络的定义2. 基于丢弃策略的…...
【jvm】方法的调用
目录 一、方法的调用二、非虚方法三、虚方法四、虚拟机调用指令4.1 普通调用指令4.2 动态调用指令 五、代码示例5.1 父类5.2 子类5.3 接口5.4 接口实现 六、方法指令七、说明八、invokedynamic指令8.1 说明8.2 代码示例8.3 main方法指令 九、方法重写的本质十、虚方法表 一、方…...

Linux中的进程等待
文章目录 1.进程等待1.1进程等待必要性1.1.1为什么有进程等待这个概念1.1.2进程等待是什么?1.1.3进程等待具体干什么? 1.2进程退出方法: 2.具体代码实现 1.进程等待 1.1进程等待必要性 1.1.1为什么有进程等待这个概念 之前讲过,…...
ubuntu22.04桌面完整版配置WiFi方法(修改磁盘文件方式--不需要显示器)(注意了:后来发现这个方法是错误的!!!)
打开这个文件: /etc/network/interfaces 一般来说这个文件是无法修改的,但是可以通过在/etc/network/文件夹找一个叫做interfaces.d的文件夹,(正常的Ubuntu系统跟这个树莓派的Ubuntu系统不一样,正常系统没有这个interfaces文件)…...
React项目使用craco修改webpack配置
React项目使用craco 通过Create React App(CRA)搭建的react项目,webpack的相关配置是被默认隐藏起来的,如果想修改关于webpack的相关配置,有两种方式: npm run ejectcraco npm run eject npm run eject…...

@RunWith(SpringRunner.class)注解的作用
通俗点: RunWith(SpringRunner.class)的作用表明Test测试类要使用注入的类,比如Autowired注入的类,有了RunWith(SpringRunner.class)这些类才能实例化到spring容器中,自动注入才能生效 官方点: RunWith 注解是JUnit测…...

深入理解网络IO复用并发模型
本文主要介绍服务端对于网络并发模型以及Linux系统下常见的网络IO复用并发模型。文章内容一共分为两个部分。 第一部分主要介绍网络并发中的一些基本概念以及我们Linux下常见的原生IO复用系统调用(epoll/select)等。第二部分主要介绍并发场景下常见的网…...

二叉树采用二叉链表存储:编写计算整个二叉树高度的算法
二叉树采用二叉链表存储:编写计算整个二叉树高度的算法 (二叉树的高度也叫二叉树的深度) 代码思路: 首先你要明白什么是树的高度,简言之就是树有多少层,如下图: 下面这棵树的高度就是4 首先我们观察根节点࿰…...

antd Cascader级联菜单无法赋值回显问题
说起来太丢人了,自己还拿官网例子在这里调试半天,最后发现是一个特别小儿科的问题哈哈 Cascader级联数据是服务端返回然后自己处理过的,使用了cascader的fileNames属性重置字段名,最后发现服务端回传的数据无法赋值回显在组件上&…...
在react中使用redux react-redux的使用demo
前言: redux是一种状态管理工具,可以存储和操作一些全局或者很多组件需要使用的公共数据。 平心而论,redux的使用对于新上手来说不太友好,多个依赖包的,多种api的结合使用,相对来说比做同样一件事的vuex用起来比较麻烦.不过,熟能生巧,用多了也就习惯了,下面是个人的一个demo,…...

Flutter 06 动画
一、动画基本原理以及Flutter动画简介 1、动画原理: 在任何系统的Ul框架中,动画实现的原理都是相同的,即:在一段时间内,快速地多次改变Ul外观;由于人眼会产生视觉暂留,所以最终看到的就是一个…...
优化改进YOLOv5算法之添加MS-Block模块,有效提升目标检测效果(超详细)
目录 前言 1 MS-Block原理 1.1 Multi-Scale Building Block Design 1.2 Heterogeneous Kernel Selection Protocol 2 YOLOv5算法中加入MS-Block...
【论文阅读】Iterative Poisson Surface Reconstruction (iPSR) for Unoriented Points
文章目录 声明作者列表核心思想归纳算法流程机器翻译声明 本帖更新中如有问题,望批评指正!如果有人觉得帖子质量差,希望在评论中给出建议,谢谢!作者列表 FEI HOU(侯飞)、CHIYU WANG、WENCHENG WANG:中国科学院大学 HONG QIN CHEN QIAN、YING HE 核心思想归纳 当一条从…...
通过akshare获取股票分钟数据
参考:https://blog.csdn.net/qnloft/article/details/131218295 import akshare as ak 个股的 df ak.stock_zh_a_hist_min_em(symbol“000001”, start_date“2023-11-03 09:30:00”, end_date“2023-11-03 15:00:00”, period‘1’, adjust‘’) print(df) date_info df[‘…...
【论文阅读笔记】Traj-MAE: Masked Autoencoders for Trajectory Prediction
Abstract 通过预测可能的危险,轨迹预测一直是构建可靠的自动驾驶系统的关键任务。一个关键问题是在不发生碰撞的情况下生成一致的轨迹预测。为了克服这一挑战,我们提出了一种有效的用于轨迹预测的掩蔽自编码器(Traj-MAE),它能更好地代表驾驶…...

MySQL - Zero date value prohibited
问题: timestamp字段报Caused by: com.mysql.cj.exceptions.DataReadException: Zero date value prohibited 原因: timestamp字段存入了0值, 超出了最小值1900-01-01 00:00:00, 转Java对象的时候报错 解决: 1.修复或删除原数据 2. mysqlurl 中添加zeroDateTimeBehaviorconve…...
设计模式——迭代器模式(Iterator Pattern)+ Spring相关源码
文章目录 一、迭代器模式二、例子2.1 菜鸟例子2.1.1 定义迭代器接口2.1.2 定义迭代对象接口——用于返回一个迭代器2.1.3 实现 迭代对象 和 迭代器2.1.4 使用 2.2 JDK源码——ArrayList2.3 Spring源码——DefaultListableBeanFactory 三、其他设计模式 一、迭代器模式 类型&am…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...