高可用设计-Design For Failure
高可用设计-Design For Failure

高可用设计-Design For Failure

一提起高可用设计,很多同学立刻就会想到“冗余设计”、“故障转移”等关键词。确实,在大部分与高可用相关的分享里,这两个词往往会被重点强调。

所谓“冗余设计”,是指要通过集群来替代单点服务,做好冗余备份。单点架构是高可用的大敌,“把鸡蛋放在不同的篮子里”是高可用最朴实、最有效的设计思路之一;“故障转移”则是为了缩短故障时间,保证故障发生时,业务可以快速恢复。

缺乏对高可用设计自顶向下的、比较通透的理解和认知,因而在实践中常常迷失在技术细节里,难以窥见架构的全貌。

解剖高可用设计

真正的高可用,是指实现所有元素、所有连接的高可用。只要一个元素或一个连接没有做高可用设计,都意味着风险的存在。

更准确地说,所谓高可用,是要保证“业务的连续性”,即在用户眼里,业务永远是正常(或基本正常)对外提供服务的。

没钱做 100% 的高可用设计,又想尽量提供系统的抗风险能力。作为架构负责人,应该怎么办呢?

第一个解决方案是,在风险爆发、系统出现问题的情况下,对外提供“降级服务”。

“降级服务”,是实打实的高可用保障手段。在用户眼里,业务是连续的,只是可靠性降低了。其实对于架构师而言,高可用和高可靠应该是两个不同的概念,只是很多人将其混为一谈。

在最理想的情况下,我们既保证高可用,也保证高可靠;但出现问题时,我们优先保证高可用,其次保证高可靠。

如果“降级服务”还解决不了问题,应该怎么办?答案是提供“熔断服务”,让出现 Bug 的模块从系统中“熔断”,虽然用户会看到单一系统报错,但整个业务依然是正常响应的,不会被一个系统的 Bug 拖死。

高可用意味着对系统全部元素、连接都进行高可用设计,在物理实例层面主要表现为冗余和集群设计,在代码逻辑层面,方法则多种多样。当你的资源和精力不足以实现全链路高可用时,提供“降级服务”和“熔断服务”,优先保证高可用,其次保证高可靠。

企业里面有些核心服务是不能降级的,对于这类服务,就一定要通过研发流程管理,确保服务的高可用、高可靠。一名合格的技术管理者,要能够识别核心服务,并引导团队重点关注。

高可用,不只是个“设计问题”

高可用设计真正的敌人是“变化”。

如果生产环境不发生变化 —— 不发布新版本、不修改配置文件、不修改数据库脚本,系统大概率会一直保持正常。

生产环境发布新版本就会成为一个影响巨大的变量,极有可能对系统的可用性造成挑战。

研发管理水平的高低,决定了你在版本发布方面的成功率和信心。

单就版本发布问题来说,你需要关注研发管理的三个关键点:

  1. 记录系统的任何一次发布和变化,包括发布系统 / 组件、发布时间等;确保自己可以随时定位任何一个时间段内的任何元素及任何发布动作,包括但不限于代码、配置文件、SQL 脚本、设备参数修改等;
  2. 发布时不影响业务;
  3. 保证任何发布都可以回滚。尤其当一个大版本的发布时,能否精确识别回滚单元,并做到秒级回滚。

总是回退也不是办法。作为一个研发组织,我们还可以从另外一个角度,提高系统的抗风险能力。

风险是经由开发环境、SIT 环境、压测环境、PRE 环境,进入生产环境的。所以我们要做的,是严格检查各个环境下的异常,研发管理规范,应该为代码版本进入下一个环境设置准入标准,对于任何异常,都有负责人进行修正。如果异常通过了评估,审核者要对其负责。

系统 Bug 在导致生产故障前,也往往会有各类异常,我们要做好监控并正式的处理掉它。

在极少数情况下,一个严重 Bug 会藏在生产环境里,始终没有触发。但当它被触发时,可能就会导致生产环境“暴毙”。对于这种情况,一旦碰到了,某种程度上就要认命。我一直讲,人生,运气也很重要,非常重要。如果已经尽全力了,还是出现了问题,要学会接受自己,承认自己的运气不好,将这当作是成功路上的经验、教训,这才是真正的成长性思维。拒绝不完美,渴望成长,当然很棒,但很多心理问题的源头也在这里,要学会接受自己。

开源软件其实是存在一定风险的。但开源软件依然代表了软件研发行业的一种主要潮流,毕竟你免费用了人家的软件那么久,有些许风险不是很正常吗?所以我依然允许团队向生产系统引入开源代码。只是要求:引入开源代码的技术人员,必须通读并掌握其代码。

关键在于要注意,真正的、为业务负责的高可用设计,不是画框图就能解决的,它是一个面向 IT 组织的整体设计。

结语

高可用设计,意味着“Design For Failure”,最重要的是让我们做产品没有后顾之忧。如果后院天天起火,研发团队每天胆战心惊,也就无从谈起“将产品打磨至卓越”了。所以,做好高可用,一定程度上就是在实践“慢就是快”的认知理念。

虽然我们或许不能保证所有服务高可靠,但我们是可以保证所有服务高可用的。其关键点在于,面向所有的元素和连接,都要做设计。任何没有被设计过的元素和连接,往往都是不可靠的。

任何一个要达到的目标,都要被量化;任何一个量化的目标,都是一个契约,要有契约精神;任何一个契约,都要进行设计。没有设计的内容,怎么可能如你所愿呢?

发表评论

邮箱地址不会被公开。