小白到运维工程师自学之路 第四十六集 (mongodb复制集)

news2024/11/24 1:46:41

一、概述

       1、 MongoDB复制集(MongoDB Replica Set)是MongoDB提供的一种高可用性和数据冗余的解决方案。它由多个MongoDB实例组成,其中一个作为主节点(Primary),其他节点则扮演从节点(Secondary)的角色。主节点处理所有的写操作和客户端请求,而从节点负责复制主节点的数据并提供读操作的能力。

       2、 复制集的主要目标是提供数据的冗余和故障恢复的能力。当主节点发生故障或不可用时,复制集会自动选举出一个新的主节点来接管主节点的职责,保证系统的可用性。一旦原先的主节点恢复,它会以从节点的身份重新加入复制集,同步最新的数据。

        3、在复制集中,数据同步是通过Oplog(操作日志)来实现的。主节点会记录所有的写操作,并将其顺序保存在Oplog中。从节点通过读取Oplog中的操作来进行数据的复制和同步。

       4、 复制集还提供了其他一些功能,如自动故障检测和恢复、自动故障转移、读写分离等。通过配置合适的副本集成员和选举优先级,可以实现不同的数据治理策略和故障容错能力。

        5、要配置一个MongoDB复制集,需要在MongoDB配置文件中指定每个节点的相关配置,包括主节点和从节点的IP地址、端口号、复制集名称等。在启动MongoDB实例时,指定配置文件即可。一旦复制集的节点都启动成功,系统会自动进行选举并形成一个复制集。

        6、MongoDB复制集提供了高可用性、数据冗余和故障恢复的能力,是在生产环境中常用的部署架构之一。通过使用复制集,可以保证MongoDB数据库在单节点故障或部分故障的情况下仍然可用,并提供更好的读写性能和数据冗余。

二、工作原理

        1. 节点角色:一个MongoDB复制集由多个节点组成,其中一个节点被选举为主节点(Primary),其他节点则扮演从节点(Secondary)的角色。主节点负责处理所有的写操作和客户端请求,从节点负责复制主节点的数据并提供读操作。

        2. 选举过程:复制集的选举过程在初始启动或主节点故障时发生。当一个节点检测到主节点不可用时,它会发起一次选举。选举过程包括以下步骤:
   - 节点发出选举请求,向其他节点发送投票请求。
   - 其他节点接收到投票请求后,检查自己的选举条件,如节点状态、投票状态等。
   - 如果节点满足选举条件,它会将投票回复给发起选举的节点。
   - 发起选举的节点会等待一定数量的投票回复,如果它获得了足够多的投票(超过半数),则成为新的主节点。

        3. 数据复制和同步:主节点负责记录所有的写操作并将其顺序保存在Oplog(操作日志)中。从节点通过读取Oplog中的操作来进行数据的复制和同步。复制包括两个阶段:
   - 初始同步(Initial Sync):当一个从节点加入复制集时,它会从主节点复制所有的数据。主节点会将数据以数据文件(Data File)的形式发送给从节点,从节点按照顺序写入到本地磁盘中。初始同步完成后,从节点与主节点的数据将保持同步。
   - 增量同步(Incremental Sync):一旦从节点完成初始同步,它会通过读取Oplog中的写操作来实现与主节点的增量同步。主节点将新的写操作追加到Oplog中,从节点定期读取Oplog并将相应的操作应用到本地数据中,使得它与主节点的数据保持一致。

        4. 自动故障检测和恢复:复制集支持自动故障检测和恢复功能。当主节点故障或不可用时,复制集会自动进行主节点选举,从而选择一个新的主节点来接管主节点的职责。一旦原先的主节点恢复,它会以从节点的身份重新加入复制集,同步最新的数据。

三、安装部署

下载连接
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.6.tgz

创建mongodb文件夹
mkdir  /usr/local/mongodb

指定解压路径
tar xf mongodb-linux-x86_64-rhel70-4.0.6.tgz  -C /usr/local/mongodb

创建软连接
ln -s /usr/local/mongodb/bin/* /bin/

创建数据目录
mkdir -p /data/mongodb1

创建日志目录
mkdir -p /data/logs/mongodb

创建日志文件
touch /data/logs/mongodb/mongodb1.log
编写启停脚本
vim /etc/init.d/mongodb
#!/bin/bash
INSTANCE=$1
ACTION=$2
case "$ACTION" in
'start')
/usr/local/mongodb/mongodb-linux-x86_64-rhel70-4.0.6/bin/mongod -f /usr/local/mongodb/conf/"$INSTANCE".conf;;
'stop')
/usr/local/mongodb/mongodb-linux-x86_64-rhel70-4.0.6/bin/mongod -f /usr/local/mongodb/conf/"$INSTANCE".conf --shutdown;;
'restart')
/usr/local/mongodb/mongodb-linux-x86_64-rhel70-4.0.6/bin/mongod -f /usr/local/mongodb/conf/"$INSTANCE".conf --shutdown
/usr/local/mongodb/mongodb-linux-x86_64-rhel70-4.0.6/bin/mongod -f /usr/local/mongodb/conf/"$INSTANCE".conf;;
esac

 

给脚本赋予执行权限
chmod +x /etc/init.d/mongodb
编写配置文件
cd /usr/local/mongodb/
mkdir conf                                  创建配置文件目录
vim conf/mongodb1.conf                      创建配置文件
port=27017		                            监听端口
dbpath=/data/mongodb1	                    指定数据目录
logpath=/data/logs/mongodb/mongodb1.log	    指定日志文件路径
logappend=true	                            允许写入日志
fork=true			                        允许创建子进程
maxConns=5000	                            最大连接数
storageEngine=mmapv1		                存储引擎

 

启动命令 
/etc/init.d/mongodb mongodb1 start

停止命令
/etc/init.d/mongodb mongodb1 stop

四、创建复制集

vim /usr/local/mongodb/conf/mongodb1.conf 
port=27017
dbpath=/data/mongodb1
logpath=/data/logs/mongodb/mongodb1.log
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
slowms=1                 开启慢查询阈值
profile=1                开启查询分析
replSet=722207           集群名字 随意取

在复制四份配置文件只修改配置文件中的端口号,数据文件目录,日志文件路径

 

 

 

mkdir /data/mongodb{1..4} -p                     创建四个数据文件目录
mkdir /data/logs/mongodb -p                      创建日志文件目录
touch /data/logs/mongodb/mongodb{1..4}.log       创建四个日志文件
chmod 777 /data/logs/mongodb/mongodb*            赋予日志所有权限

启动四个mongodb
/etc/init.d/mongodb mongodb1 start
/etc/init.d/mongodb mongodb2 start
/etc/init.d/mongodb mongodb3 start
/etc/init.d/mongodb mongodb4 start

netstat -anputl | grep mongodb  查看端口

 五、测试

进入mongodb查看

查看节点信息 rs.status()

 配置复制集

cfg={"_id":"722207","members":[{"_id":0,"host":"127.0.0.1:27017"},{"_id":1,"host":"127.0.0.1:27018"},{"_id":2,"host":"127.0.0.1:27019"}]}

查看复制集状态 rs.status()

在这里需要注意两条

"health" : 1, //1为健康,0为宕机

"state" : 1, //1为主,2为从

 添加27020节点  rs.add("127.0.0.1:27020")

关闭主节点27017主节点 模拟故障

进入27018查看信息

可以看到27020节点变成了主节点

 

六、复制选举原理

1、复制的原理

MongoDB复制是基于操作日志oplog实现,oplog相当于mysql中的二进制日志,只记录数据发生的改变操作。

2、选举的原理

(1)节点类型:标准节点,被动节点,仲裁节点

        ①、只有标准节点可能被选举为活跃(主)节点,有选举权

        ②、被动节点有完整副本,不可能成为活跃节点,有选举权

        ③、仲裁节点不复制数据,不可能成为活跃节点,只有选举权

(2)标准节点与被动节点的区别

        priority值高者是标准节点,低者则为被动节点

(3)选举规则

票数高者获胜,priority是优先权0-1000值,相当于额外增加0-1000的票数。

选举结果:票数高者获胜;若票数相同,数据新者获胜。

3、修改选举优先权(设置两个主节点、一个从节点、一个仲裁节点)

重新停启mongodb

mongo进入mongodb

设置27017、27018为主节点、27019为从节点、27020为仲裁节点

cfg={"_id":"722207","protocolVersion":1,"members":[{"_id":0,"host":"127.0.0.1:27017","priority":100},        {"_id":1,"host":"127.0.0.1:27018","priority":100}, {"_id":2,"host":"127.0.0.1:27019","priority":0}, {"_id":3,"host":"127.0.0.1:27020","arbiterOnly":true}]}

创建完成后查看集群状态如果出现了报错下面的错误需要删除27020这个节点

再重新添加

 rs.remove('127.0.0.1:27020')删除这个节点

rs.add('127.0.0.1:27020')再次添加这个节点

再次进行节点设置

 再次查看集群状态

 查看主节点是谁

 现在再来把27017给停掉

可以看到27018变成了主服务器

 再次把27018停掉查看情况

可以看到27017成为了主服务器

角色设置生效后只有主节点才会成为主服务器、从服务器和仲裁服务不会参与主节点的竞选

 

以上就是mongodb复制集的配置

如有错误欢迎各位大佬批评指正,我们共同进步

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

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

相关文章

使用finalshell连接Linux服务器出现的问题

第一次使用finalshell远程连接Linux服务器的过程、遇到的问题及解决方案 首先建立连接 ![在这里插入图片描述](https://img-blog.csdnimg.cn/d8836dcd8a224bf093ebdac031f763d5.png 然后问题来了 出现以下问题: java.net.ConnectException: Connection refused:…

地下污水厂配电能效管理平台设计

安科瑞电气股份有限公司 上海嘉定 201800 摘要:结合某地下污水厂项目,从结构、系统组成、系统功能、控制要求、场景模 式等方面介绍了地下污水厂智能照明控制系统,探索了一套适用于地下污水厂的智能照明控制策略,以确保地下污水…

这里会告诉你音频转换器推荐有什么

音频转换格式技术是一项重要的技术,可以将音频文件从一种格式转换为另一种格式,以适应不同设备、平台或应用程序的需求。今天的文章会向你科普音频转换格式技术和音频转换器推荐有什么。 音频转换格式技术应用于很多场景: 1、音乐制作与后期…

银河麒麟服务器v10 sp1 部署.Net6.0项目后无法访问静态文件

上一篇:银河麒麟服务器v10 sp1 部署.Net6.0 http https_csdn_aspnet的博客-CSDN博客 由于本人项目直接从.NetCore3.1升级到.Net6.0的,请参考文章:NetCore3.1项目升级到Net6.0_vs2022 没有startup_csdn_aspnet的博客-CSDN博客 虽然部署项目后…

mysql根据逗号将一行数据拆分成多行数据,顺便展示其他列

1、原始数据演示 2.处理结果 SQL展示 SELECTa.id,a. NAME,substring_index(substring_index(a.shareholder,,,b.help_topic_id 1),, ,- 1) AS shareholder FROMcompany a JOIN mysql.help_topic b ON b.help_topic_id < (length(a.shareholder) - length(REPLACE (a.share…

uni-app 从零开始第二章:底部 tabBar

pages.json 页面路由 | uni-app官网 一、新建 home页面 找到pages目录&#xff0c;新增一个home的页面&#xff0c;勾选上同时新建文件夹 新建完成后&#xff0c;pages.json 中 会自动添加上刚刚新建的文件信息 二、新增tabBar数据 在 pages.json中新增以下代码 "tabB…

微信保存到本地的视频文件怎么转存到手机笔记?

微信是人们之间交流的重要工具。我们经常会在微信上收到一些珍贵的视频文件&#xff0c;比如亲友们的生活片段、孩子们的成长瞬间等等。但是&#xff0c;随着时间的推移&#xff0c;这些视频文件会越来越多&#xff0c;也会有人担心它们的保存问题。 现在很多人都在使用手机笔…

磁盘0和磁盘1

磁盘0和磁盘1 查看磁盘情况磁盘0和磁盘1的区别 查看磁盘情况 此电脑&#xff0c;右键&#xff0c;管理&#xff0c;然后就可以看到计算机管理这个页面 计算机管理页面&#xff0c;存储&#xff0c;磁盘管理&#xff0c;就可以看到磁盘情况了 磁盘0和磁盘1的区别 磁盘0和磁…

【前端进阶】什么是AST?什么是ESLint?如何快速发布自定义ESLint插件?

文章目录 什么是ASTAST在线可视化网站代码如何转化ASTacorn基本使用 什么是ESLintESLint解析原理如何制作ESLint插件安装yeoman创建插件创建规则目录结构实现警告console.error()方法 npm发布如何注册如何登录发布应用问题 nrm下载查看可用镜像源切换镜像源 结束参考文章 什么是…

ChatGPT会让软件测试人员失业吗?

首先&#xff0c;正视ChatGPT &#xff0c;它只是一款提升测试效率的工具&#xff0c;并不会让测试失业 ChatGPT 本质上就是一个搜索引擎的二次封装&#xff0c;它更能理解你的输入意图&#xff0c;它更精确的帮你拼接返回结果。但它就是一个辅助工具&#xff0c;用好了可以帮…

传统主从配置

传统主从配置 MySQL通过二进制文件写入和恢复数据 主服务器一定要打开二进制日志 必须两台服务器&#xff08;或者是多个实例&#xff09; 从服务器需要一次数据初始化 如果主从服务器都是新搭建的话&#xff0c;可以不做初始化 如果主服务器已经运行了很长时间了&#xff0c;可…

从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史

Bert最近很火,应该是最近最火爆的AI进展,网上的评价很高,那么Bert值得这么高的评价吗?我个人判断是值得。那为什么会有这么高的评价呢?是因为它有重大的理论或者模型创新吗?其实并没有,从模型创新角度看一般,创新不算大。但是架不住效果太好了,基本刷新了很多NLP的任务…

web服务端接收多用户并发上传同一文件,保证文件副本只存在一份(附go语言实现)

背景 对于一个文件服务器来说&#xff0c;对于同一文件&#xff0c;应该只保存一份在服务器上。基于这个原则&#xff0c;引发出本篇内容。 本篇仅阐述文件服务器在同一时间接收同一文件的并发问题&#xff0c;这种对于小体量的服务来说并不常见&#xff0c;但是最好还是要留…

存储协议——FC协议讲解

目录 FC基础概念 FC协议结构 FC通信 FC交换网络工作流程&#xff1a;&#xff08;以封装SCSI协议为例&#xff09; FC拓扑结构 FC协议的端口类型 FC适配器&#xff08;FC HBA卡&#xff09; FC基础概念 FC最开始为一种传输协议&#xff0c;由于其性能较高&#xff0c;逐…

我的小流量“转正”心得 --- 下载下方深度语义重排的实践

目录 一、背景 二、通过数据分析找到的问题 三、迭代流程 迭代一&#xff1a; 迭代二&#xff1a; 迭代三&#xff1a; 迭代成功的原因&#xff1a; 知识扩展 四、hnswlib调优过程 五、附录 5.1 hnsw 超参选择 一、背景 在分发中下载带来的收入占比排列仅次于搜索。…

重磅|2024年浙大MPA提前批面试政策公布:申请三步走

说曹操曹操到&#xff01;昨天还在说浙大MPA提面吃迟迟未公布的事情&#xff0c;晚些时候就来了&#xff01;等待许久的MPA考生们可以开始着手筹划自己的提面备考了&#xff01;提前批面试真题周期较长&#xff0c;但是需要做准备的内容确实也不少&#xff0c;本期专注浙大的杭…

如何区分bin log 、redo log 跟 undo log?

概要 MySQL 日志包含了错误日志、查询日志、慢查询日志、事务日志、二进制日志等&#xff0c;如果存储引擎使用的是 InnoDB &#xff0c;二进制日志(binlog)和事务日志(包括redo log和undo log) 是肯定绕不过去的&#xff0c;本篇接下来详细为大家介绍这三种日志。 redo log 为…

Android OpenGL ES实现简单绿幕抠图

目录 正文 OES FilterBlendShader Filter最后的效果缺陷 正文 实现绿幕抠图&#xff0c;其实想法很简单。 这里简单粗暴的使用着色器替换。 OES Filter 直接实现在相机预览上的Shader ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #extension GL_OE…

Spring Boot 中的 Sleuth 是什么, 如何使用

Spring Boot 是一个非常流行的 Java Web 开发框架&#xff0c;它提供了许多方便的功能&#xff0c;其中之一就是 Sleuth。Sleuth 是一个分布式跟踪系统&#xff0c;用于跟踪应用程序中的请求和操作。在本文中&#xff0c;我们将探讨 Spring Boot 中的 Sleuth 是什么&#xff0c…

git 新建分支,切换分支,上传到远程分支

git 在使用的过程中&#xff0c;有的时候我们需要更换一个分支才存贮数据&#xff0c;作为版本的一个迭代或者是阶段性成果的一个里程碑。 如何来做操作呢&#xff1f; 在git中&#xff0c;可利用checkout命令转换分支&#xff0c;该命令的作用就是切换分支或恢复工作树文件&a…