国家建设官方网站/北京建站

国家建设官方网站,北京建站,网站首页做后台链接,微信支付宝付款wordpressMongoDB集群介绍: MongoDB 副本集是由多个MongoDB实例组成的集群,其中包含一个主节点(Primary)和多个从节点(Secondary),用于提供数据冗余和高可用性。以下是搭建 MongoDB 副本集的详细步骤&am…
MongoDB集群介绍:

MongoDB 副本集是由多个MongoDB实例组成的集群,其中包含一个主节点(Primary)和多个从节点(Secondary),用于提供数据冗余和高可用性。以下是搭建 MongoDB 副本集的详细步骤,以在 Linux 系统(假设为 Ubuntu)上为例,可以根据实际情况进行调整。

1、MongoDB集群部署的两种方法的原理及优缺点

MongoDB 的副本集(Replica Set)和分片集(Sharded Cluster)是两种重要的集群架构,它们的原理、优缺点如下:

1.1、副本集原理

  • 原理:副本集由多个 MongoDB 实例组成,其中有一个主节点(Primary)和多个从节点(Secondary)。主节点负责处理所有的写操作,并将这些操作记录在操作日志(oplog)中。从节点通过复制主节点的 oplog 来保持与主节点的数据同步。当主节点出现故障时,副本集通过选举机制(通常基于 Bully 算法的变体)从从节点中选出一个新的主节点,以保证服务的连续性。
  • 优点
    • 高可用性:主节点故障时,从节点能快速被选举为新主节点,继续提供服务,减少停机时间。
    • 数据冗余:多个节点存储相同数据,防止因单个节点硬件故障导致数据丢失。
    • 读扩展性:可以将读请求分发到从节点,减轻主节点压力,提高整体读性能。适合读多写少的场景。
    • 数据一致性:通过 oplog 复制,能保证副本集内节点数据的最终一致性。
  • 缺点
    • 写性能瓶颈:所有写操作都集中在主节点,当写操作量较大时,主节点可能成为性能瓶颈。
    • 存储限制:所有节点都存储完整数据,对于数据量非常大的情况,存储成本较高,且扩展存储容量较困难。
    • 选举延迟:主节点故障时,选举新主节点需要一定时间,期间可能影响服务可用性。

1.2、分片集

  • 原理:分片集由多个组件构成,包括分片(Shard)、配置服务器(Config Server)和路由服务器(MongoS)。数据被分割成多个数据块(Chunk),分布在不同的分片上。配置服务器存储着集群的元数据,如数据块的分布信息等。路由服务器负责接收客户端的请求,并根据元数据将请求转发到相应的分片上。当数据量增加或负载不均衡时,系统会自动进行数据块的迁移和平衡,以保持集群的性能和可用性。
  • 优点
    • 可扩展性:通过添加更多的分片,可以轻松扩展集群的存储容量和处理能力,应对不断增长的数据量和负载。
    • 性能提升:读写操作被分散到多个分片上,减少了单个节点的负载,提高了整体性能,尤其适合大数据量和高并发的场景。
    • 负载均衡:自动的数据块迁移机制可以确保各个分片之间的负载均衡,避免出现某个分片负载过高的情况。
  • 缺点
    • 架构复杂:涉及多个组件(分片、配置服务器、路由服务器等),部署、管理和维护的难度较大,需要较高的技术水平。
    • 数据一致性挑战:由于数据分布在多个分片上,跨分片的事务处理相对复杂,可能会出现数据一致性问题,虽然 MongoDB 提供了一定的事务支持,但与传统关系型数据库相比仍有局限。
    • 元数据管理风险:配置服务器存储关键的元数据,一旦配置服务器出现故障或元数据损坏,可能导致整个集群无法正常工作,需要采取额外的备份和恢复措施。

副本集适用于对高可用性和数据冗余有要求,且数据量和写操作不是特别大的场景;而分片集则更适合处理大规模数据和高并发读写的应用,尽管它在管理上更为复杂。

MongoDB 集群主要通过副本集和分片集群两种方式实现,不同集群模式下的节点选取原理有所不同,以下为你详细介绍:

2、集群故障选取原理

2.1、副本集的节点选取原理

副本集是由多个 MongoDB 实例组成,包含一个主节点(Primary)和多个从节点(Secondary),其节点选取主要涉及主节点选举。

  1. 选举触发条件:当副本集启动、主节点发生故障(如网络故障、进程崩溃等)或手动进行重新配置时,会触发主节点选举。
  2. 选举算法:MongoDB 使用改进的 Bully 算法来进行主节点选举。在该算法中,每个节点都有一个优先级(Priority),取值范围是 0 到 100,默认值为 1。优先级为 0 的节点不能成为主节点,只能作为从节点。
  3. 选举过程
    • 具有最高优先级且可用的节点将被优先选为候选主节点。如果多个节点优先级相同,则具有最新 oplog(操作日志)的节点将更有可能被选为候选主节点。
    • 节点之间通过心跳机制(使用 ping 操作)来检测彼此的状态。当一个节点认为主节点不可用时,它会发起选举。
    • 候选主节点会向其他节点发送选举请求(ELECTION 消息)。其他节点收到请求后,会根据一定的规则进行响应。如果候选主节点收到大多数节点(超过副本集节点总数一半的节点)的支持投票,它将成为新的主节点。
    • 新的主节点选举成功后,会向其他节点发送确认消息,从节点会开始与主节点进行数据同步。

2.2、分片集群的节点选取原理

分片集群由多个组件组成,包括分片(Shard)、配置服务器(Config Server)和路由服务器(MongoS),节点选取涉及客户端请求的路由和数据的定位。

  1. 客户端请求路由:客户端应用程序连接到路由服务器(MongoS),MongoS 负责接收客户端的请求,并将其路由到正确的分片上。MongoS 维护着一份来自配置服务器的元数据,这些元数据记录了数据的分布情况(即哪些数据存储在哪个分片上)。
  2. 数据定位:当客户端发送一个读写请求时,MongoS 首先检查请求的数据库和集合,然后根据元数据确定数据所在的分片。例如,如果请求是读取某个文档,MongoS 会查找元数据中关于该文档所在分片的信息,并将请求转发到相应的分片上。
  3. 分片内部的操作:在分片内部,每个分片本身可以是一个副本集。当分片接收到请求后,副本集中的主节点会处理读和写操作。如果是读请求,主节点可以直接返回数据;如果是写请求,主节点会将操作记录到 oplog 中,并将数据同步到从节点。
  4. 配置服务器的作用:配置服务器存储着整个分片集群的元数据,包括分片的信息、数据块(Chunk)的分布等。MongoS 会定期从配置服务器获取最新的元数据,以确保路由的准确性。当集群的配置发生变化(如添加或删除分片、重新平衡数据等)时,配置服务器会更新元数据,并通知相关的 MongoS。

MongoDB 通过上述原理实现了副本集和分片集群的节点选取和请求处理,以提供高可用性、可扩展性和数据分布的能力。

背景:

在本次搭建中根据生产的机器的磁盘空间来规划,因为客户机器资源有限只有两台机器作为数据存储节点,但要求要有数据备份以满足容灾需求,所以我们选择采用副本集的形式来进行部署。

结合实际情况考虑:采用一主、一从、一仲裁节点来部署MongoDB副本集;因为仲裁节点不存放数据所以满足生产场景需求(如果资源充裕也可以根据业务需要部署一主多从或者有性能上的需求也可以部署分片集)。

一、环境准备

主机名

IP

角色

备注

master

192.168.47.162

PRIMARY

mongo主节点优先级指数为:2

agent1

192.168.47.163

SECONDARY

副本节点(同步主节点的数据,优先级指数为1)

agent2

192.168.47.164

ARBITER

仲裁节点不存储数据,在故障时参与选举PRIMARY节点

二、安装MongoDB服务

1、解压安装包


cd /opt/sumscope && tar -zxvf mongodb-5.0.4.tar.gz

2、修改配置文件

fork = true
bind_ip = 0.0.0.0
port = 27017
dbpath = /opt/sumscope/mongodb/data
logpath = /opt/sumscope/mongodb/logs/mongodb.log
auth = true
keyFile = /opt/sumscope/mongodb/config/mongo.keyfile
replSet = rs0

 3、修改环境变量

# 在文件最后一行加入
[root@server111 local]# vim /etc/profile
PATH=$PATH:/opt/sumsscope/mongodb/bin
export PATH
[root@server111 local]# source /etc/profile

4、开启用户认证

openssl rand -base64 753 > /opt/sumscope/mongodb/config/mongo.keyfile
chmod 600 /opt/sumscope/mongodb/config/mongo.keyfile
scp -rp /opt/sumscope/mongodb/config/mongo.keyfile root@agent1:/opt/sumscope/mongodb/config
scp -rp /opt/sumscope/mongodb/config/mongo.keyfile root@agent2:/opt/sumscope/mongodb/config

5、将mongo配置成系统服务

注意:mongodb.service得自己编写

cd /opt/sumscope/mongodb/scripts
#注意:如果部署路径不一致将mongodb.service的启停命令进行修改
cp  mongodb.service /lib/systemd/system
chmod +755 /lib/systemd/system/mongodb.service
systemctl daemon-reload


 

三、初始化MongoDB集群节点

1、在主机点上进行初始化操作

use admin
rs.initiate({_id:"rs0", members:[{_id:0, host:"192.168.47.162:27017"}, {_id:1,host:"192.168.47.163:27017"}]})

2、加入仲裁节点

先执行如下命令,不然加入仲裁执行会很慢
db.adminCommand({"setDefaultRWConcern" : 1,"defaultWriteConcern" : {"w" : 2}})再执行rs.addArb("192.168.47.164:27017")

3、创建root用户所属库为admin

db.createUser({ "user":"root","pwd":"ppp","roles":[ { role: "readWriteAnyDatabase", db: "admin" },{ role: "root", db: "admin" },"readWrite"]})

4、创建tbook数据库,所属用户stc

use admin
db.auth('root','ppp')
use tbook
db.createUser({user:"stc",pwd:"ppp",roles:[{role:'dbOwner',db:'tbook'}]})

5、写入数据验证

use tbook
db.auth('stc','ppp')
#插入数据
db.ttab.insert({name:'test2-1',url:'https://www.test2-1.cn'})

四、节点优先级设置

1、优先级设置背景

mongo配置完成后默认的参数为
  • PRIMARY:1
  • SECONDARY: 1
  • ARBITER:0

从上述来看,在master mongo服务挂掉之后,agent1将会被选为主节点,而master恢复之后由于优先级一致,主节点让然在agent1上运行;所以通过设置优先级的方法,master上的mongo服务起来之后可以再次成为主节点,之前在agent1上写入的数据也会被同步到master上。
根据上述情况现将节点优先级设置如下:
  • PRIMARY:2 (master 主机)
  • SECONDARY: 1 (agent1 主机)
  • ARBITER:0 (agent2 主机)

2、节点优先级设置命令

/opt/sumscope/mongodb/bin/mongo
#进入admin库进入
rs0:PRIMARY> use admin
rs0:PRIMARY> db.auth('root','passwd')
#查看副本集信息
rs0:PRIMARY> rs.status();
#查看副本的优先级
rs0:PRIMARY> rs.config();########修改优先级###########
#使用如下命令获取到副本集中的配置信息,并赋值给变量(后面将通过这个变量修改配置)
rs0:PRIMARY> cfg = rs.conf()
#修改主节点的优先级为2(主节点、副本节点、仲裁节点的索引分别为:0、1、2)
rs0:PRIMARY> cfg.members[0].priority=2
#更新副本集的配置
rs0:PRIMARY> rs.reconfig(cfg)

注:以上priority优先级改完之后会立即生效,priority最高的将成为主节点

 修改之后

五、群集故障测试

1、副本节点故障(关闭副本)

预期:

  • 不会触发选举,此时给主节点插入数据,
  • 再次启动副本节点(agent1),会发现主节点(master)写入的数据,会自动同步给副本节点(agent1)节点。
步骤一:关闭agent1上的MongoDB服务

步骤二:在master上查看状态(主节点)

步骤三:在master主节点上写入数据

步骤四: 故障恢复 (开启agent1上的MongoDB服务)

在agent1上查看故障时master写入的数据是否同步成功

结论:
  • 从节点发生故障集群不会触发选举,此时给主节点插入数据,
  • 再次启动副本节点(agent1),会发现主节点(master)写入的数据,会自动同步给副本节点(agent1)节点。

2、 主节点故障(关闭主节点的MongoDB)

预期:

  • 触发选举,副本节(agent1)点当主节点
  • 再次启动主节点发现优先级原因,主节点再次回到master上

步骤一:关闭master上的mongo服务

步骤二:查看到agent1上的mongo变成主节点

步骤三:在agent1上写入数据

步骤四:恢复master上的MongoDB

由于优先级的原因master变成了主节点、agent1变成了副本节点

步骤五:查看master故障时,agent1后写入的数据是否同步到master节点上。

结论:
  • 当主节点故障时集群触发选举,副本节(agent1)点当选为主节点
  • 再次启动主节点因为优先级原因,主节点再次回到master上。

3、仲裁节点和主节点故障

预期:

  • 副本集是只读状态,不在进行选举,因为票数没有超过半数
步骤一:关闭master和agent2上的mongo服务
步骤二:查看agent1上的mongo服务读写情况
写入数据验证: 写入数据失败
读数据验证: 读数据正常

4、仲裁节点和副本节点故障

预期:

  • 副本集是只读状态,不可写入数据了。
步骤一:关闭agent1(副本节点)和agent2(仲裁节点)上的MongoDB服务
步骤二:查看master(主节点)由PRIMARY 变为 SECONDARY

步骤三:主机点上进行读写验证
写数据验证: 写入数据失败,此时只能时读的状态
读数据验证: 可以读数据

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

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

相关文章

蓝桥杯自我复习打卡

总复习,打卡1. 一。排序 1。选段排序 太可恶了,直接全排输出,一个测试点都没过。 AC 首先,这个【l,r】区间一定要包含p,或者q,pq一个都不包含的,[l,r]区间无论怎么变,都对ans没有影响。 其次&…

Flutter_学习记录_实现列表上拉加载更多的功能

可以用ScrollController组件来实现这样列表上拉加载更多的功能: 1. 定义变量 在StatefulWidget 的组件内,添加三个属性: // 滚动视图的控制器final ScrollController _scrollController ScrollController();// 是否已显示了上拉加载中bool _isShowM…

【Linux】【网络】不同子网下的客户端和服务器通信其它方式

【Linux】【网络】不同子网下的客户端和服务器通信其它方式 那么,在 NAT 环境下,应该如何让内网设备做为服务器,使内网设备被外部连接? 1 多拨 部分运营商,支持在多个设备上,通过 PPPoE 登录同一个宽带账…

六十天前端强化训练之第一天到第七天——综合案例:响应式个人博客项目

欢迎来到编程星辰海的博客讲解 目录 前言回顾 HTML5与CSS3基础 一、知识讲解 1. 项目架构设计(语义化HTML) 2. 响应式布局系统(Flex Grid) 3. 样式优先级与组件化设计 4. 完整响应式工作流 二、核心代码示例 完整HTML结…

测试的BUG分析

在了解BUG之前,我们要先了解软件测试的生命周期,因为大多数BUG都是在软件测试的过程中被发现的 软件测试的生命周期 在了解 软件测试的生命周期 之前,我们要先了解 软件的生命周期 ,虽然他们之间只差了两个字,但是差距还是很大的 首先是 软件生命周期 ,这个是站在 软件 的角…

【洛谷贪心算法题】P1094纪念品分组

该题运用贪心算法,核心思想是在每次分组时,尽可能让价格较小和较大的纪念品组合在一起,以达到最少分组的目的。 【算法思路】 输入处理:首先读取纪念品的数量n和价格上限w,然后依次读取每件纪念品的价格,…

[STM32]从零开始的STM32 BSRR、BRR、ODR寄存器讲解

一、前言 学习STM32一阵子以后,相信大家对STM32 GPIO的控制也有一定的了解了。之前在STM32 LED的教程中也教了大家如何使用寄存器以及库函数控制STM32的引脚从而点亮一个LED,之前的寄存器只是作为一个引入,并没有深层次的讲解,在教…

SP导入智能材质球

智能材质球路径 ...\Adobe Substance 3D Painter\resources\starter_assets\smart-materials 放入之后就会自动刷新

网络原理----TCP/IP(3)

核心机制七----延时应答 默认情况下,接收方都是在收到数据报的第一时间,就返回ack,但是可以通过延时返回ack的方式来提高效率,理论上不是100%提高效率,但还是有一定帮助的。 因为如果接收数据的主机⽴刻返回ACK应答,…

MacBook Pro使用FFmpeg捕获摄像头与麦克风推流音视频

FFmpeg查看macos系统音视频设备列表 ffmpeg -f avfoundation -list_devices true -i "" 使用摄像头及麦克风同时推送音频及视频流: ffmpeg -f avfoundation -pixel_format yuyv422 -framerate 30 -i "0:1" -c:v libx264 -preset ultrafast -b:v 1000k -…

ubuntu中ollama设置记录

自己同一台电脑主机安装3080和3090显卡,测试发现ollama只默认跑在3090上;故查看一下设置,成功也把3080也运行起来了。 原因如下: 开始设置记录: Environment Variables: OLLAMA_DEBUG 作用:显示额外的调试…

【Python · PyTorch】循环神经网络 RNN(基础应用)

【Python PyTorch】循环神经网络 RNN(简单应用) 1. 简介2. 模拟客流预测(数据集转化Tensor)3.1 数据集介绍3.2 训练过程 3. 模拟股票预测(DataLoader加载数据集)3.1 IBM 数据集3.1.2 数据集介绍3.1.3 训练…

【JSON2WEB】15 银河麒麟操作系统下部署JSON2WEB

【JSON2WEB】系列目录 【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSO…

Spring Boot(七):Swagger 接口文档

1. Swagger 简介 1.1 Swagger 是什么? Swagger 是一款 RESTful 风格的接口文档在线自动生成 功能测试功能软件。Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。目标是使客户端和文件系统作为服务器以同样的…

cursor 弹出在签出前,请清理仓库工作树 窗口

问题出现的背景:是因为我有两台电脑开发,提交后,另一个电脑的代码是旧的,这个时候我想拉取最新的代码,就会出现如下弹窗,因为这个代码暂存区有记录或者工作区有代码的修改,所以有冲突&#xff0…

在 Mac mini M2 上本地部署 DeepSeek-R1:14B:使用 Ollama 和 Chatbox 的完整指南

随着人工智能技术的飞速发展,本地部署大型语言模型(LLM)已成为许多技术爱好者的热门选择。本地部署不仅能够保护隐私,还能提供更灵活的使用体验。本文将详细介绍如何在 Mac mini M2(24GB 内存)上部署 DeepS…

《UE5_C++多人TPS完整教程》学习笔记33 ——《P34 关卡与大厅之间的过渡(Transition Level And Lobby)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P34 关卡与大厅之间的过渡(Transition Level And Lobby)》 的学习笔记,该系列教学视频为计算机工程师、程序员、游戏开发者、作家(Engineer, Programmer, Game Developer,…

Vscode 便用快捷键设置教程

文章目录 简介:1. go to define (跳转到函数定义的位置)2. go to declaration (跳转到函数声明的位置)3. move line (上下移动本行代码)3.1上下复制本行代码 4. 前进和后退(就是前进到光标上一次停留的位置,和后退到那…

【实战篇】【深度解析DeepSeek:从机器学习到深度学习的全场景落地指南】

一、机器学习模型:DeepSeek的降维打击 1.1 监督学习与无监督学习的"左右互搏" 监督学习就像学霸刷题——给标注数据(参考答案)训练模型。DeepSeek在信贷风控场景中,用逻辑回归模型分析百万级用户数据,通过特征工程挖掘出"凌晨3点频繁申请贷款"这类魔…

Vue核心知识:Vue动态权限到按钮完整方案

为了进一步实现上面提到的动态路由功能,并且加入对每个路由的权限控制(即增、删、改、查按钮的权限控制),我们需要对数据库、后端接口、前端的设计做一些改进和扩展。下面我将详细描述如何在现有方案的基础上加入对路由的增、删、…