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

主从结构

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.mfbz.cn/a/769706.html

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

相关文章

使用ChatGPT自动生成测试用例思维导图

使用ChatGPT自动生成测试用例思维导图 引言ChatGPT在测试用例编写中的应用全面覆盖测试场景边界测试避免测试用例重复 借助ChatGPT生成测试用例思维导图准备工作步骤一:与ChatGPT对话步骤二:生成思维导图代码 结语 引言 在编写测试用例时,测…

物联网应用Fast ingest

一、原文路径 Tuning the System Global Area 二、翻译 1、原理 Fast ingest 优化是针对高并发,单行数据的插入这种场景的。比如IOT应用采集(很符合国网的用采数据场景)。 Fast ingest 使用MEMOPTIMIZE_WRITE 提示来插入数据到 MEMOPTIM…

WordPress付费进群V2主题,多种引流方法,引私域二次变现

全新前端UI界面,多种前端交互特效让页面不再单调,进群页面群成员数,群成员头像名称,每次刷新页面随机更新不重复,最下面评论和点赞也是如此随机刷新不重复 进群页面简介,群聊名称,群内展示&…

thinkphp6/8 验证码

html和后台验证代码按官方来操作 ThinkPHP官方手册 注意: 如果验证一直失败,看看Session是否开启, 打印dump(session_status());结果2为正确的, PHP_SESSION_DISABLED: Session功能被禁用(返回值为0)。…

WAF的新选择,雷池 SafeLine-安装动态防护使用指南

什么是 WAF WAF 是 Web Application Firewall 的缩写,也被称为 Web 应用防火墙。 区别于传统防火墙,WAF 工作在应用层,对基于 HTTP/HTTPS 协议的 Web 系统有着更好的防护效果,使其免于受到黑客的攻击; 通俗来讲&#…

vue3+ts项目中.env配置环境变量与情景配置

一、环境变量配置 官网https://cn.vitejs.dev/guide/env-and-mode.html#intellisense 1. 新建.env开头的文件在根目录 为了防止意外地将一些环境变量泄漏到客户端,只有以 VITE_ 为前缀的变量才会暴露给经过 vite 处理的代码 .env 所有环境默认加载 .env.developm…

C++ 语法

一、头文件与源文件 头文件用于声明函数,类似于java中service层的接口; 源文件用于实现头文件函数,相当于java中serviceImpl层的实现类; 定义接口 实现接口 使用接口 二、指针概述 定义与使用 定义一个指针p用于存a变量的内存地址,即指针就是地址; 解引用可以获取或修改…

并发编程面试题1

一、原子性高频问题: 1.1 Java中如何实现线程安全? 多线程操作共享数据会出现问题。可以使用锁来解决: 悲观锁: 使用 synchronized 和 Lock乐观锁: 使用 CAS(Compare-And-Swap)可以根据业务情况选择 ThreadLocal,让每个线程处理自己的数据。 1.2 CAS底层实现 回答思…

Prometheus 监控服务器

Prometheus概述 组件化设置:nginx ,ceph , Prometheus 部署Prometheus服务器 配置时间 安装Prometheus服务器 访问web页面:http://192.168.88.5:9090/ 添加被监控端 监控方式: 拉取:pull。监控端联系被监控端,采集数…

116-基于5VLX110T FPGA FMC接口功能验证6U CPCI平台

一、板卡概述 本板卡是Xilinx公司芯片V5系列芯片设计信号处理板卡。由一片Xilinx公司的XC5VLX110T-1FF1136 / XC5VSX95T-1FF1136 / XC5VFX70T-1FF1136芯片组成。FPGA接1片DDR2内存条 2GB,32MB Nor flash存储器,用于存储程序。外扩 SATA、PCI、PCI expres…

STM32远程烧录程序

目录 简介 不同的程序下载方式 ICP:In-Circuit Programming ISP:In-System Programing IAP:In-Application Programming BootLoader Bootloader 是什么? STM32的启动方式 存储器组织 存储器映像 嵌入式SRAM 嵌入式FL…

【JVM系列】内存泄漏

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Python数据分析-股票数据分析(GARCH模型)

一、研究背景 随着金融市场的不断发展和全球经济的日益复杂,市场波动性和风险管理成为投资者和金融机构关注的焦点。波动率是衡量市场风险的重要指标,准确预测和评估波动率对于资产定价、风险控制和投资决策具有重要意义。在金融时间序列分析中&#xf…

唐山养老院哪家好---老了怎么过?到这里,享受生活的每一刻!

随着时间的流逝,我们每个人都将迎来老年时光,而"老了,怎么过?"这个问题,虽然简单,却深深触动了无数人的心。 面对老年生活,每个人都有不同的选择和追求。有的人选择顺其自然&#xf…

单目相机减速带检测以及测距

单目相机减速带检测以及测距项目是一个计算机视觉领域的应用,旨在使用一个摄像头(单目相机)来识别道路上的减速带,并进一步估计车辆与减速带之间的距离。这样的系统对于智能驾驶辅助系统(ADAS)特别有用&…

新章节:全设备通用调度算法-通讯重构

新章节:全设备通用调度算法-通讯重构 文章目录 新章节:全设备通用调度算法-通讯重构前言一、重构了TCP和UDP通讯二、优化了OPC和OPCUA三、升级了监控客户端四、升级了通讯的图形化其他升级 前言 现在真的很懒也很少写代码了,写代码和更新进度…

Android 15 应用适配默认全屏的行为变更(Android V的新特性)

简介 Android V 上默认会使用全面屏兼容方式,影响应用显示,导致应用内跟导航标题重合,无法点击上移的内容。 默认情况下,如果应用以 Android 15(API 级别 35)为目标平台,在搭载 Android 15 的设…

【网络安全的神秘世界】SQL注入(下)

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 3.7 二次注入 不好挖这个漏洞,需要搞懂业务逻辑关系 二次注入通常是指在存入数据库时做了过滤,但是取…

vue中自定义设置多语言,并且运行js脚本自动生成多语言文件

在项目中需要进行多个国家语言的切换时,可以用到下面方法其中一个 一、自定义设置多语言 方法一: 可以自己编写一个设置多语言文件 在项目新建js文件,命名为:language.js,代码如下 // language.js 文档 let languagePage {CN…

Rocky Linux yum/dnf repo/mirrors 国内镜像列表及更换方法

Rocky Linux yum/dnf repo/mirrors 国内镜像列表及更换方法 Rocky Linux Mirrors 请访问原文链接:https://sysin.org/blog/rocky-linux-mirrors/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 高校镜像推荐 mirr…