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

一、概述

       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 startnetstat -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.hqwc.cn/news/18131.html

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

相关文章

小程序开发及生态丰富,还需要App吗?

微信小程序自2017年推出以来,其生态系统得到了迅速的发展和壮大。作为中国最大的社交平台之一,微信拥有庞大的用户基础。微信小程序作为微信生态系统的一部分,自然而然地吸引了大量用户。据对公开资料进行统计,2021年全网小程序数…

UE5《Electric Dreams》项目PCG技术解析 之 PCGCustomNodes详解(三)SG_CopyPointsWithHierarchy

继续解析《Electric Dreams》项目中的自定义节点和子图:SG_CopyPointsWithHierarchy和PostCopyPoints-OffsetIndices 文章目录 前导文章标准组合拳SG_CopyPointsWithHierarchyPostCopyPoints-OffsetIndices使用情景Execute with ContextIteration Loop Body 小结 前…

超有趣的linux命令2

超有趣的linux命令2 此次实验命令均在Ubuntu16.04版本上测试 注意有些命令需要在图形化界面才能显示效果 温馨提示:可能有人是第一次接触Ubuntu,所以下面详细写了如何配置源和网络,以及安装命令的方式 1. 首先配置软件源 以命令行方式配置…

mybatis学习记录

63、数据访问-整合mybatis-配置版_哔哩哔哩_bilibili id和mapper接口里方法名称对应,返回类型就写对应的返回类型地址 两个文件的名称要一样 注解配置就是直接在mapper里写sql语句,不用写xml文件了,这种方式使用的相对少一点。

RabbitMQ系列(19)--实现在RabbitMQ宕机的情况下对消息进行处理

前言:在生产环境中由于一些不明原因,导致RabbitMQ重启的情况下,在RabbitMQ重启期间生产者投递消息失败,生产者发送的消息会丢失,那这时候就需要去想在极端的情况下,RabbitMQ集群不可用的时候,如…

第44节:cesium 大雾效果(cesium自带)(含源码+视频)

结果示例: 完整源码: <template><div class="viewer"><vc-viewer @ready="ready" :logo="false"><!

Android 视频直播提拉流 嵌入式硬件 流媒体开发详细内容

1 Linux 系统编程网络编程基础 2 Linux 网络编程流媒体服务器&#xff0c;客户端开发实践 3 Android流媒体客户端 FFmpeg OpenGL ES 开发实践 4 Android H.264 AAC 封装mp4开发实战 5 流媒体开发实战之Rtmp推流 6 流媒体开发实战之RTSP推流 7 流媒体开发实战之UDP 8 P2P点对点项…

路径规划算法:基于晶体结构优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于晶体结构优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于晶体结构优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

Python3+requests搭建接口自动化测试框架

目录 一、接口自动化的意义&#xff08;为什么做这个框架&#xff09; 二、准备工作 三、框架流程及逻辑 四、各模块介绍 五、具体使用 一、接口自动化的意义&#xff08;为什么做这个框架&#xff09; 新版本上线时之前版本的功能需要进行回归测试&#xff0c;导致大量的…

布雷默浪丹 PT 141:189691-06-3,1607799-13-2,Bremelanotide,布美诺肽

Bremelanotide&#xff0c;布雷默浪丹 PT 141&#xff0c;布美诺肽Product structure&#xff1a; Product specifications&#xff1a; 1.CAS No&#xff1a;189691-06-3/1607799-13-2 2.Molecular formula&#xff1a;C50H68N14O10 3.Molecular weight&#xff1a;1025.063 4…

gigachad1靶机详解

gigachad_vh靶机详解 扫描到ip后对ip做一个全面扫描&#xff0c;发现有一个匿名服务器&#xff0c;是可以免密登陆的。 登陆上后发现就一个文件&#xff0c;get到我们电脑上。 file一下发现是一个zip文件&#xff0c;unzip解压一下&#xff0c;发现给了一个用户名chad&#xf…

C++多线程学习(十七、简单实现线程池)

目录 线程池 设计线程池的关键问题 代码 可能出现的疑问 queue> task; 总结&#xff1a; template auto InsertQueue(T&& t, Args&& ...args)->future;(t(args...))> 总结&#xff1a; ThreadPool(size_t size);构造函数 总结&#xff1…