docker-compose mongodb 副本集

准备

cd /opt/mongos

把 3 个节点的数据目录创建好

mkdir -p ./mongos/{mongo1,mongo2,mongo3}

 mongodb 使用 keyFile 进行认证,副本集群中的每个节点的 mongodb 使用 keyFile 的内容作为认证其他成员的共享密码。mongodb 实例只有拥有正确的 keyFile 才可以加入副本集群,集群中所有成员的 keyFile 内容必须相同。

# 进入到 mongos 目录中,生成 keyfile 文件
cd ./mongos
# 其中数字 666 可以随便指定
openssl rand -base64 666 > mongodb.key

mongodb 的集群其实有 3 种角色:主节点、从节点、仲裁节点(可选,可有可无)

  • 主节点(Primary):主要负责数据的写操作,当然也可以读取数据,大部分命令需要在主节点才能运行。
  • 从节点(Secondary):从主节点实时同步数据,只能读取数据,不能进行写操作。
  • 仲裁节点(Arbiter):不保留任何数据的副本,只能用来投票选举使用。

本篇博客的演示中,没有去设置仲裁节点,3 个节点都保留数据副本。

一、docker-compose.yml编辑

在 /opt/mongos 目录下创建 docker-compose.yml 文件,内容如下:

version: '3.2'services:# 服务名称mongodb1:# 使用最新的 mongodb 镜像image: mongo:latest# docker 服务启动时,自动启动 mongo 容器restart: always# 容器的名称container_name: mongo1# 宿主机中的目录和文件,映射容器内部的目录和文件volumes:- ./mongos/mongo1:/data/db- ./mongos/mongodb.key:/data/mongodb.keyports:# 宿主机的端口映射容器内的端口- 27017:27017environment:# 初始化一个 root 角色的用户 jobs 密码是 123456- MONGO_INITDB_ROOT_USERNAME=jobs- MONGO_INITDB_ROOT_PASSWORD=123456# 使用创建的桥接网络,把各个 mongodb 容器连接在一起networks:- mongoNetwork# 启动容器时,在容器内部额外执行的命令# 其中 --replSet 参数后面的 mongos 是集群名称,这个很重要command: mongod --replSet mongos --keyFile /data/mongodb.keyentrypoint:- bash- -c- |chmod 400 /data/mongodb.keychown 999:999 /data/mongodb.keyexec docker-entrypoint.sh $$@mongodb2:image: mongo:latestrestart: alwayscontainer_name: mongo2volumes:- ./mongos/mongo2:/data/db- ./mongos/mongodb.key:/data/mongodb.keyports:- 27018:27017environment:- MONGO_INITDB_ROOT_USERNAME=jobs- MONGO_INITDB_ROOT_PASSWORD=123456networks:- mongoNetworkcommand: mongod --replSet mongos --keyFile /data/mongodb.keyentrypoint:- bash- -c- |chmod 400 /data/mongodb.keychown 999:999 /data/mongodb.keyexec docker-entrypoint.sh $$@mongodb3:image: mongo:latestrestart: alwayscontainer_name: mongo3volumes:- ./mongos/mongo3:/data/db- ./mongos/mongodb.key:/data/mongodb.keyports:- 27019:27017environment:- MONGO_INITDB_ROOT_USERNAME=jobs- MONGO_INITDB_ROOT_PASSWORD=123456networks:- mongoNetworkcommand: mongod --replSet mongos --keyFile /data/mongodb.keyentrypoint:- bash- -c- |chmod 400 /data/mongodb.keychown 999:999 /data/mongodb.keyexec docker-entrypoint.sh $$@# 创建一个桥接网络,把各个 mongodb 实例连接在一起,该网络适用于单机
# 如果在不同的宿主机上,使用 docker swarm 需要创建 overlay 网络
networks:mongoNetwork:driver: bridge

最后我们启动 docker-compose ,并使用初始化的 root 角色的用户,登录进行配置集群 

# 在 docker-compose.yml 文件所在的目录下执行命令
docker-compose up -d
# 查看 3 个 mongodb 容器是否已经启动成功
docker ps
# 随便进入其中一个容器,比如进入 mongo1
docker exec -it mongo1 bash
# 使用初始化的 root 角色的用户 jobs 登录 mongodb 中
mongo -u jobs -p 123456
# 执行以下命令配置将 3 个节点初始化为一个副本集群
rs.initiate({_id: "mongos",members: [{ _id : 0, host : "192.168.136.129:27017" },{ _id : 1, host : "192.168.136.129:27018" },{ _id : 2, host : "192.168.136.129:27019" }]
});

其中 members 中每个节点的 json 主要的配置内容如下:

  • host:节点的 ip 和端口,例如上面的 192.168.136.129:27018
  • arbiterOnly:是否是仲裁节点,默认是 false
  • hidden:是否是隐藏节点
  • priority:优先级 0 - 1000,优先级越大,获取的投票数可能越多,从节点默认值为 1 ,仲裁节点默认值为 0
  • OK,通过以上步骤,mongodb 的副本集群就搭建好了。

 

 

 二、Navicat 连接验证

创建 4 个连接,分别连接 mongodb 集群,以及 3 个独立的 mongodb 节点用于测试验证,如下图:

当然新部署的集群下目前没有任何数据库。有关集群连接的创建如下图所示:

 

连接集群内其中一个单节点的连接创建如下图:

 

三、使用程序连接验证 

这里仍然采用上一篇博客的 demo 连接测试,只需要把 application.yml 连接字符串修改一下即可 

spring:data:mongodb:# 连接字符串格式# mongodb://用户名:密码@Ip地址:端口/数据库名# 如果使用的是 root 角色的用户登录,则必须在后面加上 authSource=admin 参数# 之前在 admin 库中创建了一个 root 角色的账号 jobs# 在实际项目中,强烈建议,针对每个数据库创建一个 readwrite 角色的用户#uri: mongodb://jobs:123456@192.168.136.128:27017/mytest?authSource=adminuri: mongodb://jobs:123456@192.168.136.129:27017,192.168.136.129:27018,192.168.136.129:27019/mytest?authSource=admin&replicaSet=mongos&slaveOk=true# 允许在实体类上,通过 @Indexed 创建单字段索引,通过 @CompoundIndex 创建多字段联合索引# 注意:这里只是演示注解的使用,实际项目中一般不推荐使用注解创建索引,# 最好通过 mongodb 的命令操作 mongodb 管理索引auto-index-creation: true

 将 3 个节点的 ip 和 端口,使用英文逗号分隔即可,其中主要配置参数如下:

  • authSource=admin 由于我们创建的是 root 角色的账号,因此必须在 admin 库去验证用户名和密码登录
  • replicaSet 指定要连接的 mongodb 集群的名称,也就是部署时设置的集群名称,这个很重要
  • slaveOk 默认是 false,表示读写都从主节点操作,如果设置为 true 表示读写分离,主节点写,从节点读。

我们运行一下 demo 代码中的添加员工的测试代码,然后就可以在集群连接下和各个节点的连接下看到新创建的 mytest 数据库,以及其下面的 tb_employee 表和数据内容,并且都是一致的。

 

在集群连接下,或者具体的单节点连接下,运行 rs.status() 命令,点击 members 字段,可以查看节点的角色和状态:

 

可以发现,当前 192.168.136.129:27019 这个节点是主节点,对应 navicat 中的 mongodb 节点3

然后通过 docker ps 查看容器,停止该主节点的容器,再运行 rs.status() 可以发现主节点变成了 192.168.136.129:27017

 

执行 demo 代码中的修改测试代码,然后再启动刚才停掉的容器,最后发现重启后的节点变成了从节点 

 

另外恢复的节点,数据也很快同步为 demo 测试代码修改后的结果,如下图所示:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/44632.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HCIP课堂笔记

第一章 1、数据转换---目标:抽象语言---二进制---电信号 2、应用程序---接收参数和指令(编码:接收传递给计算机指令参数最终转换为二进制) 3、二进制---电信号 4、对于整个互联网而言指定了统一的标准——OSI/RM参考模型 &…

GitLab和Git

GitLab保姆级教程 文章目录 GitLab保姆级教程一、GitLab安装二、添加组和用户三、新增项目四、Git上传项目说明五、命令行指引 根据以下说明从计算机中上传现有文件:六、创建与合并分支七、GitLab回滚到特定版本八、数据备份与恢复九、docker中创建gitlab GIT 常用命…

“金山-讯飞”杯2024年武汉理工大学程序设计竞赛 A. Mobiusp败走***(思维题-点双连通分量、连通性)

题目 思路来源 官方题解 题解 手玩发现,能换的话,当且仅当.和1在一个环里,而这就是点双连通分量 所以最优策略是先把.换到(x,y)的位置,然后判断.和1在不在一个环里 也就是: 1. 判断删掉1时,.和(x,y)联…

vue 搭建 pinia

文章目录 环境设置存储读取数据【 storeToRefs】借助storeToRefs将store中的数据转为ref对象,方便在模板中使用【getters】当state中的数据,需要经过处理后再使用时,可以使用getters配置【$subscribe】通过 store 的 $subscribe() 方法侦听 s…

SAP与易链SRM系统集成案例

一、项目环境 重庆润通控股(集团)有限公司成立于2007年,是一家集合汽柴油动力及终端、摩托车、储能电源、汽车零部件、金融服务等产业的多元化集团公司。现拥有员工超4000人,业务遍布全球80多个国家及地区,2021年营…

文件加密软件谁好用丨2024文件加密软件TOP6推荐

在数字化时代,数据安全已成为企业和个人不可忽视的重要议题。随着数据泄露事件频发,文件加密软件成为了保护敏感信息的首选工具。 本文将为您推荐2024年度最值得信赖的六大文件加密软件,帮助您选择最适合自己需求的加密工具。 1. 域智盾 软…

手机容器化 安装docker

旧手机-基于Termux容器化 1、安装app 在手机上安装Termux或ZeroTermux(Termux扩展) 1.1 切换源 注:可以将termux进行换源,最好采用国内源,例如:清华源等 更新包列表和升级包(可选&#xff0…

数智驱动丨zAIoT 连续落地军工、科研院所和机械制造场景,推动数智化转型升级...

引言 在这个万物互联的时代,科技的进步正以不可阻挡之势,深刻地影响并重塑我们的生产和生活方式。数智化转型升级在各个领域展现出强大的动力,已经成为推动社会向前发展的关键力量。 最近,云和恩墨自主研发的数据智能分析处理平台…

FUSE(用户空间文件系统)命令参数

GPT-4 (OpenAI) FUSE (Filesystem in Userspace)是一个允许创建用户空间文件系统的接口。它提供了一个API,让开发者在未修改内核代码的情况下,通过自己的程序实现文件系统。FUSE 文件系统通常通过 mount 命令来挂载,而且这个命令可以接受各…

时序分解 | Matlab基于ESMD极点对称模态分解

时序分解 | Matlab基于ESMD极点对称模态分解 目录 时序分解 | Matlab基于ESMD极点对称模态分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 ESMD(Extreme-point Symmetric Mode Decomposition)是一种信号分解方法,用于提取信号中的模…

【C语言之高级编程】如何将指定变量或函数编译至固定的内存区域中?

如何将指定变量或函数编译至固定的内存区域? 1. 内存类型1.1 bss段(Block Started by Symbol)1.2 data段(data segment)1.3 text段(code segment/text segment)1.4 dec1.5 堆(heap&a…

华为模拟器ensp中USG6000V防火墙web界面使用

防火墙需要配置 新建拓扑选择USG6000V型号 在防火墙中导包 忘记截图了 启动设备 输入用户名密码 默认用户名:admin 默认密码:Admin123 修改密码 然后他会提示你是否要修改密码,想改就改不想改就不改 进入命令行界面 进入系统视图开启web…

7个外贸网站模板

Nebula独立站wordpress主题 Nebula奈卜尤拉wordpress主题模板,适合搭建外贸独立站使用的wordpress主题。 https://www.jianzhanpress.com/?p7084 Starling师大林WordPress独立站模板 蓝色橙色风格的WordPress独立站模板,适合做对外贸易的外贸公司搭建…

【C++】类和对象--类,实例化,this指针

文章目录 前言一、类1.1 类的定义1.2 类的书写和使用1.3 访问限定符1.4 类域 二、实例化2.1 实例化概念2.2 对象大小 三.this指针总结 前言 前面的几篇文章我们介绍了命名空间,inline,nullptr等C 中常见的的基础概念。今天的文章我们来介绍一些C中类与对…

数据结构 —— BellmanFord算法

数据结构 —— BellmanFord算法 BellmanFord算法检测负权值环BellmanFord和Dijkstra思想上的区别Dijkstra算法的思想Bellman-Ford算法的思想思想上的对比 我们今天来看一个算法BellmanFord算法,我们之前的Dijkstra算法只能用来解决正权图的单源最短路径问题。 Bell…

C语言入门基础题:奇偶 ASCII 值判断(C语言版)和ASCII码表,什么是ASCII码,它的特点和应用?

1.题目描述: 任意输入一个字符,判断其 ASCII 是否是奇数,若是,输出 YES ,否则,输出 NO例如,字符 A 的 ASCI 值是 65 ,则输出 YES ,若输入字符 B(ASCII 值是 66)&#xff…

数据库的学习(5)

题目: 1、新增员工表emp和部门表dept create table dept (deptl int,dept name varchar(11)) charsetutf8; create table emp (sid int,name varchar(11),age int,worktime start date,incoming int,dept2 int) charsetutf8; insert into dept values (101,财务), (…

Matlab中如何添加OptiluX?

1、打开Matlab,依次点击“新建”,“工程”,“从SVN”。 2、存储库路径输入: p/optilux/code - Revision 80: /trunk 同时在“源代码控制集成”菜单中选择“SVN (1.9)” 3、沙盒选择一个自己建的文件夹即可。 来源:Opt…

特征值究竟体现了矩阵的什么特征?

特征值究竟体现了矩阵的什么特征? 简单来说就是x经过矩阵A映射后和自己平行 希尔伯特第一次提出eigenvalue,这里的eigen就是自己的。所以eigenvalue也称作本征值 特征值和特征向量刻画了矩阵变换空间的特征 对平面上的任意向量可以如法炮制,把他在特征…

集创北方ICN6202 低功耗MIPIDSI转2 PORT LVDS 支持1080P分辨率,成熟批量产品

ICN6202描述: ICN6202是一个接收MIPIDSI输入和发送LVDS输出的桥接芯片。MIPIDSI最多支持4个车道,每个车道的最大运行频率为1Gbps;总最大输入带宽为4Gbps;并且还支持MIPI定义的ULPS(超低功耗状态)。ICN6202…