高可用系统设计精要: 定个能达到的小目标,比如先读完本文

在《这多年来我一直在钻研的技术》(http://coolshell.cn/articles/17446.html)这篇文章中,我讲述了一下,我这么多年来一直在关注的技术领域,其中我多次提到了工业级的软件,我还以为有很多人会问我怎么定义工业级?以及一个高可用性的软件系统应该要怎么做出来?这样我也可以顺理成章地写下这篇文章,但是没有人问,那么,我只好厚颜无耻地自己写下这篇文章了。哈哈。

 

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

 

理解高可用系统 
 

首先,我们需要理解什么是高可用,英文叫High Availability(Wikipedia词条),基本上来说,就是要让我们的计算环境(包括软硬件)做到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,这不是欺骗大众吗?

 

影响高可用的因素 
 

老实说,我们很难计算我们设计的系统有多少的可用性,因为影响一个系统的因素实在是太多了,除了软件设计,还有硬件,还有每三方的服务(如电信联通的宽带SLA),当然包括“建筑施工队的挖掘机”。所以,正如SLA的定义,这不仅仅只是一个技术指标,而是一种服务提供商和用户之间的contract或契约。这种工业级的玩法,就像飞机一样,并不是把飞机造出来就好了,还有大量的无比专业的配套设施、工具、流程、管理和运营。

 

简而言之,SLA的几个9就是能持续提供可用服务的级别,不过,工业界中,会把服务不可用的因素分成两种:一种是有计划的,一种是无计划的。

 

无计划的宕机原因

 

下图来自Oracle的 《High Availability Concepts and Best Practices》

 

 

有计划的宕机原因

 

下图来自Oracle的 《High Availability Concepts and Best Practices》

 

 

我们可以看到,上面的宕机原因包括如下:

 

无计划的

  • 系统级的故障 –  包括主机、操作系统、中间件、数据库、网络、电源以及外围设备;
  • 数据和中介的故障 – 包括人员误操作、硬盘故障、数据乱了;
  • 还有:自然灾害、人为破坏、以及供电问题。

 

有计划的

  • 日常任务:备份,容量规划,用户和安全管理,后台批处理应用;
  • 运维相关:数据库维护、应用维护、中间件维护、操作系统维护、网络维护;
  • 升级相关:数据库、应用、中间件、操作系统、网络、包括硬件升级。

 

真正决定高可用系统的本质原因 
 

从上面这些会影响高可用的SLA的因素,你看到了什么?如果你还是只看到了技术方面或是软件设计的东西,那么你只看到了冰山一角。我们再仔细想一想,那个5个9的SLA在一年内只能是5分钟的不可用时间,5分钟啊,如果按一年只出1次故障,你也得在五分钟内恢复故障,让我们想想,这意味着什么?

 

如果你没有一套科学的牛逼的软件工程的管理,没有牛逼先进的自动化的运维工具,没有技术能力很牛逼的工程师团队,怎么可能出现高可用的系统。

 

是的,要做出高可用的系统,这就是一套严谨科学的工程管理,其中包括但不限于了:

 

  • 软件的设计、编码、测试、上线和软件配置管理的水平
  • 工程师的人员技能水平
  • 运维的管理和技术水平
  • 数据中心的运营管理水平
  • 依赖于第三方服务的管理水平

 

深层次的东西则是——对工程这门科学的尊重:

 

  • 对待技术的态度
  • 一个公司的工程文化
  • 领导者对工程的尊重

 

所以,以后有人在你面前提高可用,你要看的不是他的技术设计,而还要看看他们的工程能力,看看他们公司是否真正的尊重工程这门科学。

 

其它 
 

有好些非技术甚至技术人员和我说过,做个APP做个网站,不就是找几个码农过来写写代码嘛。等系统不可用的时候,他们才会明白,要找技术能力比较强的人,但是,就算你和他们讲一万遍道理,他们也很难会明白写代码怎么就是一种工程了,而工程怎么就成了一门科学了。其实,很多做技术的人都不明白这个道理。

 

包括很多技术人员也永远不会理解,为什么要做好多像Code Review、自动化运维、自动化测试、持续集成之类这样很无聊的东西。就像我在《从Code Review 谈如何做技术》(http://coolshell.cn/articles/11432.html)中提到的,甚至在阿里的很多技术人员都没有这个意识,当然,这不怪他们,因为经历决定思维方式,他们经历的是民用级的系统,做的都是堆功能的工作,的确不需要。

 

看完这些,最后让我们都扪心自问一下,你还敢说你的系统是高可用的了么? 


时间: 2024-07-29 14:14:48

高可用系统设计精要: 定个能达到的小目标,比如先读完本文的相关文章

浅谈数据中心高可用网络系统设计

数据中心的故障类型众多,但故障所导致的结果却大同小异.即数据中心中的设备.链路或server发生故障,无法对外提供正常服务.缓解这些问题最简单的方式就是冗余设计,可以通过对设备.链路.Server提供备份,从而将故障对用户业务的影响降低到最小.但是,一味的增加冗余设计是否就可以达到缓解故障影响的目的?有人可能会将网络可用性与冗余性等同起来. 事实上,冗余性只是整个可用性架构中的一个方面.一味的强调冗余性有可能会降低可用性,减小冗余所带来的优点,因为冗余性在带来好处的同时也会带来一些如下缺点: w

基于Nginx和Consul构建高可用及自动发现的Docker服务架构

本文讲的是基于Nginx和Consul构建高可用及自动发现的Docker服务架构[编者的话]本文对于Docker和Consul Template以及Nginx如何结合使用做了较为详细的介绍. [上海站|3天烧脑式微服务架构训练营]培训内容包括:DevOps.微服务.Spring Cloud.Eureka.Ribbon.Feign.Hystrix.Zuul.Spring Cloud Config.Spring Cloud Sleuth等. 导读 如果你在大量接触或使用微服务的话,你可能会碰到一个问

高可用的大数据计算平台如何持续发布和演进

2016年11月18-20日SDCC 2016中国软件开发者大会,阿里巴巴大数据计算平台首席架构师林伟给我们带来了"高可用的大数据计算平台如何持续发布和演进"的演讲.本文主要谈及大数据系统如何做系统迭代,以及大规模系统因为其大规模没有可能搭建对等的测试环境,需要进行在线测试方面的内容,更有在线测试需要的必要条件等等. 阿里巴巴大数据计算平台需要每天不间断的跑在上万台机器集群上,上面承担阿里核心分析计算任务,有着很高的可靠性和SLA的要求,但是我们同时需要持续不断提高系统的性能,降低成本

《Cisco IOS XR技术精要》一2.7 高可用架

2.7 高可用架构 Cisco IOS XR技术精要Cisco IOS XR是一款模块化的网络操作系统,在设计之初考虑进了故障控制和故障恢复功能,其主要目标是控制.管理,以及从任何潜在故障中恢复的能力.在一款复杂的系统中,如运行IOS XR的平台上,即便在系统开发时使用了最优的设计.研发及测试规范,软件bug和硬件故障也是无法避免的.IOS XR高可用软件和硬件设计思想是将各种类型的软硬件故障预先定义出来,当故障发生时,使用影响最低的恢复机制从故障中恢复系统,从而将故障对系统造成的影响降至最低.

架构之坑系列1:重构中的过度设计与高可用银弹

这是一个坑系列,会说一些在系统设计.系统架构上的坑,这些都是我想到哪说到哪,有像这篇一样比较宏观的坑,后面的文章也会有到具体技术细节的(比如某个函数,某个系统调用)坑.总之,到处都是坑,这些坑有些是我经历过的,有些是听说的,你也可以留言说说你遇到的坑.   第一部分,我们从重构这个场景来看看系统架构的设计中过度设计这个坑.首先,我们这里说的重构,和<重构:改善既有代码的设计>这本书中的重构不太一样,这是本好书,他主要说的是代码级别的重构,这种重构是需要在编码的时候时时刻刻进行的,更多的是一种编

来自 Google 的高可用架构理念与实践

在 Google 我参与了两个比较大的 Project. 第一个是 YouTube,其中包括 video transcoding,streaming 等.Google 的量很大,每个月会有 1PB 级别的存储量.存储.转码后,我们还做 Global CDN.到 2012 年的时候,峰值流量达到 10 TBps,全球 10 万个节点,几乎每台机器都是 16/24 核跑满, 10G uplink 也是跑满的状态. 然后我加入了 Google Cloud Platform Team, 也就是 Borg

《高可用架构·中国初创故事(第3期)》一来自Google的高可用架构理念与实践

来自Google的高可用架构理念与实践 CTO @ coding.net .2007 - 2015 年初在 Google 的 Moutain View 担任 SRE (Site Reliability Engineering)职位. 参与了 Google 的两个项目:第一个是 Youtube,工作内容涵盖 Video transfer.Coding.Streaming.Global CDN 等:第二个是 Google Cloud Platform Team,主要工作是管理 Google 全球 1

海量存储之十八--一致性和高可用专题

我们已经在上面的分析中,我们已经看到observer模型在多机场景下的问题,所以,paxos模型的目标就是解决这个问题,他解决这个问题的方法就是quorum模型. 我的目标是让大家能弄明白,掌握这些复杂的概念,所以我也会将以前我在淘宝java中间件团队内分享时候,大家经常犯的一些错误,也写到[]里面,尽可能让大家少走弯路,如果有什么感想,疑问,后面可以留言. PS 广告插播 : 淘宝java中间件团队,你值得拥有:) ----PAXOS------ 好,我们回顾一下上下文,我们在上篇文章中谈到,

Nginx+Keepalived实现站点高可用

公司内部 OA 系统要做线上高可用,避免单点故障,所以计划使用2台虚拟机通过 Keepalived 工具来实现 nginx 的高可用(High Avaiability),达到一台nginx入口服务器宕机,另一台备机自动接管服务的效果.(nginx做反向代理,实现后端应用服务器的负载均衡)快速搭建请直接跳至 第2节. 1. Keepalived介绍 Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat.corosync.p