分布式数据库稳定性资料整理

news2025/8/2 15:39:20

这篇文章所讲的事情

初探分布式数据库这种有状态服务是如何保证系统的高可用的,可能会有勘误,欢迎指导。

正文

分布式数据库在说高可用的时候,主要是在讲宕机和网络分区时,系统的高可用如何保证,这点和我们在线上应用稳定性治理中所说的高可用有些许不同,表现在线上应用稳定性治理,需要在容量,依赖,线上变更三个维度去做系统稳定性治理,而分布式数据库的高可用,是在说线上应用稳定性治理中-依赖的细分方面:宕机和网络分区场景下如何做系统高可用,即分布式数据库所说的高可用是线上应用稳定性治理的一个方面。

分布式数据库高可用实现的一般思路

分布式数据库在应对宕机和网络分区故障的思路为数据副本机制,
数据副本机制实现的一般思路为主从架构,
主从架构下保证数据一致的机制为复制状态机。
如下为主从架构示意图:
一主两从结构
如下是raft算法对复制状态机的描述

复制状态机通常使用复制日志实现,每个服务器存储一个包含一系列命令的日志,其状态机按顺序执行日志中的命令。 
每个日志中命令都相同并且顺序也一样,因此每个状态机处理相同的命令序列。 这样就能得到相同的状态和相同的输出序列。

复制状态机在正常情况下是能够保证主从数据一致的,但是在主宕机的情况下,如何保证集群数据的一致性,这是一个新的问题,后面会展开说。

宕机情况下的高可用

宕机情况分为两种,一种为主节点宕机,一种为从节点宕机。

主节点宕机

在多副本的情况下,主节点会是一个单点,当主节点挂掉后,整个系统将无法运行,这时候我们需要对主节点进行主从切换。

单一哨兵机制

为了实现当主节点宕机时,能够进行主从切换,引入了哨兵机制,单独部署一个哨兵服务,对整体数据库集群进行监控,当主节点挂掉后,选择从节点晋升为主节点继续提供服务,典型的例子为mysql的MHA,其整体架构如下图。
在这里插入图片描述

哨兵集群

但这又引入了另外一个问题:当哨兵宕机了怎么办?
解决方案是哨兵也做多副本机制,由于决策只能是一个节点进行决策,这个节点为集群中的主节点,其余节点为备份节点,所以仍然实现选主功能,典型的算法如raft,zab等。
整体架构图变成了这样:
在这里插入图片描述

哨兵与数据库部署同一机器

这时候就出现一个非常有意思的情况,既然哨兵通过分布式共识算法实现了高可用(2n+1个节点,挂掉n个集群不受影响),那么不如直接让数据库主从实例结合分布式共识算法,不需要再部署哨兵节点,直接实现分布式数据库副本的高可用了,这就是RadonDB下的xenon做的事情,但这样做也有缺点,即这些共识协议都必须保证数据写入n+1台机器才能确认成功,写入效率上比mysql的异步复制低一些。

从节点宕机

从节点宕机的检测,仍然是由哨兵负责,哨兵会在从节点宕机后进行报警。
由于从节点为备份节点,宕机后对整个集群的影响并不大,故大多数从库宕机后,并没有让哨兵重新申请机器制作从库的需要,后续的处理是,如果从库在规定时间内(主库log存在的时间点)重新启动,则从库会继续从主库同步日志,如果从库在规定的时间内未重新启动,则需要重新制作新的从库。

网络分区

网络分区会带来两个问题,第一个是哨兵与数据库所有机器网络分区后的误判问题,第二个是哨兵与主节点网络分区后的误判导致集群主从切换,进而导致的脑裂问题。

哨兵集群一章中,哨兵集群与数据库集群是分开部署的,如果哨兵集群与数据库集群之间的网络产生了分区,那么哨兵集群则无法探测数据库集群的状态,并认定所有机器全部死亡,这时候判断是错误的,可能主数据库还在正常运行。
解决方案正好为哨兵与数据库部署同一机器这章描述的方式一样,只要两者结合即可,且分布式共识算法的2n+1 台机器中n+1台机器选主才能成功的特性,又解决了脑裂问题。

副本数据一致性

在正常集群运行情况下,复制状态机是可以满足主从副本数据的一致性的,但是当主库出现问题而宕机,集群发生主从切换时,从库晋升,如果主库到从库是全异步复制,则会导致数据的丢失,各种分布式共识算法都要求在2n+1的集群中写入n+1台机器,才认定写入成功,则是为了避免数据库在主宕机的情况下出现数据丢失。

万能的共识算法与分布式数据库的高可用

共识算法的优点与缺点

从上面的章节中,我们看到分布式共识算法出现的频率非常高,他解决了分布式数据库中的主从切换问题(例如),还解决了主从节点的数据一致性问题,还解决了网络分区导致的脑裂问题,故我们看到一个不丢失数据的高可用的集群的最终形态(以笔者脑子里的存货所推理出来的最终形态),即以分布式共识算法为基础实现的分布式数据库,业界案例有TIDB,xenon等。
但由于分布式共识算法数据必须写入n + 1台机器才能够认为写入成功,这导致在一些高性能的数据库上,是无法采用此类算法做高可用,他们在选型上进行了trade off,例如redis cluster,其不能保证脑裂与主宕机时的数据无丢失,但其保留了自身的高性能。

共识算法在主库宕机情况下的自动容灾是如何保证数据不丢失的

大部分的共识算法是通过以下两点进行保证的

  1. 在2n+1的集群中,写入n+1个节点才算写入成功。
  2. 在2n+1的集群中,在m ( m <= n )台机器宕机的情况下,从剩下的n+1台机器中,选出拥有最新日志的那台机器做主(在剩下的n + 1台机器中,必然有一台是有最新的commit的日志的,找拥有最高的日志的节点,一定包括最新的commit日志)。

共识算法在网络分区情况下是如何避免脑裂的

主宕机的情况下,在 2n + 1 的集群中,一定有一个多数派集群,这个集群包含 n + 1 的集群机器,这个多数派集群中,所有机器都同意其作为新的主,这样才能够选主成功,故当一个2n + 1的集群分裂为n,n + 1两个集群,而主在n这个集群内,此时n集群内的主无法完成写入动作,因为一个写入动作需要 n + 1 的机器进行确认,而这时n集群只有n台机器。并且n集群内是无法选出主的,只有n+1的集群可以选出主。

参考资料

xenon
mysql高可用方案

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

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

相关文章

【页面无响应】Web页面经常无响应前端如何定位与优化(已解決)

【写在前面】客户现场应用我们的系统时候&#xff0c;发现用着用着就出现1个页面无响应现象&#xff0c;给客户带来极其不好的体验&#xff0c;尤其是当重要工作汇报演示时&#xff0c;就给我看无响应&#xff0c;浏览器崩溃&#xff1f;这样对产品的发展无疑是致命的伤&#x…

水库大坝安全监测的主要坝体类型介绍

水电站和水库大坝安全的分类中有重力坝、土石坝等不同的大坝形式。就在这里详细水库大坝安全监测按照建造形式&#xff0c;基本上可以分为三类&#xff1a;重力坝、土石坝和拱坝。 &#xff08;1&#xff09;重力坝 重力坝&#xff0c;顾名思义就是利用自身重力来维持坝体稳定…

概率论小课堂:高斯分布(正确认识大概率事件)

文章目录 引言I 预备知识1.1 正态分布1.2 置信度1.3 风险II 均值、标准差和发生概率三者的关系。2.1 “三∑原则”2.2 二班成绩比一班好的可能性2.3 减小标准差引言 泊松分布描述的是概率非常小的情况下的统计规律性。学习高斯分布来正确认识大概率事件,随机变量均值的差异和偶…

linux SPI驱动代码追踪

一、Linux SPI 框架概述 linux系统下的spi驱动程序从逻辑上可以分为3个部分: SPI Core&#xff1a;SPI Core 是 Linux 内核用来维护和管理 spi 的核心部分&#xff0c;SPI Core 提供操作接口&#xff0c;允许一个 spi master&#xff0c;spi driver 和 spi device 在 SPI Cor…

面试官: 谈下音视频同步原理,音频和视频能绝对同步吗?

作者&#xff1a;波哥 心理分析&#xff1a;音视频同步本身比较难&#xff0c;一般使用ijkplayer 第三方做音视频同步。不排除有视频直播 视频通话需要用音视频同步&#xff0c;可以从三种 音频为准 视频为准 自定义时钟为准三种方式实现音视频同步 求职者:如果被问到 放正心态…

C++回顾(十一)—— 动态类型识别和抽象类

11.1 动态类识别 11.1.1 自定义类型 C中的多态根据实际的对象类型调用对应的函数 &#xff08;1&#xff09;可以在基类中定义虚函数返回具体的类型信息 &#xff08;2&#xff09;所有的派生类都必须实现类型相关的虚函数 &#xff08;3&#xff09;每个类中的类型虚函数都需…

云原生系列之使用prometheus监控nginx

前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓月&#xff0c;本文主要讲解云原生系列之使用prometheus监控nginx 文章收录到 csdn 我是沐风晓月的博客【prometheus监控系列】专栏&#xff0c;此专栏是沐风晓月对云原生prometheus的的总结&#xff0c;希望能够加深自…

Linux系统中指针的详细分析与操作

文章目录 一、指针 二、指针的初始化 三、指针的运算 四、指针与数组 五、指针与字符串 六、函数指针 七、NULL 指针 八、对复杂指针的解释 C 语言指针真正精髓的地方在于指针可以进行加减法&#xff0c;这一点极大的提升了程序的对指针使用的灵活性&#xff0c;同时也…

【Linux】-- 工具介绍 vim_gcc/g++_gdb

目录 Linux中的软件管理工具 – yum 在Linux下安装软件的方式 认识yum 查找软件包 安装 卸载 lrzsz.x86_64 rz sz Linux中的编辑器 – vim vim的基本概念 vim各模式切换 vim命令模式命令 vim底行模式命令 gcc / g gcc / g的作用 gcc / g语法 预处理 编译 汇…

[ 攻防演练演示篇 ] 利用 shiro 反序列化漏洞获取主机权限

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

厦大纪老师chatgpt相关讲座3.7

在线更新数据&#xff0c;迭代学习训练&#xff0c;进而提高模型性能。 比较明显的是API部分&#xff0c;这一步学习的就是intruction,实现人机写作的复杂系统工程 数据充足&#xff0c;维基类似于百度百科 transformer结构更有优势&#xff0c;预测下一个字&#xff0c;模型越…

RK3399平台开发系列讲解(应用开发篇)断言的使用

🚀返回专栏总目录 文章目录 一、什么是断言二、静态断言三、运行时断言沉淀、分享、成长,让自己和他人都能有所收获!😄 📢断言为我们提供了一种可以静态或动态地检查程序在目标平台上整体状态的能力,与它相关的接口由头文件 assert.h 提供。 一、什么是断言 在编程中…

复位和时钟控制(RCC)

目录 复位 系统复位 电源复位 备份区复位 时钟控制 什么是时钟&#xff1f; 时钟来源 二级时钟源: 如何使用CubeMX配置时钟 复位 系统复位 当发生以下任一事件时&#xff0c;产生一个系统复位&#xff1a;1. NRST引脚上的低电平(外部复位) 2. 窗口看门狗计数终止(WWD…

51单片机数字电子钟开题报告

目录 选题背景 初步设计方案 芯片的选型 编译环境 关键问题 策略 方案 参考文献 选题背景 数字电子钟是一种受到越来越多人喜爱的钟表&#xff0c;其准确性和稳定性成为设计和研发的重要考虑因素。在现代社会&#xff0c;时间的准确性对于各行各业都非常重要&#xff0…

Http中post/get请求参数接收

1、 Http请求报文 Http请求报文示例图如下&#xff1a; ①是请求方法&#xff0c;GET和POST是最常见的HTTP方法&#xff0c;除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。不过&#xff0c;当前的大多数浏览器只支持GET和POST&#xff0c;Spring 3.0提供了一个HiddenHttp…

[oeasy]python0100_wintel联盟_intel_微软_microsoft_msDOS_基尔代尔

wintel联盟 回忆上次内容 上次 了解了IBM的 背水一战 IBM 已经不在乎 软硬一体全自主的设计 了而采用了 开放的架构任何 硬件厂商和软件厂商 都可以来合作 以丧失 自主控制力的方式 获得了 对于 PC架构定义的荣誉 最终 后其身而身先外其身而身存 ibm兼容机的开放架构里 有两…

导出GIS | 将EXCEL表格中坐标导出成GIS格式文件

一 前言 EXCEL是我们日常工作学习数据处理的办公软件&#xff0c;操作易上手&#xff0c;几乎人人都会用。EXCEL表格能够处理各种数据&#xff0c;包括经纬度坐标数据&#xff0c;地址数据等等。 有时因工作需要需将表格中地址数据处理为GIS格式的文件&#xff0c;以便能够将数…

Java之内部类

目录 一.内部类 1.什么是内部类 2.内部类存在的原因 3. 内部类的分类 4.内部类的作用 二.成员内部类 1.基本概念 2.成员内部类的注意点 1.成员内部类可以用private方法进行修饰 2.成员内部类可以直接访问外部类的私有属性 3.外部类可以通过对象访问内部类的私有属性 …

量化择时——均线策略及改进方法(第1部分—因子测算)

文章目录道氏理论个股股价走势阶段板块、行业股价走势均线策略交易逻辑均线策略效果测算改进一&#xff1a;设置策略信号偏移量改进二&#xff1a;生成止盈止损信号道氏理论 使用盘面数据&#xff0c;根据计算出的一条或多条均线&#xff0c;判断入场与离场的时机&#xff0c;…

Redis学习(五):事务、持久化及使用Java操作Redis

事务 Redis事务本质&#xff1a;一组命令的集合。一个事务中的所有命令都会被序列化&#xff0c;在事务执行过程中&#xff0c;会按顺序执行。 一次性、顺序性、排他性&#xff01;执行一系列的命令。 Redis单条命令保证原子性&#xff0c;但是事务不保证原子性&#xff01; R…