1. 高可用性架构

  高可用性是指一个系统经过专门的设计后具备的减少停工时间并能持续保持提供服务的高可用性质。该特性是衡量系统提供服务能力的一个特征,也是对系统进行设计时需要考虑在内的一个重要因素。
  对于数据库系统而言,高可用、高可靠和高性能是人们重点关注点。随着现代互联网技术的快速发展,高可用性被提升到一个新的高度。在CAP理论[1]认为在分布式数据库中可用性(A)值得倍加重视,并以CAP为背景,阐述了分布式系统的强一致性的线性一致性和事务一致性结合时,与可用性间的联系。
  基于上述背景,我们接下来就高可用性在数据库架构方面提出的要求一起学习讨论。

1.1 高可用衡量指标

  对于分布式数据库而言,高可用是系统的一个重要特性,保证其能够在足够长的时间内提供连续的服务。衡量数据库系统的高可用性有一下两个指标:
1)从故障恢复角度来看,包括RTO和RPO

  • RTO(Recovery Time Objective,恢复时间目标):故障恢复过程所需的时间开销。故障恢复后,从IT系统停止服务开始到IT系统恢复至能够提供服务点的时间间隔称为RTO。对于像数据库这种重要性服务,其RTO通畅控制在分甚至是秒级别。
  • RPO(恢复时间点目标):数据库恢复后的时间点,即数据库中的数据可恢复至哪个时间点上,该时间点之后的数据会完全丢失,与数据库停止服务时间点相比,该值越小恢复的越完整,丢失的数据越小。如果数据库采用的是主备强服务或者基于大数派共识协议的副本技术,后者数据库依赖的是分布式文件系统,理想情况下其RPO接近0,即数据不丢失。该项指标更多的是描述系统的可靠性,唯有可靠才可用。

2)衡量计算机的高可用指标,包括MTBF、MTTF、MTTR

  • MTBF(Mean Time Between Failure,平均无故障时间):对于可修复系统而言,系统的平均寿命是指平均情况下两次相邻失效(故障)之间的工作时间。该值越大表明可用性越好。
  • MTTF(Mean Time To Faliure,平均失效时间):对于不可修复的系统而言,系统的平均寿命指系统发生失效前的最大平均有效工作时间。
  • MTTR(Mean Time To Repair,平均修复时间):对于可修复的系统而言,该值表示故障的平均修复时间,即从故障开始到修复的时间。该值越小表明易恢复性越好。

1.2 高可用性分类

  文献[2]将高可用性划分为节点级高可用性、服务级高可用性、人工介入后高可用性。

  • 节点级高可用性是指网络出现分区后,所有节点都能持续对外提供服务。
  • 服务级高可用性是指网络出现分区后,只要分区的严重程度有限(比如某个分区存在多数派),那么整个系统仍然可以继续对外提供服务。服务级高可用性不要求故障发生后所有的节点都可用,只要该分区的大多数节点可用即可(n > N/2)。
  • 人工介入后高可用性是指出现网络分区后,系统暂时进入不可提供服务状态,只有在人工介入确认系统状态或采取某种措施后,系统才能继续提供服务。
      如果从用户的角度来看,CAP中的A不是百分百可用的意思,而是‘‘高可用’’的含义。对系统进行故障分析:用户链路故障会导致不可用;数据库引擎出现不可用,中心化的集中式架构构建的数据库服务更容易出现整个服务不可用的情况,一些去中心化的分布式事务构建的数据库服务能较好的应对服务级不可用;节点故障导致数据不可用,包括主副本不可用和从副本不可用;另外还有因网络分区发生导致的各种不可用、服务/节点响应缓慢导致的不可用、网络延时长用户期待响应快而产生的不可用等。这些因素使得可用性、分布式一致性、事务一致性成为分布式数据库需要在架构层面优先考虑的问题。
      著名研究Dean J在论文[3]中重点介绍了缓解大规模响应式Web服务器中延迟波动问题的技术,虽有别于数据库中的高可用,但是对于数据库有着一定的借鉴意义。提供Web服务,一是应做到的延迟尽可能窄,让服务的响应具有预测性;二是能够容忍错误且具有大规模容忍延迟的能力。
      该论文主要从如下几个方面分析延迟波动产生的原因
  • 共享资源:多个应用竞争硬件资源或者多个请求竞争软件资源;
  • 守护进程:调度执行守护进程的时候会产生时延;
  • 全局资源共享:运行在不同机器上的应用会竞争一些全局资源(网管、共享文件系统),而在分布式系统中如全局时钟、集中式协调器等都属于全局资源;
  • 维护性活动:系统中的后台维护活动(例如带有垃圾回收的编程语言Java进行垃圾回收)也会造成延迟;
  • 排队:在多个层级上的排队会加重延迟活动。用户请求量达到一定程度时,数据库也有可能对用户连接或者用户请求进行排队后处理。
      作者认为,缓解大规模的在线服务中延迟的通用方法是将多个子操作分配给多个相同功能的组件进行并行处理。延迟波动可以通过严格控制资源、软件实时性设计和提高稳定性来缓解甚至消除。这个思路对于目前流行的分布式数据库(基于postgres 的开源数据库Greenplum、腾讯自研并商业化的分布式数据库TBase、阿里自研的 云原生数据仓库 AnalyticDB等)具有参考意义。
      参考文献[1] 讨论了在事务级别下查询语句的瞬时失效问题,作者指出解决瞬时失效问题也是数据库可用性的一种表现。我们都知道,在数据库内部,客户端的服务请求 分为3各阶段:
    1)服务器接受用户的发送请求SQL,根据任务的负载确定是否进入SQL队列进行等待;
    2)对SQL进行解析和查询优化,生成最佳执行计划,这意味着SQL即将被执行;
    3)事务开始,SQL进入执行器的执行阶段。
      后两阶段对于多个SQL会合并为一个阶段,即在一个事务内进行多条SQL的解析、查询优化和执行。

1.3 高可用事务

  Peter Bailis等人[4]总结了分布式体系下各种一致性(包括分布式一致性、事务一致性、事务的隔离界别)和高可用之间的关系,并分析了单调读、单调写、因果一致性等分布式一致性,见表1。在事务可用性(Transactional availiability)、和黏性事务可用性基础之上提出高可用事务(Highly Available Transactions) HAT概念,证明强一致性和100% 的可用性是不可兼得的,进一步表明CAP理论是正确的。
在这里插入图片描述
  作者对提出的事务与可用性相结合的概念如下:

  • 黏性可用性:从用户的角度看整个系统的可用性和事务之间的关系,在可容忍的时间内(设置超时机制检测),即使发生了分区或较长时延,用户依旧能够得到一个反馈,这样的可用性成为黏性可用性。
  • 事务可用性:从事务的角度出发,含有多副本的事务型数据库系统和可用性的关系,在可容忍的时间内(设置超时机制检测),即使发生了分区或较长时延,事务依然能够提交或者是回滚,我们成这为事务可用性;
  • 高可用事务:只要系统满足HAT的要求,就能够保证系统是高可用,也可以确保是事务型的。因此HAT是衡量一个分布式系统是否满足高可用、分布式一致性事务特性的指标。
      同时作者从隔离界别、原子性、持久性这三个角度分别探讨了其与HAT之间的关系。
      对于隔离界别,能够保证HAT语义的情况包括读未提交和读已提交这两种隔离界别,原因是这两者在分区或较长时延情况下,多副本的分布式事务能够保证读操作能够能正确满足。而可重复读、快照隔离隔离级别在分区或较长时延情况下,多副本的分布式事务不能保证写操作,即不能使丢失更新、写偏序操作正确实现
      对于原子性:在分布式系统中,原子性影响写操作结果对其他事务的可见性,这也被认为是一种特殊的隔离,称为MAV隔离。在MAV隔离级别中,如果事务T1能够影响的部分数据被到事务T2所见,则T1能够影响的所有数据都能被事务T2所见。即事务T2读取到事务T1所写的数据,则事务T2再次读取事务T1所写的数据不会有更新的值(能够读取到的数据便是最新值)。
      对于持久性:从用户角度出发,事务提交前要保证持久性,则必须保证有F副本失效前至少还有F+1个副本可用(满足多数派规则)。

1.4 高可用架构

  对于数据库系统,在单机数据库领域,通常采用主从架构实现数据库服务的高可用,如PostgreSQL、Oracle、Informix和SQL server等采用的都是基于物理文件级别的日志复制技术主备架构。PostgreSQL的基于流复制技术的主从架构,AWS的Aurora基于‘‘日志即数据库’(Log is database)’思路的存放分离、共享存储的一主多备架构和MySQL的基于逻辑复制复制技术的主从架构,都是早起数据库在高可用方面的经典案例。主从架构技术的数据冗余粒度在服务器一级,某个备机服务器挂掉会导致可用性降低,这是因为挂在新的备机需要从其他节点传输大量的数据到备机,导致备机的不可用时间变长;但如果采用逻辑复制的手段会因为效率低致使备机可用性降低。
  在分布式数据库中,节点级的高可用,也会采用主从复制的架构,例如腾讯自研的数据仓库TBase分布式数据库中全局事务管理器(GTM)配有一个备节点Standby,GTM掌管系统的全局事务,为每个事务分配全局事务号GXID,提供全局事务快照最为可见性判断的依据; 目前最流行的开源分布式数据库Greenplum的master节点配备有一个备节点Standby节点,master作为集群的入口,用于存储系统的元数据,同时接收来自客户端的SQL语句,进行语法解析,生成执行计划并向下数据节点Segment发送执行计划,Segment节点存放并管理实际数据,Segment节点间、master节点与Segment节点间通过高速网络进行通信交互,见图1(摘自greenplum官网)。
在这里插入图片描述
  在分布式数据库中,数据层与计算层的高可用,采用的是存算分离架构,使得数据层和计算层可独立进行缩扩容。存储层采用经典的共识协议多副本技术,在此基础之上还提供主副本写从副本可读的方式,进一步提高系统的可用性。计算层无状态性信息,使得计算层的可用性提高;也就是说启动新的计算层,加入集群后即可提供服务,这使得系统整体的可用性得以提高。
  相较于传统的主备方式,基于共识协议的数据冗余技术,其数据分成一个一个分区(Partition、Range等),以适配I/O块大小的方式传输。数据复制的粒度被细化这使得数据的复制可以通过并行的方式可以从不同的副本同时复制,这减少了备机上线的时间,进一步提高系统的可用性。

参考文献:
[1]:Baillis P, Davidson A, Fekete A, et al. Highly available transactions:Virtues and linmitation[R]. Hangzhou: VLDB, 2013:181-192.
[2]: 朱涛,郭进伟,周欢,等. 分布式数据库中一致性与可用性的关系[J]. 软件学报,2017(1) : 131-149.
[3]: Dean J, Barroso L A. The tail at scale[J]. Commun ACM, 2013,56(2): 74-80.
[4]: David F Bacon, Nathan Bales, Nico Bruno, et al. Spanner:Becoming a SQL System: In Proceedings of the 2017 ACM International Conference on Management of Data[R]. New York: SIGMODA, 2017.

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐