mongoDB副本集搭建-docker

MongoDB副本集搭建-docker

注:在进行副本集搭建前,请先将服务部署docker环境并正常运行。

#通过--platform指定下载镜像的系统架构 在这我用的是mongo:4.0.28版本 arm64系统架构的mongo镜像
docker pull --platform=linux/arm64 mongo:4.0.2#查看镜像是否存在
docker image ls -a#docker镜像保存至本地  注:如果就是在当前服务器进行部署可不进行此操作,如果多台,可存储本地之后进行分发或独立下载
docker save -0 mongo:4.0.28.tar mongo:4.0.28

设计三个节点分别如下

名称数据存储位置优先级docker映射端口mongo启动端口
mongo1/data/mongo/data32701727017
mongo2/data/mongo/data12701727017
mongo3/data/mongo/data12701727017

容器启动

#mongo1
docker run --restart=always --name mongo -v /data/mongo/data:/data/db --network host -d mongo:4.0.28 mongod --replSet "rs0" --port 27017 --bind_ip 0.0.0.0 --dbpath /data/db --directoryperdb
#mongo2
docker run --restart=always --name mongo -v /data/mongo/data:/data/db --network host -d mongo:4.0.28 mongod --replSet "rs0" --port 27017 --bind_ip 0.0.0.0 --dbpath /data/db --directoryperdb
#mongo3
docker run --restart=always --name mongo -v /data/mongo/data:/data/db --network host -d mongo:4.0.28 mongod --replSet "rs0" --port 27017 --bind_ip 0.0.0.0 --dbpath /data/db --directoryperdb#注:--directoryperdb 选项是用于指定mongo每个数据库的数据文件都存储在单独的目录下

3个均启动完成,随便进入到一个容器里,如mongo,并连接到数据库

#进入容器
docker exec -it mongoDB /bin/bash#进入mongo终端
mongo

传入配置并初始化:

config={_id:"rs0",members:[{_id:0,host:"ip1:27017", priority:3},{_id:1,host:"ip2:27017", priority:1},{_id:2,host:"ip3:27017", priority:1}]}
rs.initiate(config);
或
rs.initiate({_id:"rs0",members:[{_id:0,host:'192.168.1.2:27017',priority:3},{_id:1,host:'192.168.1.3:27017',priority:1},{_id:2,host:'192.168.1.4:27017',priority:1}]
})

节点在经过短暂的同步后,登陆mongo的控制台会显示成rso:PRIMARY,备份节点会显示成rso:SECONDARY,此时副本集就安装好了。

验证

进入primary服务器,随便创建一个测试数据库和测试表数据:

rso:PRIMARY> use test
switched to db test
rso:PRIMARY> db.testCollection.insert({"key":"value"})
WriteResult({ "nInserted" : 1 })
rso:PRIMARY> db.testCollection.find()
{ "_id" : ObjectId("5c20a3d7c5d174307dc3d516"), "key" : "value" }

然后进入secondary服务器查一下数据,会出现如下结果:

rso:SECONDARY> use test
switched to db test
rso:SECONDARY> db.testCollection.find()
Error: error: {
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk"
}

这是因为secondary服务器在写多读少的应用使用Replica Sets来实现读写分离。通过在连接时指定或者在主库指定slaveOk,由secondary来分担读的压力,primary只承担写操作,此时为了检测设置为slaveOk,并重新查询一下,会出现如下结果:

rso:SECONDARY> rs.slaveOk()
rso:SECONDARY> db.testCollection.find()
{ "_id" : ObjectId("5c20a3d7c5d174307dc3d516"), "key" : "value" }

可以检测到副本集生效了。这时候主动把primary宕机或者删除,就可以看到主节点转移到mongo2/3了。

4. 开启密码验证

副本集的验证与mongo单机开启验证不同:

mongo单机版本只需要在admin库中的system.user表里加好用户后就默认开启了验证模式。

mongo副本集在admin库中的system.user表里加好用户后,需要显示开启验证模式(启动参数添加:–auth),那么副本集之间的互相反问就需要用到keyFile了。

注:keyFile几个注意点:

  • 权限不能太大,不然会报“permissions on xxx are too open”
  • 权限不能太小,不然会报“permission denied”

因此我们在创建keyFile的时候首要先把权限赋值好:

#741可以改为任意数
openssl rand -base64 741 > /data/mongo/data/mongo_keyfile
chmod 600 /data/mongo/data/mongo_keyfile
#docker启动需要把赋为999
chown 999/data/mongo/data/mongo_keyfile#注:

添加用户,需要到主节点上进行添加

docker exec -it mongo bash
mongo
use admin
db.createUser({user: "admin",pwd: "password",roles: [ { role: "root", db: "admin" } ]})

添加好用户后重启副本集,启动带上验证和keyFile(每台执行)

1、
docker stop mongo && docker rm mongo2cat /data/mongo/init.sh
#!/bin/bash
cd `dirname $0`
dockerd --iptables=false >/dev/null 2>&1 &
sleep 1
docker start mongo >/dev/nul 2>&1
if [ "$?" != "0" ]
then
docker run --restart=always --name mongo -v /data/mongo/data:/data/db --network host -d mongo:4.0.28 mongod --replSet "rs0" --port 27017 --bind_ip 0.0.0.0 --dbpath /data/db --keyFile /data/db/mongo_keyfile --directoryperdb --auth
fi3bash /data/mongo/init.sh

重启完成后进行验证,与上一步的验证一致。这样带有权限验证的mongo副本集就创建完毕了。

mongo数据备份 docker

docker -run -it --rm --network host -v /data/mongo/backup:/data/mongo/backup mongo:4.0.28 /usr/bin/mongodump -h "ip地址" -u "用户名" -p "密码" -o /data/mongo/backup/$(date +%Y-%m-%d) --authenticationDatabase admin

mongo数据导入 docker

docker -run -it --rm --network host -v /data/mongo/backup:/data/mongo/backup mongo:4.0.28 /usr/bin/mongorestore -h "ip地址" -u "用户名" -p "密码" --authenticationDatabase=admin /data/mongo/backup/$(date +%Y-%m-%d)

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

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

相关文章

SpringBoot项目部署到云服务器全流程

文章目录 一、前期准备(一)云服务器选择(二)本地环境准备(三)数据库准备(若项目需要) 二、服务器配置(一)获取服务器信息(二)重置实例…

【mongodb】社区版8:改变配置bindip和授权

更改配置 sudo systemctl restart mongod (base) root@k8s-master-pfsrv:/home/zhangbin# sudo tail -n 20 /var/log/mongodb/mongod.log 日志感觉是成功了:{"t":{"$date":"2024-11-19T19:57:47.076+08:00"

如何用通义灵码助力项目开发 | OceanBase obdiag 项目共建实践

本文来自 obdiag 项目共建的用户分享 一、背景 我的数据库探索之旅始于OceanBase。作为一位满怀好奇心的DBA,我内心始终怀揣着对数据库内部运作机制的无尽向往。开源如同一把钥匙,为我们这些求知欲旺盛的“好奇猫”解锁了通往新知的神秘大门。在众多分布…

Java、Android引用类型

Java/Android中有四种引用类型,分别是: Strong reference - 强引用 Soft Reference - 软引用 Weak Reference - 弱引用 Phantom Reference - 虚引用 不同的引用类型有着不同的特性,同时也对应着不同的使用场景。 Strong reference - 强引用…

网络安全,文明上网(2)加强网络安全意识

前言 在当今这个数据驱动的时代,对网络安全保持高度警觉已经成为每个人的基本要求。 网络安全意识:信息时代的必备防御 网络已经成为我们生活中不可或缺的一部分,信息技术的快速进步使得我们对网络的依赖性日益增强。然而,网络安全…

微前端基础知识入门篇(二)

概述 在上一篇介绍了一些微前端的基础知识,详见微前端基础知识入门篇(一)。本文主要介绍qiankun微前端框架的实战入门内容。 qiankun微前端实践 通过Vite脚手架分别创建三个程序,主应用A为:vite+vue3+ts,两个微应用分别为B:vite+vue3+ts;C:vite+React+ts。因为qiankun的…

实时数据研发 | Flink技术栈

下周要开始接触一些实时的内容了,想来是很幸运的,这是我在新人培训上提问过技术前辈的问题:“想学习实时相关技术,但是部门没有类似的需求,应该如何提升?”当时师姐说先用心去学,然后向主管证明…

DataGear 企业版 1.3.0 发布,数据可视化分析平台

DataGear 企业版 1.3.0 已发布,欢迎体验! http://datagear.tech/pro/ 企业版 1.3.0 新增看板全局导入库管理功能、统一登录功能改进、安全增强,具体更新内容如下: 新增:新增看板全局导入库管理功能,支持…

Spark SQL 之 QueryStage

ExchangeQueryStageExec ExchangeQueryStageExec 分为两种

el-table根据指定字段合并行和列+根据屏幕高度实时设置el-table的高度

文章目录 html代码script代码arraySpanMethod.js代码 html代码 <template><div class"rightBar"><cl-table ref"tableData"border :span-method"arraySpanMethod" :data"tableData" :columns"columns":max-…

探索 RocketMQ:企业级消息中间件的选择与应用

一、关于RocketMQ RocketMQ 是一个高性能、高可靠、可扩展的分布式消息中间件&#xff0c;它是由阿里巴巴开发并贡献给 Apache 软件基金会的一个开源项目。RocketMQ 主要用于处理大规模、高吞吐量、低延迟的消息传递&#xff0c;它是一个轻量级的、功能强大的消息队列系统&…

设计模式之 责任链模式

责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;旨在将多个处理对象通过链式结构连接起来&#xff0c;形成一条处理请求的链条。每个处理对象都有机会处理请求&#xff0c;或者将请求传递给链中的下一个对象。这样&#x…

Flink-Source的使用

Data Sources 是什么呢&#xff1f;就字面意思其实就可以知道&#xff1a;数据来源。 Flink 做为一款流式计算框架&#xff0c;它可用来做批处理&#xff0c;也可以用来做流处理&#xff0c;这个 Data Sources 就是数据的来源地。 flink在批/流处理中常见的source主要有两大类…

python开发之Linux

文章目录 1. 基础2. 进阶链接压缩/解压缩 文件权限用户远程操作编辑文件软件安装 1. 基础 # 查看当前目录下文件 ls# 查看当前目录 pwd# 清除界面内容 clear# 切换目录 cd# 创建目录 mkdir# 创建文件 touch 文件 vi 文件# 强制删除 rm -rf # 复制文件 cp 复制文件 复制文件路径…

OceanBase 驱动类获取数据库精确类型 “Oracle|MySQL”

当我们需要获取 DataSource 对象所连接的数据库的数据库名称时&#xff0c;正常是通过如下代码来获取&#xff1a; String databaseName dataSource.getConnection().getMetaData().getDatabaseProductName();我们知道 OceanBase 数据库企业版的租户是区分 Oracle 和 MySQL 两…

element-plus入门教程:Button

一、Button组件概述 Element Plus的Button组件是一个常用的操作按钮&#xff0c;提供了多种类型、尺寸、状态等配置选项&#xff0c;以满足不同的交互需求。 二、安装Element Plus 在Vue 3项目中&#xff0c;可以通过npm或yarn来安装Element Plus。 npm install element-pl…

深入解析 Cron 表达式高级用法:Spring 与 Linux Crontab 的全面对比与实践20241120

深入解析 Cron 表达式高级用法&#xff1a;Spring 与 Linux Crontab 的全面对比与实践 任务调度是后台服务中的重要组成部分&#xff0c;无论是定期数据备份、日志归档还是周期性报表生成&#xff0c;Cron 表达式始终是描述这些任务规则的核心工具。本文将聚焦 Spring Cron 表…

python中的map、split、join函数的作用 => ACM输入输出流

map(func,iter) lst_str ["1", "2", "3"] # 得到lst_num为[1, 2, 3] lst_num list(map(int, lst_str))如果想把一个列表里的所有元素批量地调用某一个函数&#xff0c;并映射得到一个新的列表&#xff08;原列表中元素相对位置不变&#xff0…

【数据结构】七种常用排序总结

一、七种排序及其讲解 以下为七种排序的讲解&#xff1a; 【数据结构】插入排序——直接插入排序 和 希尔排序 【数据结构】选择排序——选择排序 和 堆排序 【数据结构】交换排序——冒泡排序 和 快速排序 【数据结构】归并排序 —— 递归及非递归解决归并排序 二、排序的…

【AI日记】24.11.23 学习谷歌数据分析初级课程-第4课

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 核心工作 内容&#xff1a;学习谷歌数据分析初级课程地址&#xff1a;第四课《从脏数据到干净数据的处理》时间&#xff1a;4 小时评估&#xff1a;不错&#xff0c;完成 读书 书名&#xff1a;權力與進步时…