这篇文章所讲的事情

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

正文

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

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

分布式数据库在应对宕机和网络分区故障的思路为数据副本机制,
数据副本机制实现的一般思路为主从架构,
主从架构下保证数据一致的机制为复制状态机。

如下为主从架构示意图:

如下是raft算法对复制状态机的描述

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

复制状态机在正常情况下(即无宕机,网络分区情形)是能够保证主从数据一致的,但是在主宕机的情况下,如何保证集群数据的一致性,这是一个新的问题,后面会在副本数据一致性章节展开说。

宕机情况下的高可用

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

主节点宕机

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

主从切换包括发现与切换两个功能,初期我们引入哨兵来实现这两个功能。

单一哨兵机制

哨兵服务会对整体数据库集群进行监控,当主节点挂掉后,选择从节点晋升为主节点并继续提供服务,典型的例子为mysql的MHA,其整体架构如下图。

哨兵集群

但这又引入了另外一个问题:当哨兵宕机了怎么办?
解决方案是哨兵也做多副本机制,由于决策只能由一个哨兵节点进行,这个节点被称为哨兵集群中的主节点,其余节点为哨兵集群的备份节点,所以主从切换在哨兵集群上也需要一套这样的逻辑来保证哨兵集群的高可用,兜兜转转我们又回到了原地。

整体架构图变成了这样:

哨兵高可用

如果我们单独把哨兵集群拿出来,做其高可用,我们可以使用共识算法对哨兵集群进行选主操作,例如raft,gossip等,这时哨兵集群就做成了高可用集群,如下图所示。

这时候就出现一个非常有意思的情况,既然哨兵通过分布式共识算法实现了高可用,那么不如直接让数据库主从实例结合分布式共识算法,不需要再部署哨兵节点,直接实现分布式数据库副本的高可用了,现在也是有很多数据库这样做的,例如TIDB的TIKV,使用Raft共识算法进行主从切换与数据同步,最新的redis-cluster的watchdos机制,基于gossip共识协议实现主宕机下的主从切换。


redis-cluster watchdogs机制

从节点宕机

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

网络分区

网络分区会带来两个问题,

第一个是哨兵与数据库所有机器网络分区后的误判问题,

第二个是哨兵与主节点网络分区后的误判导致集群主从切换,进而导致的脑裂问题。

哨兵高可用一章中,哨兵集群与数据库集群是分开部署的,如果哨兵集群与数据库集群之间的网络产生了分区,那么哨兵集群则无法探测数据库集群的状态,并认定所有机器全部死亡,这时候判断是错误的,可能主数据库还在正常运行。

解决方案正好为哨兵高可用这章描述的方式一样,只要两者结合即可,如果要保证不会出现脑裂问题,共识协议的选择,业界一般选择raft,zab,paxos等分布式共识算法,因为在2n+1台机器的集群中,共识算法能保证m(m <= n)台机器宕机,不会出现脑裂问题。

副本数据一致性

在正常集群运行情况下,复制状态机是可以满足主从副本数据的一致性的,但是当主库出现问题而宕机,集群发生主从切换时,从库晋升,如果主库到从库是全异步复制,则会导致数据的丢失。

如果不想让数据丢失,解决方案之一是数据同步也使用gongs各种分布式共识算法都要求在2n+1的集群中写入n+1台机器,才认定写入成功,则是为了避免数据库在主宕机的情况下主从切换出现数据丢失,当然这一约束也是为了防止脑裂的产生。

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

共识算法的优点与缺点

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

注:其实共识问题是分布式系统的最基础问题,解决了这个问题,分布式系统便能work as one,像单节点一样工作

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

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

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

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

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

参考资料

xenon

分布式数据库稳定性资料整理相关推荐

  1. 一图看懂 pytz 模块:现代以及历史版本的世界时区定义数据库,资料整理+笔记(大全)

    本文由 大侠(AhcaoZhu)原创,转载请声明. 链接: https://blog.csdn.net/Ahcao2008 一图看懂 pytz 模块:现代以及历史版本的世界时区定义,将时区数据库引入 ...

  2. java执行查询postgresql得到中文乱码_Greenplum: 基于PostgreSQL的分布式数据库内核揭秘(上篇)...

    关于作者 姚延栋,山东大学本科,中科院软件所研究生.PostgreSQL中文社区委员,致力于Greenplum/PostgreSQL开源数据库产品.社区和生态的发展. 一.数据库内核揭秘 Greenp ...

  3. 权威认可!PolarDB-X高分通过中国信通院《分布式事务数据库稳定性专项评测》

    简介:近日,阿里云PolarDB-X云原生分布式数据库完成中国信通院<分布式事务数据库稳定性专项评测>,高分通过全部测试项目. 随着敏捷开发和DevOps模式在IT领域迅速普及,使得数据产 ...

  4. 变形监测基准点稳定性分析的必要性与方法?变形监测成果资料整理的内容和方法?3、变形分析与预测方法?

    变形监测基准点稳定性分析的必要性?方法? 必要性 变形监测分析与预报是工程或设备安全运营的基本保障,变形分析结果是对设计正确性的检验,是修改设计或类似工程新设计的依据. 变形体的位移由其上离散的目标点 ...

  5. 重磅!分布式数据库解决方案Apache ShardingSphere毕业成为顶级项目

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 全球最大的开源软件基金会 Apache 软件基金会(以下简称 Ap ...

  6. 分布式数据库解决方案Apache ShardingSphere毕业成为顶级项目

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | 公众号「ShardingSphere官微」 全 ...

  7. 软件设计师提纲+复习资料整理(上午题)

    文章目录 软件设计师考试大纲 上午题(选择题) 一.计算机组成原理 考点:CPU结构组成 考点:原码.反码.补码定点整数范围 考点:浮点数表示 考点:RISC和CISC计算机的区别 考点:奇校验与偶校 ...

  8. 网易分布式数据库多活架构的演进与实践

    本文根据周劲松老师在[deeplus直播第228期]线上分享演讲内容整理而成. 周劲松 网易杭州研究院资深研发工程师 来自网易数据科学中心,目前是网易分布式数据库DDB及网易数据运河NDC项目负责人. ...

  9. docker安装mycat_分布式数据库中间件 MyCat 搞起来!

    关于 MyCat 的铺垫文章已经写了三篇了: MySQL 只能做小项目?松哥要说几句公道话! 北冥有 Data,其名为鲲,鲲之大,一个 MySQL 放不下! What?Tomcat 竟然也算中间件? ...

最新文章

  1. 图的最短路径dijkstra算法
  2. 万字长文,值得收藏/参考的OpenCV C++基础代码
  3. Spring Framework 6 将采用 Java 17,是时候将你的应用升级了
  4. 根据文件属性或权限进行find查找
  5. 部分网站为什么上不去_企业网站如何霸占搜索引擎首页
  6. 当推荐系统遇上图学习:基于图学习的推荐系统最新综述
  7. 5 怎么上下分屏_oppo的最新手机reno5系列怎么样
  8. VisualSVN Server 不能打开文件,系统找不到指定的文件
  9. 老公贷款还不上,妻子有偿还责任吗?
  10. JS实现表单多文件上传样式美化支持选中文件后删除相关项
  11. docker build -t_利用Dockerfile自定义镜像-图解轻松学Dockeramp;K8S
  12. 梅花雨无法在 .net 2.0 下用行的问题
  13. 二叉树的深度(剑指 Offer 55 - I)
  14. blender 中文手册 Blender从入门到精通
  15. postsql获取表字段信息SQL
  16. java 偏向锁_Java偏向锁状态转移原理
  17. mysql创建视图步骤_MySQL创建视图的详细步骤
  18. 市场部商业计划PPT模板
  19. 用project做项目计划之 项目成本、预算、基线工期、基线成本、基线时间
  20. 航顺HK32F030MF4P6 RST作GPIO SWCLK作EXTI5 SWDIO作ADC_AIN0

热门文章

  1. 7-16 约分最简分式
  2. 循环控制语句break,continue
  3. WEB 3D JS 使用【3Dmol.js】
  4. 【php毕业设计】基于php+mysql+mvc的网上留言管理系统设计与实现(毕业论文+程序源码)——网上留言管理系统
  5. DHCP 服务器监控
  6. char s[],char *s,char **s与char *s[]
  7. 富士康java面试_富士康Java开发面试题目
  8. AcWing 3565. 完美矩阵 (绝对值不等式)
  9. Ubuntu 输入法fcitx方块乱码解决设置
  10. HTC Vive VR操作规范书