题主问题有意思,要玩转数据库高可用可不是件简单的事情。简单地说就是,数据库高可用的关键是多副本如何保证一致性,而Paxos共识算法则正好可以玩转多副本一致性。
具体将来,还是先从数据库高可用性说起。
高可用英文翻译为“High Availability”,从字面上理解就是要做到服务的full-time的持续可用,但老实说,要做到full-time是不现实的,因为能够影响系统服务可用性的因素实在是太多了,除了软件BUG、硬件故障外还包括系统所依赖的一些第三方服务(如运营商提供的带宽),甚至还包括天灾人祸等。
我理解的所谓高可用意味着“更少的停服时间”,而工业界也有一套测量系统可用性的标准,即大家所熟知的SLA(Service Level Agreement),也就是几个9的可用性(如下表):
在工业应用场景中,如当下提供在线服务的各大互联网公司,号称7*24小时的不间断服务,想想如果只是达到一个99%的可用性将会是一种什么样的灾难。而要做到5个9的可用性就意味着全年只能有一次服务宕机,而且得在5分钟左右就恢复,其中的难度也是不言而喻的。只是采用技术手段是不足以做到,还需要通过一整套完备严谨的工程管理及相关配套工具、专业运维人员严谨的工作等。
高可用数据库关键技术点
数据库服务和很多工业服务在高可用技术方案是相通的,为了实现高可用首先实现服务的“冗余”,即服务的集群化。如果服务有冗余备份,宕机后还有其它备份服务(热备和冷备)可以使用,所以实现数据库服务的“冗余”也是高可用数据库的核心准则。
而有了“冗余”备份后还不够,如果每次宕机都需要人工恢复切换至备份服务,恢复时间得不到保证,同时人为的故障恢复过程中可能会引入新的风险(人为事故),从而降低了服务的可用性,因此必须还具备“自动故障转移”功能。
而数据库服务相比于其它系统的高可用,在以上两个关键技术点的实现上会更加的困难,因为传统RDMS对数据和事务的持久性和稳定性是要求非常高的,从也提高了对冗余数据的一致性的要求和实现难度。
基于Paxos分布式一致性协议的方案
Paxos协议主要以多数派投票的方式来就分布式系统中某个值达成一致,该算法被业界认为唯一的分布式一致性算法,包括其在内衍生出来的分布式一致性算法(如Raft等),也在很多肯多开源分布式系统得到应用。Paxos与MySQL相结合可以实现在分布式的MySQL数据库最终一致性从而保证高可用,而使用分布式算法用来解决MySQL数据库数据一致性的问题的方法,也越来越被人们所接受,一系列产品如PhxSQL、MariaDB Galera Cluster、Percona XtraDB Cluster等越来越多的被应用到生产环境,而最近Oracle官方所推出的MySQL Group Replication的GA,更使其在MySQL高可用领域成为了一种民用技术。因此使用分布式协议和多副本来解决数据库一致性问题已经成为了主流的方向。