【mongodb】mongodb副本集的搭建和使用
本站以分享各种运维经验和运维所需要的技能为主
《python零基础入门》:python零基础入门学习
《python运维脚本》: python运维脚本实践
《shell》:shell学习
《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战
《k8》暂未更新
《docker学习》暂未更新
《ceph学习》ceph日常问题解决分享
《日志收集》ELK+各种中间件
《运维日常》运维日常
《linux》运维面试100问
《DBA》db的介绍使用(mysql、redis、mongodb...)
一、副本集的搭建
0.介绍副本集
#官网的参考地址 https://docs.mongodb.com/manual/replication/ # Mongodb副本集介绍: Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点。 Mongodb Driver(客户端)的所有数据都写入Primary,Secondary从Primary同步写入的数据,以保持复制集内所有成员存储相同的数据集,实现数据的高可用。 # 副本集作用: 数据冗余,用做故障恢复使用,当发生硬件故障或者其它原因造成的宕机时,可以使用副本进行恢复。 读写分离,读的请求分流到副本上,减轻主节点的读压力。 # 副本集角色介绍: 主节点(Primary) 接收所有的写请求,然后把修改同步到所有Secondary。一个Replica Set只能有一个Primary节点,当Primary挂掉后,其他Secondary或者Arbiter节点会重新选举出来一个主节点。 默认读请求也是发到Primary节点处理的,可以通过修改客户端连接配置以支持读取Secondary节点。 副本节点(Secondary) 与主节点保持同样的数据集。当主节点挂掉的时候,参与选主。 仲裁者(Arbiter) 不保有数据,不参与选主,只进行选主投票。使用Arbiter可以减轻数据存储的硬件需求,Arbiter几乎没什么大的硬件资源需求,但重要的一点是,在生产环境下它和其他数据节点不要部署在同一台机器上。 # 注意: 在PSS典型架构中(Replica Set)节点数必须为奇数,目的是选主投票的时候要出现大多数才能进行选主决策。 在PSA架构中,需要偶数个数据节点,加一个Arbiter构成的Replica Set
-
PSS 典型副本集架构(读写操作都由主处理,从只负责同步)

-
PSA(Primary + Secondary + Arbiter模式,使用Arbiter搭建Replica Set)

1.创建多实例目录
[root@redis03 ~]# mkdir /server/mongodb/2801{7,8,9}/{conf,logs,pid,data} -p
2.编辑多实例配置文件
[root@redis03 ~]# vim /server/mongodb/28017/conf/mongo.conf systemLog:destination: filelogAppend: truepath: /server/mongodb/28017/logs/mongodb.log#path: /server/mongodb/28018/logs/mongodb.log#path: /server/mongodb/28019/logs/mongodb.log storage:journal:enabled: truedbPath: /server/mongodb/28017/data#dbPath: /server/mongodb/28018/data#dbPath: /server/mongodb/28019/datadirectoryPerDB: truewiredTiger:engineConfig:cacheSizeGB: 1directoryForIndexes: truecollectionConfig:blockCompressor: zlibindexConfig:prefixCompression: true processManagement:fork: truepidFilePath: /server/mongodb/28017/pid/mongod.pid#pidFilePath: /server/mongodb/28018/pid/mongod.pid#pidFilePath: /server/mongodb/28019/pid/mongod.pid net:port: 28017#port: 28018#port: 28019bindIp: 127.0.0.1,10.0.0.93replication:#类似于binlog,指定大小oplogSizeMB: 1024#副本记得名称,集群名称replSetName: dba
3.启动多实例
[root@redis03 ~]# chown -R mongo.mongo /server/mongodb/ [root@redis03 ~]# su - mongo [mongo@redis03 ~]$ mongod -f /server/mongodb/28017/conf/mongo.conf [mongo@redis03 ~]$ mongod -f /server/mongodb/28018/conf/mongo.conf [mongo@redis03 ~]$ mongod -f /server/mongodb/28019/conf/mongo.conf #验证 [mongo@redis03 ~]$ netstat -lntp tcp 0 0 10.0.0.93:28017 0.0.0.0:* LISTEN 32893/mongod tcp 0 0 127.0.0.1:28017 0.0.0.0:* LISTEN 32893/mongod tcp 0 0 10.0.0.93:28018 0.0.0.0:* LISTEN 32938/mongod tcp 0 0 127.0.0.1:28018 0.0.0.0:* LISTEN 32938/mongod tcp 0 0 10.0.0.93:28019 0.0.0.0:* LISTEN 32981/mongod tcp 0 0 127.0.0.1:28019 0.0.0.0:* LISTEN 32981/mongod
4.登录多实例
[mongo@redis03 ~]$ mongo 10.0.0.93:28017 [mongo@redis03 ~]$ mongo 10.0.0.93:28018 [mongo@redis03 ~]$ mongo 10.0.0.93:28019
5.初始化副本集
#配置副本集
config = {_id : "dba", members : [{_id:0, host:"10.0.0.93:28017"},{_id:1, host:"10.0.0.93:28018"},{_id:2, host:"10.0.0.93:28019"},]
}
复制集通过 replSetInitiate 命令或 rs.initiate() 命令进行初始化。
初始化后各个成员间开始发送心跳消息,并发起 Primary 选举操作,获得大多数成员投票支持的节点,会成为 Primary,其余节点成为 Secondary。
#读取副本集
rs.initiate(config)
6.查看副本集状态
dba:PRIMARY> rs.status()#健康状态 1表示正常 0表示故障"health" : 1,#表示状态 1是主库 2是从库 3表示恢复数据中 7表示投票者 8表示down机"state" : 1,#标注是主库还是从库"stateStr" : "PRIMARY",#集群启动时间"uptime" : 579,#另一种格式的时间"optime" : {"ts" : Timestamp(1590593779, 1),"t" : NumberLong(1)},#上一次心跳传过来数据的时间"optimeDate" : ISODate("2020-05-27T15:36:19Z"),#检测上一次心跳时间"lastHeartbeat" : ISODate("2020-05-27T15:36:25.815Z"),#查看集群与主节点
dba:PRIMARY> rs.isMaster()
#oplog信息
dba:PRIMARY> rs.printReplicationInfo()
configured oplog size: 1024MB
log length start to end: 1543secs (0.43hrs)
oplog first event time: Wed May 27 2020 23:26:46 GMT+0800 (CST)
oplog last event time: Wed May 27 2020 23:52:29 GMT+0800 (CST)
now: Wed May 27 2020 23:52:38 GMT+0800 (CST)
#查看延时从库信息
dba:PRIMARY> rs.printSlaveReplicationInfo()
source: 10.0.0.93:28018syncedTo: Wed May 27 2020 23:54:19 GMT+0800 (CST)0 secs (0 hrs) behind the primary
source: 10.0.0.93:28019syncedTo: Wed May 27 2020 23:54:19 GMT+0800 (CST)0 secs (0 hrs) behind the primary #打印副本集配置文件
dba:PRIMARY> rs.config()
7.主库创建数据,从库查看数据
#主库插入数据
db.table.insertMany([{"name":"gcc","age":10},{"name":"zzy","age":9},{"name":"hxh","age":11}])
#主库查看数据
dba:PRIMARY> show tables
table
dba:PRIMARY> db.table.find()
#从库查看数据
dba:SECONDARY> show databases
2020-05-27T23:43:40.020+0800 E QUERY [thread1] Error: listDatabases failed:{"operationTime" : Timestamp(1590594219, 1),"ok" : 0,"errmsg" : "not master and slaveOk=false","code" : 13435,"codeName" : "NotMasterNoSlaveOk","$clusterTime" : {"clusterTime" : Timestamp(1590594219, 1),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}
}
#连查看库都会被拒绝,因为从库不提供读写
#执行命令(从库都要执行)
dba:SECONDARY> rs.slaveOk()
dba:SECONDARY> show databases
admin 0.000GB
cluster 0.000GB
config 0.000GB
local 0.000GB
#每次重新连接都要执行以上命令才能读取
#可以配置永久生效
[root@redis03 ~]# vim ~/.mongorc.js
rs.slaveOk()
二、副本集实现高可用
1.故障切换测试
#主库使用 localhost 连接,执行关闭数据库的操作(使用ip连接是不能执行的) [root@db01 ~]# mongod -f /server/mongodb/28018/conf/mongo.conf --shutdown#查看其他从库中会有一台从库,变成主库#故障转移实现了,但是我的程序连接mongodb的配置还需要修改怎么办??
2.程序怎么实现连接切换的
1.如果使用的是单节点,那么程序里面直接配置写死mongodb的ip和端口即可2.如果是副本集集群的形式,在程序里面写的就是一个列表,列表里面写mongo_reip=[10.0.0.91:28017,10.0.0.92:28018,10.0.0.93:29019]程序会去使用命令询问谁是主节点,得到结果后在写入数据
3.恢复主库
#重新启动主库,他会自动判断谁是主库,自动成为新的从库#注意:三台节点,只能坏一台,坏两台就有问题了
4.指定节点提升优先级
#原来的主库配置高,性能好,想恢复之后还让他是主库怎么办#查看优先级 dba:PRIMARY> rs.conf()#权重值"priority" : 1,#临时修改配置文件 dba:PRIMARY> config=rs.conf() #修改配置文件中 id 为0 的priority值为10 dba:PRIMARY> config.members[0].priority=10 #配置文件生效 dba:PRIMARY> rs.reconfig(config)#新版本调整完直接切换主库,旧版本需要主动降级 dba:PRIMARY> rs.stepDown()#恢复权重 dba:PRIMARY> config=rs.conf() dba:PRIMARY> config.members[0].priority=1 dba:PRIMARY> rs.reconfig(config)
三、扩容与删减节点
1.配置一台新的节点
#创建目录
[root@redis03 ~]# mkdir /server/mongodb/28016/{conf,logs,pid,data} -p#配置新节点
[root@redis03 ~]# cp /server/mongodb/28017/conf/mongo.conf /server/mongodb/28016/conf/
[root@redis03 ~]# sed -i 's#28017#28016#g' /server/mongodb/28016/conf/mongo.conf #启动新节点
[root@redis03 ~]# chown -R mongo.mongo /server/mongodb/
[root@redis03 ~]# su - mongo
[mongo@redis03 ~]$ mongod -f /server/mongodb/28016/conf/mongo.conf
2.将新节点加入集群
#主库操作
dba:PRIMARY> rs.add("10.0.0.93:28016")
{"ok" : 1,"operationTime" : Timestamp(1590597530, 1),"$clusterTime" : {"clusterTime" : Timestamp(1590597530, 1),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}
}#查看集群状态
dba:PRIMARY> rs.status()#注意:四个节点也不能坏两台机器
3.删除节点
#主库操作
dba:PRIMARY> rs.remove("10.0.0.93:28016")
{"ok" : 1,"operationTime" : Timestamp(1590597842, 1),"$clusterTime" : {"clusterTime" : Timestamp(1590597842, 1),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}
}#查看集群状态
dba:PRIMARY> rs.status()
4.添加仲裁节点
# 仲裁节点说明:
不存储数据,只进行选主。#创建目录
[root@redis03 ~]# mkdir /server/mongodb/28015/{conf,logs,pid,data} -p#配置新节点
[root@redis03 ~]# cp /server/mongodb/28017/conf/mongo.conf /server/mongodb/28015/conf/
[root@redis03 ~]# sed -i 's#28017#28015#g' /server/mongodb/28015/conf/mongo.conf #启动新节点
[root@redis03 ~]# chown -R mongo.mongo /server/mongodb/
[root@redis03 ~]# su - mongo
[mongo@redis03 ~]$ mongod -f /server/mongodb/28015/conf/mongo.conf #主库操作加入仲裁节点
dba:PRIMARY> rs.addArb(("10.0.0.93:28015")#查看该库是否有数据#注意,五个节点时,可以坏两个节点相关文章:
【mongodb】mongodb副本集的搭建和使用
本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...
Java后端面试复习7.24
lock加锁解锁尝试获取锁方法lock底层基于什么实现lock和lock的底层实现分别面向什么用户lock和synchronized异同如何选择合适的锁ReentrantLock如何实现冲入内部类三个公平和非公平获取锁怎么实现的RL默认公平还是非公平,构造参数ReentrantRedaWriteLock的特性什么是…...
前端 HTML 概述
目录 1. HTML概述 1.1 超文本标记语言 1.2 标签 2. HTML 解析与编辑 2.1 解析与访问 2.2 编辑 html文件 1. HTML概述 HTML( Hyper Text Markup Language:超文本标记语言 ):主要用于网页主体结构的搭建,在网页上…...
探索Thymeleaf:用动态Web模板引擎打造吸引人的用户界面(SpringBoot的html详解)
什么是Thymeleaf? Thymeleaf是一个用于Web和独立环境的现代服务器端Java模板引擎,用于处理XML/XHTML/HTML5内容。它特别适合基于Spring框架的Web应用程序,因为它提供了与Spring MVC的出色集成。Thymeleaf以其自然的模板语法和强大的数据绑定…...
视频教程 - 自研Vue3 Tree组件高级功能:虚拟滚动新增节点实现自动滚动
感谢小伙伴们对本套自研vue3 tree组件教程的关注,在前一篇媲美Element Plus JuanTree终极实战:虚拟滚动的功能演示中发现了小bug,特地整理了相关录屏来说明怎么一步步解决bug的,来回馈小伙伴们的支持。 Tree组件高级功能ÿ…...
职业生涯阶段总结3:转眼毕业三年
不知不觉,科班毕业三年多了,也换了三个单位了; 个人软件开发的理论和技术能力确实比以前刚出来的时候,强了不少; 在行情越发下滑的形势,似乎只有进大厂才能拿到不错的收入,但是大厂的压力也是比…...
项目经理面试总结
先上结论:每个公司问的问题侧重点都不太一样,五花八门,评判标准也不一样,目前我能感觉到的就是自己需要很了解项目,也就是工作过程中经常做出总结,需要你经常去思考,包括对内和对外的思考。 自我…...
(免费领源码)java#springboot#mysql大学校园旧物捐赠网站 25109-计算机毕业设计项目选题推荐
摘 要 在网络信息的时代,众多的软件被开发出来,给用户带来了很大的选择余地,而且人们越来越追求更个性的需求。在这种时代背景下,企业只能以用户为导向,按品种分类规划,以产品的持续创新作为企业最重要的竞…...
Java 设计模式之单例模式
Java 设计模式之单例模式 单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供了一种访问该实例的全局方法。这种模式有助于确保系统中的某些组件只有一个实例,并提供了一种方便的方法来访问该实例。 更多设计模式请参考&#x…...
Linux系统驱动(二)字符设备驱动
文章目录 一、概念(一)相关概念(二)字符设备框架结构(三)用户空间和内核空间数据传输1. 函数的参数对应关系 (四)字符设备相关的API1. 字符设备驱动(1)注册字…...
Day29 | 动态规划 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
语言 Java 509. 斐波那契数 斐波那契数 题目 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n -…...
【开源移植】MultiButton_小型按键驱动模块移植
MultiButton 简介 MultiButton 是一个小巧简单易用的事件驱动型按键驱动模块,可无限量扩展按键,按键事件的回调异步处理方式可以简化你的程序结构,去除冗余的按键处理硬编码,让你的按键业务逻辑更清晰。 使用方法 1.先申请一个…...
【Python系列】Python 字典合并
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
C# 设计模式之装饰器模式
总目录 前言 装饰器模式的主要作用就是扩展一个类的功能,或给一个类添加多个变化的情况。学习面向对象的都知道,如果想单纯的给某个类增加一些功能,可以直接继承该类生成一个子类就可以。应对一些简单的业务场景继承也就够了,但是…...
【uniapp离线打包】(基于Android studio)
文章目录 uniapp打包官方教程入口一、准备工作(工具三大件)Android Studio版本推荐 二、准备工作(Android壳和uniapp包)导入Android壳生成uniapp包将uniapp包导入android壳降低jdk版本 三、准备工作(证书)准备Android平台离线签名…...
稳稳的年化10%,多任务时序动量策略——基于pytorch的深度学习策略(附python代码)
原创文章第608篇,专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 做因子挖掘这段时间,有一个观感。 传统的因子挖掘,尤其是手工构造因子,到遗传算法因子挖掘。——本身也是一种”拟合“,或者说试图”…...
C++分析AVL树
目录 AVL树介绍 AVL树平衡因子更新分析 AVL树插入时旋转与平衡因子更新 左单旋 右单旋 左右单旋 右左单旋 AVL旋转可行性 AVL树节点删除(待补充) AVL树分析 AVL树介绍 二叉搜索树在某些极端情况下可能会退化,为了解决这个问题&…...
aurora8b10b ip的使用(framing接口下的数据回环测试)
文章目录 一、Aurora8B/10B协议二、时钟、复位与状态指示1、时钟2、复位3、状态指示 三、数据发送、接受接口(1)AXI4-Stream位排序(2)Streaming接口(3)Framing接口(帧传输接口) 四、…...
如何通过OpenCV判断图片是否包含在视频内?
要判断图片是否包含在视频内,可以使用计算机视觉技术和图像处理方法。这通常涉及特征匹配或模板匹配。以下是一个基于OpenCV的解决方案,通过特征匹配的方法来实现这一目标。 步骤概述 读取视频和图片: 使用OpenCV读取视频文件和图片文件。 …...
大数据基础:Spark重要知识汇总
文章目录 Spark重要知识汇总 一、Spark 是什么 二、Spark 四大特点 三、Spark框架模块介绍 3.1、Spark Core的RDD详解 3.1.1、什么是RDD 3.1.2、RDD是怎么理解的 四、Spark 运行模式 4.1、Spark本地模式介绍 4.2、Spark集群模式 Standalone 4.3、Spark集群模式 Stan…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
