NAV
所在位置:首页 > 最新动态 > 

老司机眼中的高可用

1970-01-01

老司机眼中的高可用:「英方周末」第十九期


导语

“高可用”是英方的永久命题,因此,在提供高效的解决方案的同时,我们也希望在浩如烟海的理论中找到那些睿智、闪亮的观点。本期,我们转载了陈皓(曾就职于Amazon中国、阿里等公司)先生的一篇关于高可用的文章,内容较长,我们现在开始。

 

在之前的文章中,我讲述了我这么多年来一直在关注的技术领域,其中我多次提到了工业级的软件,我还以为有很多人会问我怎么定义工业级?以及一个高可用性的软件系统应该要怎么干出来?这样我也可以顺理成章的写下这篇文章,但是没有人问,那么,我只好厚颜无耻的自己写下这篇文章了。哈哈。

 

另外,我在一些讨论高可用系统的地方看到大家只讨论各个公司的技术方案,其实,高可用的系统并不简单的是技术方案,一个高可用的系统其实还包括很多别的东西,所以,我觉得大家对高可用的系统了解的还不全面,为了让大家的认识更全面,所以,我写下这篇文章。

 

 

理解高可用系统

 

首先,我们需要理解什么是高可用,英文叫High Availability,基本上来说,就是要让我们的计算环境(包括软硬件)做到full-time的可用性。在设计上一般来说,需要做好如下的设计:

1、对软硬件的冗余,以消除单点故障。任何系统都会有一个或多个冗余系统做standby;

2、对故障的检测和恢复。检测故障以及用备份的结点接管故障点。这也就是failover;

3、需要很可靠的交汇点(CrossOver)。这是一些不容易冗余的结点,比如域名解析,负载均衡器等;

 

听起似乎很简单吧,然而不是,细节之处全是魔鬼,冗余结点最大的难题就是对于有状态的结点的数据复制和数据一致性的保证(无状态结点的冗余相对比较简单)。冗余数据所带来的一致性问题是魔鬼中的魔鬼:

  • 如果系统的数据镜像到冗余结点是异步的,那么在 failover 的时候就会出现数据差异的情况。

  • 如果系统在数据镜像到冗余结点是同步的,那么就会导致冗余结点越多性能越慢。

 

所以,很多高可用系统都是在做各种取舍,这需要比对着业务的特点来的,比如银行账号的余额是一个状态型的数据,那么,冗余时就必需做到强一致性,再比如说,订单记录属于追加性的数据,那么在 failover 的时候,就可以到备机上进行追加,这样就比较简单了(目前一些企业所谓的异地双活其实根本做不到状态型数据的双活)。

 

下面,总结一下高可用的设计原理:

  • 要做到数据不丢,就必需要持久化;

  • 要做到服务高可用,就必需要有备用(复本),无论是应用结点还是数据结点;

  • 要做到复制,就会有数据一致性的问题;

  • 我们不可能做到 100% 的高可用,也就是说,我们能做到几个9个的SLA。

 

高可用系统的技术解决方案

 

 

 

我曾在文章中引用过下面这个图:这个图来自来自:Google App Engine 的 co-founder Ryan Barrett 在 2009 年的 Google I/O上的演讲《Transaction Across DataCenter》(视频: http://www.youtube.com/watch?v=srOgpXECblk

\

这个图基本上来说是目前高可用系统中能看得到的所有的解决方案的基础了。M/S、MM 实现起来不难,但是会有很多问题,2PC的问题就是性能不行,而Paxos的问题就是太复杂,实现难度太大。

 

总结一下各个高可用方案的的问题:

  • 对于最终一致性来说,在宕机的情况下,会出现数据没有完全同步完成,会出现数据差异性。

  • 对于强一致性来说,要么使用性能比较慢的XA系的两阶段提交的方案,要么使用性能比较好,但是实现比较复杂的 Paxos 协议。

 

注:这是软件方面的方案。当然,也可以使用造价比较高的硬件解决方案,不过本文不涉及硬件解决方案。

 

另外,现今开源软件中,很多缓存,消息中间件或数据库都有持久化和Replication的设计,从而也都有高可用解决方案,但是开源软件一般都没有比较高的SLA,所以,如果我们使用开源软件的话,需要注意这一点。

 

 

高可用技术方案的示例

 

下面,我们来看一下 MySQL 的高可用的方案的 SLA(下图下面红色的标识表示了这个方案有几个9):

\

图片来源:MySQL High Availability Solutions

简单解释一下 MySQL 的这几个方案(主要是想表达一个越多的 9 就越复杂):

 

  • MySQL Repleaction 就是传统的异步数据同步或是半同步 Semi-Sync(只要有一个 slave 收到更新就返回成功)这个方式本质上不到 2 个9;

  • MySQL Fabric 简单来说就是数据分片下的M/S的读写分离模式。这个方案的的可用性可以达到 99%;

  • DRBD 通过底层的磁盘同步技术来解决数据同步的问题,就是 RAID 1——把两台以上的主机的硬盘镜像成一个。这个方案不到 3 个9;

  • Solaris Clustering/Oracle VM ,这个机制监控了包括硬件、操作系统、网络和数据库。这个方案一般会伴随着节点间的“心跳机制”,而且还会动用到 SAN(Storage Area Network)或是本地的分布式存储系统,还会动用虚拟化技术来做虚拟机的迁移以降低宕机时间的概率。这个解决方案完全就是一个“全栈式的解决方案”。这个方案接近 4 个9;

  • MySQL Cluster 是官方的一个开源方案,其把 MySQL 的集群分成 SQL Node 和 Data Node,Data Node 是一个自动化 sharing 和复制的集群 NDB,为了更高的可用性,MySQL Cluster 采用了“完全同步”的数据复制的机制来冗余数据结点。这个方案接近5 个9;

 

那么,这些 2个9,3个9,4个9,5个 9 是什么意思呢?又是怎么来的呢?请往下看。

 

高可用性的SLA的定义

 

上面那些都不是本文的重点,本文的重点现在开始,如何测量系统的高可用性。当然是SLA,全称 Service Level Agrement,也就是有几个 9 的高可用性。

 

工业界有两种方法来测量 SLA,一个是故障发生到恢复的时间,另一个是两次故障间的时间。但大多数都采用第一种方法,也就是故障发生到恢复的时间,也就是服务不可用的时间,如下表所示:

 

\

比如,99.999% 的可用性,一年只能有 5 分半钟的服务不可用。感觉很难做到吧。

 

就算是3个9的可用性,一个月的宕机时间也只有40多分钟,看看那些设计和编码不认真的团队,把所有的期望寄托在人肉处理故障的运维团队, 一个故障就能处理1个多小时甚至2-3个小时,连个自动化的工具都没有,还好意思在官网上声明自己的SLA是3个9或是5个9,这不是欺骗大众吗?

 

 

 

上一篇:云灾备的起源,发展和行业实践

下一篇:五仁月饼是怎么来的?