MongoDB主备副本集方案:两台服务器使用非对称部署的方式实现高可用与容灾备份

昨天(2024/11/18)碰到这么个问题,因为要控制成本,公司只愿意出两台服务器(很小的盒子)部署业务,采用传统的主备模式。这其中就包括Mongodb数据库,最稳固的方法当然是采用官方推荐的最低3台。但没办法,只能是模拟部署了。

选举机制踩坑-必须获得超过半数票

一开始冒出来的想法是各部署两个mongodb节点**(2+2)**,这样挂掉还有一半,但是实测不会进行选举,集群会卡住不可用!

后来我想,是不是因为偶数的原因,试了下**(3+3)**,结果还是不可用。因为我问gpt说是获得的票数是 votes > ceil(total/2),被个ceil给坑了。因为按照这个设定,我以为是>=,不然3个节点挂一个就应该不可用。

实际上只要超过半数就可以,奇数的不会出现对等,所以更好控制!
另外三节点,挂掉一个后,rs.status() 会出现错误 : Error: Invalid UTF-8 string in BSON document

方案一:主备身份轮换

部署拓扑结构

在方案一中,我们使用两台服务器,部署一个主实例(Primary)和一个备用实例(Secondary),并额外配置一个投票节点(Arbiter)来保证选举的有效性。

  • 服务器A(主服务器):部署一个MongoDB实例(Primary)
  • 服务器B(备用服务器):部署一个MongoDB实例(Secondary)和一个Arbiter实例
服务器A - MongoDB Primary
服务器B - MongoDB Secondary
服务器B - Arbiter

实现步骤

  1. 初始配置

    • 服务器A上的MongoDB实例被设置为Primary节点。
    • 服务器B上的MongoDB实例被配置为Secondary,并在服务器B上额外部署一个Arbiter实例,用于选举。
    • 副本集初始化完成后,服务器A作为Primary处理所有写操作,服务器B作为Secondary提供读操作(如果配置为允许读操作)。
  2. 故障切换与维护流程

    • 故障切换:当Primary节点(服务器A)发生故障时,备用服务器B发起选举,获得自身和Arbiter的投票,从而成为新的Primary。
    • 维护切换:在需要手动切换主备角色时,可以先停止服务器A,将服务器B设置为Primary并确保其稳定运行,随后启动服务器A作为新的Secondary节点,并重新配置副本集。

数据一致性影响

  • 在此方案中,主备切换可能存在短暂的写入中断,特别是在Primary节点发生故障时,需要等待选举完成。
  • 若在Secondary节点成为新的Primary期间,未及时同步的数据可能会导致数据一致性风险,具体取决于复制滞后的程度和写入操作量。

客户端连接

客户端连接时需要使用副本集连接字符串,确保在Primary节点切换时能够自动连接新的Primary:

客户端
服务器A - MongoDB Primary
服务器B - MongoDB Secondary

方案二:基于priority的自动主备切换

部署拓扑结构

与方案一类似,方案二也依赖于两台服务器,但通过设置不同的priority来实现自动化的主备角色管理。

  • 服务器A(主服务器):Primary节点,配置较高的priority
  • 服务器B(备用服务器):Secondary节点,配置较低的priority,并包含一个Arbiter节点
服务器A - MongoDB Primary, Priority高
服务器B - MongoDB Secondary, Priority低
服务器B - Arbiter

实现步骤

  1. 配置优先级

    • 服务器A的priority值设置较高,确保在正常运行时始终担任Primary节点。
    • 服务器B的priority值设置较低,通常作为Secondary节点,但在Primary发生故障时会自动升级为Primary。
  2. 故障恢复与抢占

    • 当服务器A发生故障,备用服务器B会自动成为Primary节点,继续处理写入请求。
    • 服务器A恢复并重新加入副本集后,由于其priority值较高,会自动抢占Primary角色,恢复为主服务器。

数据一致性影响

  • 通过自动优先级切换,方案二能够更快响应主备角色的变化,减少切换过程中的写入中断。
  • 若发生网络分区或短暂故障,可能会导致短暂的"脑裂"风险。通过配置Arbiter节点,该风险可以得到一定程度的缓解。
  • 自动抢占可能引发短暂的切换过程,尤其是在较高负载下时,需要注意数据的一致性和写入冲突的处理。

客户端连接

客户端连接时也应使用副本集连接字符串,确保自动连接当前的Primary节点:

客户端
服务器A - MongoDB Primary, Priority高
服务器B - MongoDB Secondary, Priority低

方案对比

比较项方案一:手动主备切换方案二:基于priority的自动主备切换
实现复杂度较高,需要手动干预和配置较低,配置完成后自动处理
主备切换响应速度需要一定的手动干预时间自动响应,通常较快
灵活性较高,可以控制主备角色转换的时机灵活性相对较低,但自动化程度高
维护成本需要手动操作和关注角色切换自动维护成本较低
适用场景需要较强的角色控制时,例如关键业务维护期间适用于高可用和快速故障切换的场景

与三台设备组成的副本集对比

在标准的三节点副本集架构中,通常由一个Primary节点和两个Secondary节点组成,无需额外的Arbiter来参与投票,具备更好的高可用性和数据一致性保障。

三节点副本集的优势

  1. 更高的数据一致性

    • 数据在三节点中分布复制,出现节点故障时,仍能确保数据存在于至少两个节点上,从而减少数据丢失的风险。
    • 不同于两节点加Arbiter的方案,三节点架构能够更好地应对网络分区问题,降低“脑裂”风险。
  2. 自动化程度更高

    • 无需额外配置投票节点,节点之间的选举更加自然。
    • 主备切换流程中断更短,因三个节点始终存在一个备用Secondary作为下一任Primary候选。
  3. 扩展性更好

    • 在需要进一步扩展时,三节点副本集更容易增加节点,提升整体性能和可靠性。

两节点方案的局限性

  • 高可用性略低:由于仅有一个Secondary节点,任意节点故障都会显著影响集群的可用性。
  • 选举机制更复杂:需要通过Arbiter来确保选举票数多数,不如三节点架构直接稳定。
  • 维护复杂度更高:在进行角色切换时,需要手动操作或依赖于不同的priority配置,增加维护成本。

结论

  • 方案一适合需要更严格控制主备切换时机的场景,能够手动调整和维护,但维护成本较高。
  • 方案二通过priority实现自动切换,适合追求高可用性和快速故障响应的场景,但需要额外注意抢占过程中可能出现的临时一致性问题。
  • 相比于标准的三节点副本集,两节点方案具备一定的局限性和风险,适用于资源有限但需要基本高可用性的环境。三节点方案更为稳健,推荐在资源充足的情况下使用。

通过合理选择和配置,可以实现符合业务需求的MongoDB副本集方案,提高数据库系统的容灾能力和高可用性。

附录 - 启动脚本

说明: mongodb7.0 + windows 环境测试

副本集创建

简单的把数据放在三个目录去

.\mongod.exe --port 27017 --dbpath G:/mongo/node1/data --logpath G:/mongo/node1/log/mongo.log --replSet rs 

.\mongod.exe  --port 27018 --dbpath G:/mongo/node2/data --logpath G:/mongo/node2/log/mongo.log --replSet rs

.\mongod.exe  --port 27019 --dbpath G:/mongo/node3/data --logpath G:/mongo/node3/log/mongo.log --replSet rs

副本集初始化

rs.initiate({
  _id: "rs",
  members: [
    { _id: 0, host: "localhost:27017" },
    { _id: 1, host: "localhost:27019" }
  ]
})

一定概率不让直接加投票节点,需要配置默认writeConcern

db.adminCommand({
  "setDefaultRWConcern" : 1,
  "defaultWriteConcern" : {
    "w" : 1
  }
})

添加投票节点

rs.addArb("localhost:27018")

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从零开始:如何使用第三方视频美颜SDK开发实时直播美颜平台

开发一个具有实时美颜功能的直播平台,能够显著提高用户体验和内容质量。而利用第三方视频美颜SDK可以大大简化开发过程,加快产品上市速度。本篇文章,小编将从零开始,详细讲解如何使用第三方视频美颜SDK开发一个实时直播美颜平台。…

ROS入门学习ONE

ros入门玩法1:控制小龟龟 终端1输入 sudo apt install ros-noetic-rqt-steering 新建终端2(快捷键CtrlAltT),打开控制台 roscore //启动ros系统 回到原终端 rosrun rosrun rqt_robot_steering rqt_robot_steering 新建终端3,…

shell脚本(二)

声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…

简单理解下基于 Redisson 库的分布式锁机制

目录 简单理解下基于 Redisson 库的分布式锁机制代码流程:方法的调用:具体锁的实现:riderBalance 方法:tryLock 方法(重载):tryLock 方法(核心实现): 简单理解…

小鹏汽车智慧材料数据库系统项目总成数据同步

1、定时任务处理 2、提供了接口 小鹏方面提供的推送的数据表结构: 这几个表总数为100多万,经过条件筛选过滤后大概2万多条数据 小鹏的人给的示例图: 界面: SQL: -- 查询车型 select bmm.md_material_id, bmm.material_num, bm…

LeetCode 3244.新增道路查询后的最短距离 II:贪心(跃迁合并)-9行py(O(n))

【LetMeFly】3244.新增道路查询后的最短距离 II:贪心(跃迁合并)-9行py(O(n)) 力扣题目链接:https://leetcode.cn/problems/shortest-distance-after-road-addition-queries-ii/ 给你一个整数 n 和一个二维…

华为无线AC+AP组网实际应用小结

之前公司都是使用的H3C的交换机、防火墙以及无线AC和AP的,最近优化下无线网络,说新的设备用华为的,然后我是直到要部署的当天才知道用华为设备的,就很无语了,一点准备没有,以下为这次的实际操作记录吧&…

Fakelocation Server服务器/专业版 Windows11

前言:需要Windows11系统 Fakelocation开源文件系统需求 Windows11 | Fakelocation | 任务一 打开 PowerShell(以管理员身份)命令安装 Chocolatey Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProto…

C语言基础学习:抽象数据类型(ADT)

基础概念 抽象数据类型(ADT)是一种数据类型,它定义了一组数据以及可以在这组数据上执行的操作,但隐藏了数据的具体存储方式和实现细节。在C语言中,抽象数据类型(ADT)是一种非常重要的概念&…

基于深度学习CNN算法的花卉分类识别系统01--带数据集-pyqt5UI界面-全套源码

文章目录 基于深度学习算法的花卉分类识别系统一、项目摘要二、项目运行效果三、项目文件介绍四、项目环境配置1、项目环境库2、环境配置视频教程 五、项目系统架构六、项目构建流程1、数据集2、算法网络Mobilenet3、网络模型训练4、训练好的模型预测5、UI界面设计-pyqt56、项目…

Bokeh实现大规模数据可视化的最佳实践

目录 引言 一、Bokeh简介 二、安装Bokeh 三、数据准备 四、性能优化 五、创建图表 六、添加交互功能 七、应用案例 八、高级技巧 九、总结 引言 在数据科学领域,数据可视化是一个至关重要的环节。通过可视化,我们可以直观地理解数据的特征和趋势,为数据分析和决策…

Easyexcel(4-模板文件)

相关文章链接 Easyexcel(1-注解使用)Easyexcel(2-文件读取)Easyexcel(3-文件导出)Easyexcel(4-模板文件) 文件导出 获取 resources 目录下的文件,使用 withTemplate 获…

【山大909算法题】2014-T1

文章目录 1.原题2.算法思想3.关键代码4.完整代码5.运行结果 1.原题 为带表头的单链表类Chain编写一个成员函数Reverse,该函数对链表进行逆序操作(将链表中的结点按与原序相反的顺序连接),要求逆序操作就地进行,不分配…

[Redis#2] 定义 | 使用场景 | 安装教程 | 快!

目录 1. 定义 In-memory data structures 在内存中存储数据 2. 优点!快 Programmability 可编程性 Extensibility 扩展性 Persistence 持久化 Clustering 分布式集群 High availability 高可用性 ⭕快速访问的实现 3. 使用场景 1.Real-time data store …

学习编程,学习中间件,学习源码的思路

01 看的多,内化不足 最近想复习一下编程相关的知识,在复习前我翻开了之前的一些笔记,这些笔记基本都是从书本、视频、博客等摘取记录的,看着这些笔记心里总结:看的多,内化不足。 02 整理大纲 为了解决这个…

hhdb数据库介绍(10-2)

集群管理 计算节点集群 集群管理主要为用户提供对计算节点集群的部署、添加、启停监控、删除等管理操作。 集群管理记录 集群管理页面显示已部署或已添加的计算节点集群信息。可以通过左上角搜索框模糊搜索计算节点集群名称进行快速查找。同时也可以通过右侧展开展开/隐藏更…

AG32既可以做MCU,也可以仅当CPLD使用

Question: AHB总线上的所有外设都需要像ADC一样,通过cpld处理之后才能使用? Reply: 不用。 除了ADC外,其他都是 mcu可以直接配置使用的。 Question: DMA和CMP也不用? Reply: DMA不用。 ADC/DAC/CMP 用。 CMP 其实配置好后,可以直…

贪心算法(1)

目录 柠檬水找零 题解: 代码: 将数组和减半的最少操作次数(大根堆) 题解: 代码: 最大数(注意 sort 中 cmp 的写法) 题解: 代码: 摆动序列&#xff0…

网络爬虫——综合实战项目:多平台房源信息采集与分析系统

1. 项目背景与目标 1.1 项目背景 随着房产市场的快速发展,各大平台上充斥着大量房源信息。为了帮助用户快速掌握市场动态,需要通过爬虫技术自动采集多平台数据,清洗后进行存储和分析,为用户提供有价值的洞察。开发者通过这一实战…

数据结构-7.Java. 对象的比较

本篇博客给大家带来的是java对象的比较的知识点, 其中包括 用户自定义类型比较, PriorityQueue的比较方式, 三种比较方法...... 文章专栏: Java-数据结构 若有问题 评论区见 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 .…