实例学架构设计之可用性陷阱

要点:

1可用性是系统能够返回合理结果的能力

2 可用性随着流量的增加而不断降低

3 硬件的故障同样时系统可用性炸弹

5 冗余机制是提升可用性的唯一办法

4 提升可用性的过程也是增加系统复杂度的过程

 

上一篇文章我们讲到系统复杂产生的一个主要来源是可用性。那么什么是系统的可用性呢?这个来自于用户在使用系统直观感受,比如系统经常弹出的莫名错误,经常莫名的死机退出,用户就会说系统真难用,如果系统反应灵敏,返回结果正确,用户则会说这个系统好用,来自与具体的技术统计 比如说异常率,出错率,反应时间等。总的来说系统的可用性是指系统返回合理结果的能力,这里的合理结果也包括合理的错误信息。为什么这么说呢?这是因为我们的系统永远都不能保证100%运行正常,总会有bug隐藏在某个角落等待爆发,如果出现了异常,系统能够给出合理错误提示,让用户明白现在系统正在发生着什么,这也不能说系统不可用,当然某些严重的错误除外,他们很有可能直接使系统拒绝服务。

按常理理解一个能够运行的系统都是可用的,那为什么他会成为系统的一大难题呢?原因就在于系统运行时的流量。在系统运行的过程中,随着业务的发展,使用系统的人也越来越多系统就会频繁的处理各种请求,局限于系统部署的硬件环境和软件环境系统中隐藏的问题就暴露出来了,比如反应时间长,返回连接超时,多线程死锁等问题。这样系统的可用性就大大降低了,用户的体验也就自然而然的不好了。

除此之外 ,系统硬件的问题更犹如一颗深水炸弹,不知道啥时候爆炸,一旦发生硬件故障影响也是那对可用性的影响是毁灭性的。比如网络故障了,系统正在传输的数据瞬间中断,那这部分数据无法到达目的地也就无法进行加工和存储最终可以造成业务出现混乱。再比如数据库硬盘故障,那就是业务数据的物理性丢失,基本上无法恢复,这对公司来说是毁灭性的,前一段时间由于腾讯云的硬盘集群问题导致某论坛数据全部湮灭的事件更是让人不寒而栗。

前面说了这么多,那有没有什么办法能保证系统的可用性?答案是肯定的,那就是冗余。我们知道系统有两部分组成一部分是程序,另一部分是数据,要保证其可用性首先就是要保证他们运行环境的可用,程序的运行环境是什么 ?就是计算能力嘛,CPU,内存,数据的运行环境当然对应到了计算机存储设备上。对于单机来说我们可以加内存,加存储,加CPU,让他的性能达到极限,这样就可以让系统能够再单机运行中更加稳定,反应更加敏捷。但是单机的部署始终是有他的天花板的,CPU运算速度再快也有不能无限提升,硬盘再大也扛不住海量数据,更不用说单机在发生物理故障时的脆弱性了,所以为了保证系统的可用性就得加机器,加机器不仅可以带来计算能力的提升,而且可以带来存储能力的提升,也就是鸡蛋不要放在同一个篮子里。

既然加机器就能解决问题,那为了系统能够得到高可用,我们就无限加机器就好了呗。其实并不尽然,首先来说我们的成本并不是无限的,老板们恨不得一块钱当成8块使怎么能让你在那里撒欢挥霍呢?最重要的是我们的再加机器的同时也带来新的系统复杂度,加机器并不是1+1=2的简单运算,而是打开的潘多拉魔盒。为啥这么说呢我将示例具体说明

 我们首先看一个系统的单机架构如下图:

在这个架构只有一个业务服务器,一个数据库服务器,这种架构在我们公司内部经常使用,主要场景是用于开发和测试,如他的单一节点所示的那样如果应用到高流量的环境下基本上是不堪一击的。为了增加其可用性我们需要跟他增加冗余,首先我们加一个业务服务器如下图

我们的确增加了一个业务服务器,但是我们同时也增加了一个新的设备叫任务分配器,故名思意他干的是的给业务服务器分配任务的活。为啥需要这台设备呢?因为我们的系统对外最好提供一个统一的入口这样才能方便用户访问,我记住一个地址总比记住两个地址容易多了,其次有了这台设备我们可以保障每台服务器都不会超过他的最大承受能力来。那么这两台设备产生的复杂的问题也随着增加这台任务服务器来了,既然是分配任务那么怎么保证每次都能命中压力最小的呢?具体任务如何分配呢?如果一台服务器坏掉了任务分配器如何得知呢?如何保证session的一致性呢我们每次登陆时都要登陆两遍吗 ?那如果有多个服务器时难道还要登陆N遍?如果真是如此那真是逆天的操作。对于这些问题在技术层面上已经不是问题比如应对如何分配任务的问题,分配服务器就有轮询,IP Hash两种算法,这两种算法一个时挨着服务器的发放请求,一个则是将相同IP地址的请求分配到同一台机器上 但是我们必须得做出正确的选择,以保证系统能够更好的运行他的功能。

我们才加了一个业务服务器就引来这么多的复杂性问题,如果再加个数据库的化,需要解决的问题会更多,问题处理起来就更加棘手,那我们如何才能找到适合系统可用性的架构呢?方法说简单也简单,说复杂又复杂,具体要看我们业务的具体要求,比如业务要求用户不能多次登陆,我们可以将服务器上的session实现同步,每个server的session都有一个副本这样用户就不用那么费劲的每个服务器都去登陆了。我们还可以将系统的功能按照重要性安排一个优先级,先选择优先级的功能实现高可用的方案。具体的方法我会在后面文章中阐述。

 

posted on 2018-11-11 22:12  风云无敌  阅读(400)  评论(0编辑  收藏  举报

导航