最近互联网故障频发,单是导致服务器瘫痪或服务无法正常进行的就有携程官网、支付宝以及网易的一系列产品等。虽然其官方各有解释,但从运维的角度看在每一次故障发生的时候,其实都是伤害用户,内部的表述就是可用性或者质量。因此我们必须要足够的重视,更需要我们把它变成宝贵的经验。那到底什么是可用性和可靠性?影响可用性的因素有哪些?运维又应该如何提高可用性?
+ c/ _2 P! k+ Q. m; s
一.什么是可用性和可靠性 , N: u% ~; X5 ~8 c) ?- d0 I
可靠性是在给定的时间间隔和给定条件下,系统能正确执行其功能的概率。可用性是指系统在执行任务的任意时刻能正常工作的概率。先来看一些指标定义: ; U, J# z, z) }6 A
1.MTBF——全称是Mean Time Between Failure,即平均无故障工作时间。就是从新的产品在规定的工作环境条件下开始工作到出现第一个故障的时间的平均值。MTBF越长表示可靠性越高正确工作能力越强 。
# ]$ R. {; N/ w# m U! \+ N
2.MTTR——全称是Mean Time To Repair,即平均修复时间。是指可修复产品的平均修复时间,就是从出现故障到修复中间的这段时间。MTTR越短表示易恢复性越好。
& [$ \0 x3 o6 W, t
3.MTTF——全称是Mean Time To Failure,即平均失效时间。系统平均能够正常运行多长时间,才发生一次故障。系统的可靠性越高,平均无故障时间越长。
* C& @! @: S3 r# g7 b$ Y& l# z# b
可用性Availability = MTBF / (MTBF + MTTR),一般我们都是用N个9来表达系统可用性,用宕机时长来说更好理解,如果以全年为周期(24*365=8760个小时),3个9(99.9%)就意味着全年宕机时长是525.6分钟,4个9(99.99%)是52.6分钟,5个9(99.999%)是5分钟。 ' G+ Y! U1 N3 S$ x# ^
从这些时间指标上可以反向去推导IT能力不足的地方,比如说一个故障恢复时间很长,一定是自动恢复、运维意识、处理过程、系统架构等地方不对,导致了这个宕机时间过长,平均失效时间短,一定是系统的可靠性出了问题,找技术设计的问题,找依赖的硬件环境问题等等。 1 A4 m; r; E6 C
二.影响可用性的因素 - J6 b8 B4 g7 Q) @
影响可用性的因素非常的多,但是可以从几个维度去看,人与组织、流程、技术和业务管理等四个维度。
5 l* ^# P- `" b) l7 X8 O/ C
1.人与组织 4 B ] t4 g, z0 |7 t
其实这个地方可以谈谈你的人和组织类型了,领导是否重视IT?是否重视运维?组织是否已经认识IT带来的价值,把IT当作自己的一个核心能力来看待?是否把面向用户的业务能力和IT能力很好的对接?是否建立起用户质量的组织文化?等等。 7 N& n$ ~( P0 h, ~ g2 Q1 K6 ?' s
2.流程
- K8 C9 G% O2 E; Y( L
流程是梳理多个角色自己的关系和职责。我们第一个要去看这个流程在面对故障的是否起到了积极的作用,比如说能够确保故障信息的准确送达,同时保证处理人的角色和职责是清晰的。其次不断去检查流程是否可以自动化驱动,而非人为驱动。人是不可靠之源!我们最终希望形成是一个自动化、标准化的流程,这样的流程不容易被异化,且能保证预期执行结果一致。 % c, t- a& L" S
3.技术 : h& E# d" W% s$ y0 `
很多时候大家看到的技术是运维技术,其实恰恰相反对于互联网业务来说,对其高可用的影响,必然是业务IT技术架构,因此在其中需要遵循很多原则,有一些原则需要有普适的参考价值。比如说服务降级、灰度发布、过载保护、服务公共化等等。这些方法论是否已经融入到研发和运维的架构设计哲学之中?现实是产品功能需求优先,而非可运维性优先,可运维性最终就是业务的质量。
; {2 ]/ ]; N3 c7 y
4.业务管理
( }) P% i" h9 P: t( G
把你的IT能力最终业务能力看板化,你可以转换成我们多个业务指标,比如说质量、可用性、用户体验、用户满意度、成本等等,有了这些业务导向性指标,才能把IT能力和业务更好的对接起来。否则很容易在组织内,形成“IT是支撑部门”认识,而非创造价值部门。这一点还有一个重要性,就是让IT部门也要足够的认识到,他们的能力直接和业务相关,需要增强业务敏感度。
" g% z/ T& v! b1 p% R" p$ g
三.如何提高系统的可用性 * O N7 Z% F8 C. f$ b- H
刚刚上面讲到了影响可用性的因素,分成了四个方面,但我想提高系统的可用性从另外一个角度来描述,能把握一些核心准则(其实还有更多)。
5 z+ R3 j* D) W2 Q( A
1.故障发生前,建立运维质量仪表盘 8 Y& X6 V# _4 N0 @+ z
我们一定要建立运维数据看板,这个看板的数据并且要在业务、研发、测试和运维达成一致,让大家足够重视这份数据,这样数据便有了推动力。建议这个地方的核心数据指标不要太多,因为涉及到多个团队,大家不能够一致理解,特别是传达到管理层,太多的指标,容易失去关注的焦点。 4 ~, s1 e7 ?7 p$ p, U' G; t. x
通行的做法,就是用可用性来做运维的数据看板。可用性的计算方法有简单的方法,也有复杂的方法。简单的方法就是在监控系统中搞一些探针来模拟用户监控,最后我们能得出故障的时长和可用性的时间,这样我们可以建立每天、每周、每月、每Q的可用性,可以做到分业务、分服务(更细粒度)等等;复杂的方法在模拟数据的基础上,可以把事件系统记录的时间数据拿过来作为评估的标准。另外可以把可用性上升到质量层面,这个里面涉及到的评估维度(成本、用户体验、满意度)就更多了,数据获取的来源也变得更多,有些是来自于客服系统,有些是来自于舆情监控,有些是来自于运维容量系统,有些是来自于事件系统等等,不过最终呈现的指标就是一个---质量。 4 }% z- _9 x K& f) }
运维的数据看板,最好能变成产研侧KPI的一部分,同时在运维和研发侧,需要周期性的把这份数据推送到他们面前。有了KPI,同时有了持续滚动机制,一定能建立起很好的业务质量意识。一直觉得,数据文化,是运维能够建立影响力的重要一步,否则你就是一个支撑的支撑部门。 - |" ]) Z: ]7 ^: b- Z
2.故障发生前,设定技术准则和要求 , \- a# H6 |0 Z l' B8 B: ?: i: W/ r
运维需要和研发建立整体的技术标准和规范要求,这块是腾讯做得非常好的地方,把海量服务提炼成多个关键词【海量服务运营之道】,网上可以搜索到。当然这些关键词对于很多企业来说,想理解准确,也会非常的困难。因此从运维的角度来说,我们需要设定一个路线图,最终服务于这个技术目标。比如说之前我提到的【运维三部曲】里面讲到了先做标准化(修炼运维内功),然后做公共服务化(修炼架构内功)、最终服务无状态化(修炼业务内功)。
0 S; ?! ?9 g' E5 W; N2 s
运维一定要把标准化作为核心要务来推进,建立标准化的运维环境,建立标准化的技术栈(和研发确定),建立标准化的高可用方法论,最终这个业务的可用性一定是有保证的。
9 n- G. p* j4 K) e n0 g
3.故障发生时,恢复是第一要务 & Q: `; I* l8 ^! d+ i% r8 B/ V
故障发生的时候,“恢复、恢复、恢复”必须是运维人脑子里面要时刻记住的。
9 H4 N+ R! }' Y! n! E2 X; ~
在故障的当下,定位故障原因是大忌,这往往让故障时长变得不可控,因为会直接影响MTTR(平均修复时间),影响用户的业务使用。不过有人会有疑问,不知道故障原因怎么知道如何解决?从经验来看,你一定有一些简单粗暴的原则去隔离故障,比如说服务器重启,链路禁用,DNS切换等等。 9 T0 h# e; H& }0 J3 ~
4.故障发生后,仔细的复盘 % }/ M! C+ i" {. V5 |$ _6 v
每一次故障发生后,运维人需要牵头去复盘故障,刚刚说了我们恢复是第一要务,所以故障的根本原因我们可能还不知道,此时就需要运维、测试和研发一起仔细的去看整个的故障过程,看看到底哪儿有什么问题?基本上也是从刚才说的四个方面来评估。不断的审视我们运维的能力和IT的能力,说“故障是运维最好的老师”的原因也在于此,它能够不断驱使我们走向更高的成熟度。
: k7 c: z# S+ f* r! b. ]- H) i& O
运维是复盘的首要负责人,复盘是为了找到根因(Root Cause),根因和故障现象不同,举个例子,故障现象是交换机故障,根因是因为技术架构没有对交换机故障做到容错,根因是运维对这种故障缺乏有效的临时应对机制。复盘是为了让我们走向更好的运维阶段。
9 |7 ~, Y4 E+ v6 h% q" V
5.故障发生后,复盘措施有讲究
( G" l3 [0 J$ O% V6 ?0 j- G1 i( Z
故障复盘后,我们一定会写改进措施,对于这些改进措施,还是有些讲究的,看过一些故障报告,非常的不合要求。我个人的经验如下:
% b8 X" _7 x( ]- V$ w7 Z
故障的措施必须是可落实,且具体的,要落实到具体的负责人,具体的时间。
' X+ z8 v( ?: E/ E5 N* V! F2 }$ W
故障的措施优先是必须技术的,然后是流程,最后是人的。
+ a7 K5 ~9 [/ J. M+ }* a W8 H& R
故障的措施可以分为长期措施和临时措施。
/ c# C( j) V b% h; {& ]0 z$ I9 j
故障的措施一定要仅仅扣住故障的根因,避免流于形式和表面。
: ~* A7 l7 X6 O* T7 f$ b
故障的措施切忌“亡羊补牢”式的,需要全面细致的分析。
# T9 J; D9 F0 H& h
故障的措施一定要保证后续的持续跟进。
. ~& ~# {9 C6 M9 C6 y
一叶可以障目,但也可以一叶知秋,就看我们是否真的去认真对待。你们真的重视故障了么?你们真的重视运维了么?故障不能带来运维人的春天,从根本上去意识到运维的重要性,那才是运维人真正的春天。 ' }8 U' E: R0 ?& I! c9 C! w/ }& ^) f; V
|