【后端面试题】【中间件】【NoSQL】MongoDB提高可用性的方案(主从结构、仲裁节点、分片、写入语义)

news2024/10/6 0:36:38

主从结构

MongoDB的高可用和别的中间件的高可用方案基本类似。比如在MySQL里,接触了分库分表和主从同步;在Redis里,Redis也有主从结构;在Kafka里,分区也是有主从结构的。
所以先介绍启用了主从同步

我们的系统有一个关键组件 - MongoDB,但是在最开始的时候,MongoDB没有启用主从,是一个单节点的。因此每年总会有一两次,MongoDB崩溃不可用。所以我把MongoDB改成了主从同步,最开始的时候业务量不多,为了节省成本,我们用了推荐的配置一主两从。这种改变的好处是:当主节点崩溃后,从节点可以选举出一个新的主节点。

直接说用了几个主从节点,如果问到主从同步的话,回答oplog的内容。

引入仲裁节点

另一种思路是引入仲裁节点,所谓仲裁节点是指这个节点参与主从集群的主节点选举,但是只参与投票,类似于Elasticsearch里的仅投票节点
这种机制在别的中间件也见过了,这类节点的好处在于它们只参与投票,也就是只关心主从选举,所以只需要很少的资源就可以运行起来
在这里插入图片描述

最开始的时候,我们只是部署了一主两从,两个从节点都会同步数据。后面为了进一步提高可用性,引入了仲裁节点。这些仲裁节点被部署在轻量级的服务器上,成本非常低。在引入了这些仲裁节点后,就算有一个从节点崩溃了,整个集群也基本没什么影响,因为这个时候还是有足够的节点可以投票

启用主从模式的配置服务器

我们MongoDB最开始部署的时候,配置服务器并没有启用主从模式,毕竟当时想节省资源。但是后面发现,配置服务器这个对集群的影响太大了,一旦不可用,整个集群就基本不可用了。这种情况下,我们只好引入了主从结构的配置服务器。目前配置服务器本身就有一主两从。

在这里插入图片描述

虽然主节点还是存在崩溃的可能,但是在主节点崩溃之后会有主从选举。更加重要的是,在主节点崩溃之后,整个配置服务集群还是可读的。而我们也知道,在一个 MongoDB 集群里面,元数据也是读多写少的。两者一结合,整个 MongoDB 集群的可用性就提高了。

多数据中心的主从结构

在MongoDB里有一个推荐的架构
在这里插入图片描述
不过整除来说,大部分公司没那么多资源部署,一个简化版本就是用两个数据中心,部署一主三从或两从。

我们公司本身业务规模比较大,对MongoDB的依赖也很严重,所以我们还部署了多数据中心的主从结构。有两个数据中心(可以同域,可以异地),其中一个数据中心,部署了一主一从,另外一个数据中心部署了两个从节点。万一一个数据中心崩溃了,另一个数据中心也还是可用的。

在这里插入图片描述
在主从选举的时候,我们也会倾向于选择和主节点在同一个数据中心的从节点,也就是图里面深黄色的从节点。因为正常来说,同一个数据中心内部的从节点,数据会比较新

同时为了保证在主从选举的时候优先选择同一个数据中心的节点,我们还调整了从节点的优先级。

在整个主从结构都面完了之后,你进一步总结一下。

基本上目前主流的这种大型中间件,在提高可用性上用的方法无外乎就是分片和主从结构。除了 MongoDB,类似的还有 Redis、Elasticsearch、Kafka。

引入分片

分片既可以提高可用性,也可以提高性能。在MongoDB里,引入分片比关系型数据库简单很多,可以直接说在开发新业务的时候就启用了分片功能

随着业务的增长,后面使用MongoDB的时候,都要求开启分片功能,来进一步提高可用性的性能。

另一种思路是为已有的数据添加分片功能。
最后也要总结下

目前来说,支持大数据高并发的中间件基本上也有类似的分片功能。或者说,这一类的中间件明面上都是对等结构,而对等结构里面的每一个“节点”又是一个主从集群。就算是关系型数据库的分库分表,也可以看作是这种对等结构 + 主从结构的模式。

在这里插入图片描述

调整写入语义

写入语义的调整一般有两种思路,一是朝着可用性的角度调整,另一个是朝着性能的角度调整。

以可用性为例

最开始的时候,我们遇到过一个 Bug,就是数据写入到 MongoDB 之后,偶尔会出现数据丢失的问题。因为之前我在 Kafka 上也遇到过类似的问题,所以我就怀疑是不是写入语义没做好。然后我就去排查,果然有发现,在这个数据丢失的场景下,Write Concern 的 w 取值不是默认的 majority,而是 1,也就是说只需要主节点写入就可以。 很明显,在这种情况下,万一写入之后主节点崩溃了,那么从节点就算被提升成主节点,也没有这一条数据。所以,后面我就把这个改回了 majority。同时我还去排查了一个 j 参数,确认设置成了 true。这样一来,数据就不太可能丢失了。

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

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

相关文章

【AIGC】DiffuToon:稳定的视频卡通化技术方案

论文:https://arxiv.org/pdf/2401.16224 github:https://github.com/modelscope/DiffSynth-Studio/tree/main/examples/Diffutoon 网络结构 两个主要分支:主要的卡通化管线和编辑分支 重要技术 使用了fastblend(无需模型的视频帧之间的平滑…

巴图自动化Profinet协议转Modbus协议模块接称重模块与PLC通讯

巴图自动化Profinet协议转Modbus协议模块(BT-MDPN10)是一种能够实现Modbus协议和Profinet协议之间转换的设备。Profinet协议转Modbus协议模块可提供单个或多个RS485接口,使得不同设备之间可以顺利进行通信,进一步提升了工业自动化…

IPFoxy Tips:为什么要选择动态住宅代理IP?

在大数据时代的背景下,代理IP成为了很多企业顺利开展的重要工具。代理IP地址可以分为住宅代理IP地址和数据中心代理IP地址。选择住宅代理IP的好处是可以实现真正的高匿名性,而使用数据中心代理IP可能会暴露自己使用代理的情况。 住宅代理IP是指互联网服务…

花两天手撸海纳嗨数数据分析系统,实现数据分析自给自足

我发现一款超好用的数据分析营销系统,且支持免费私有化部署。 机器准备 机器角色配置10.0.21.85主8核,12G,100G,Centos7.910.0.221.51辅8核,12G,100G,Centos7.910.0.221.55辅8核,12…

x86芯片定制,Ethercat芯片定制,适用于运动控制,工业总线等软硬一体机

x86芯片定制,Ethercat芯片定制 X86平台 我们的研发工程师已经积累了非常丰富的主板、整机设计经验,对接您的产品规格场景需求,快速交付样机,包含主板、BOX整机、平板电脑、CPCI等形态产品。降本、长生命周期、快速交付、及时响应…

电影院售票管理系统(小白)大佬求解

最近在写一个关于电影院售票管理系统的sm项目,但是在买票的环节出现了问题及点击选座购票,没有数据渲染出来,我不知道什么情况,所以问问。有没有大佬可以帮我解决这个问题?下面是我的。控制层,服务层&#…

systemctl命令使用

systemctl 作用:可以控制软件(服务)的启动、关闭、开机自启动 系统内置服务均可被systemctl控制第三方软件,如果自动注册了可以被systemctl控制第三方软件,如果没有自动注册,可以手动注册 语法 systemct…

《数据结构与算法基础 by王卓老师》学习笔记——2.5线性表的链式表示与实现1

1.链式表示 2.链表举例 3.链式存储的相关术语 4.三个讨论题

生成式人工智能与虚拟资产成为BGOV 2024的焦点议题

香港,2024年7月2日 — 一年一度的创新科技盛事BUSINESS GOVirtual (BGOV) 科技博览及会议将于2024年7月11日至12日在香港会议展览中心隆重举行。 展览及会议焦点两大科技趋势:生成式人工智能 (Generative AI) 和虚拟资产 生成式人工智能( Generative A…

【CT】LeetCode手撕—199. 二叉树的右视图

目录 题目1- 思路2- 实现⭐199. 二叉树的右视图——题解思路 3- ACM 实现 题目 原题连接&#xff1a;199. 二叉树的右视图 1- 思路 使用二叉树的层序遍历 2- 实现 ⭐199. 二叉树的右视图——题解思路 class Solution {public List<Integer> rightSideView(TreeNode ro…

【高级篇】第9章 Elasticsearch 监控与故障排查

9.1 引言 在现代数据驱动的应用架构中,Elasticsearch不仅是海量数据索引和搜索的核心,其稳定性和性能直接影响到整个业务链路的健康度。因此,建立有效的监控体系和掌握故障排查技能是每一位Elasticsearch高级专家的必备能力。 9.2 监控工具:洞察与优化的利器 在Elastics…

AzureDataFactory Dataverse connector自动处理了分页问题(单次查询上限5000条的限制)

众所周知&#xff0c;在用fetch执行D365的查询时&#xff0c;单次的查询是5000条&#xff0c;如果超过5000条则需要自己处理分页&#xff0c;添加额外的处理逻辑&#xff0c;但在ADF中&#xff0c;Dataverse connector已经自动处理了分页&#xff0c;我们可以很简单的做个POC. …

用随机森林算法进行的一次故障预测

本案例将带大家使用一份开源的S.M.A.R.T.数据集和机器学习中的随机森林算法&#xff0c;来训练一个硬盘故障预测模型&#xff0c;并测试效果。 实验目标 掌握使用机器学习方法训练模型的基本流程&#xff1b;掌握使用pandas做数据分析的基本方法&#xff1b;掌握使用scikit-l…

软件测试与质量保证 | 云班课选择题库

目录 第1章课后习题 第2章课后习题 第3章课后习题 第4章课后习题 第5章课后习题 第6章课后习题 第7章课后习题 第8章课后习题 第9章课后习题 第10章课后习题 第11章课后习题 第12章课后习题 第13章 测试相关未分类习题 第1章课后习题 1. 与质量相关的概念包括 &a…

HetuEngine简介

目录 HetuEngine是什么&#xff1f; HetuEngine的特点以及使用场景 特点 使用场景 HetuEngine介绍 结构 近期用到了Hetu&#xff0c;了解下这个工具是起什么作用的。 HetuEngine是什么&#xff1f; 是引擎&#xff0c;设计是为了让与当前的大数据生态完美融合的引擎&am…

Ubuntu22.04上Docker的安装

1. 使用APT安装 首先安装HTTPS传输的软件包和CA证书&#xff0c;确保软件下载过程中不被篡改。 sudo apt-get updatesudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release -y然后&#xff0c;使用国内源&#xff0c;并添加软件源的 GPG 密钥以防…

Steam夏促怎么注册 Steam夏促账号注册教程

随着夏日的炙热渐渐充斥着每一个角落&#xff0c;Steam平台也赶来添热闹&#xff0c;推出了一系列让人眼前一亮的夏季促销活动。如果你也是游戏爱好者&#xff0c;我们肯定不能错过这次的steam夏促。正直本次夏日促销有着很多的游戏迎来史低和新史低&#xff0c;有各种各样的游…

Vue3的模板语法插值表达式用法

在template中输入“5 3” &#xff0c;是没有运算能力的&#xff0c;只会把字符直接显示出来&#xff0c;代码如下&#xff1a; <template><view>这是demo</view><view>5 3</view><navigator open-type"navigateBack"><vi…

C++ 实现QT信号槽

https://github.com/libsigcplusplus/libsigcplusplus #include <iostream>/* 在sigslot.h的420,将&#xff1a; //typedef sender_set::const_iterator const_iterator; 改为&#xff1a; //typedef typename sender_set::const_iterator const_iterator;#include <…

在手机上也能开发软件?而且只需要用几句话就可以自动生成一个应用!

随着人工智能技术的飞速发展&#xff0c;软件开发的门槛正在迅速降低。 曾几何时&#xff0c;开发一款软件需要精通编程语言和掌握复杂的开发工具&#xff0c;而如今&#xff0c;只需几句话的描述&#xff0c;便能在手机上轻松开发出功能齐全的软件。 这一切的背后&#xff0…