要点:算法
1可用性是系统可以返回合理结果的能力数据库
2 可用性随着流量的增长而不断下降服务器
3 硬件的故障一样时系统可用性炸弹网络
5 冗余机制是提高可用性的惟一办法session
4 提高可用性的过程也是增长系统复杂度的过程多线程
上一篇文章咱们讲到系统复杂产生的一个主要来源是可用性。那么什么是系统的可用性呢?这个来自于用户在使用系统直观感觉,好比系统常常弹出的莫名错误,常常莫名的死机退出,用户就会说系统真难用,若是系统反应灵敏,返回结果正确,用户则会说这个系统好用,来自与具体的技术统计 好比说异常率,出错率,反应时间等。总的来讲系统的可用性是指系统返回合理结果的能力,这里的合理结果也包括合理的错误信息。为何这么说呢?这是由于咱们的系统永远都不能保证100%运行正常,总会有bug隐藏在某个角落等待爆发,若是出现了异常,系统可以给出合理错误提示,让用户明白如今系统正在发生着什么,这也不能说系统不可用,固然某些严重的错误除外,他们颇有可能直接使系统拒绝服务。架构
按常理理解一个可以运行的系统都是可用的,那为何他会成为系统的一大难题呢?缘由就在于系统运行时的流量。在系统运行的过程当中,随着业务的发展,使用系统的人也愈来愈多系统就会频繁的处理各类请求,局限于系统部署的硬件环境和软件环境系统中隐藏的问题就暴露出来了,好比反应时间长,返回链接超时,多线程死锁等问题。这样系统的可用性就大大下降了,用户的体验也就天然而然的很差了。性能
除此以外 ,系统硬件的问题更犹如一颗深水炸弹,不知道啥时候爆炸,一旦发生硬件故障影响也是那对可用性的影响是毁灭性的。好比网络故障了,系统正在传输的数据瞬间中断,那这部分数据没法到达目的地也就没法进行加工和存储最终能够形成业务出现混乱。再好比数据库硬盘故障,那就是业务数据的物理性丢失,基本上没法恢复,这对公司来讲是毁灭性的,前一段时间因为腾讯云的硬盘集群问题致使某论坛数据所有湮灭的事件更是让人毛骨悚然。测试
前面说了这么多,那有没有什么办法能保证系统的可用性?答案是确定的,那就是冗余。咱们知道系统有两部分组成一部分是程序,另外一部分是数据,要保证其可用性首先就是要保证他们运行环境的可用,程序的运行环境是什么 ?就是计算能力嘛,CPU,内存,数据的运行环境固然对应到了计算机存储设备上。对于单机来讲咱们能够加内存,加存储,加CPU,让他的性能达到极限,这样就可让系统可以再单机运行中更加稳定,反应更加敏捷。可是单机的部署始终是有他的天花板的,CPU运算速度再快也有不能无限提高,硬盘再大也扛不住海量数据,更不用说单机在发生物理故障时的脆弱性了,因此为了保证系统的可用性就得加机器,加机器不只能够带来计算能力的提高,并且能够带来存储能力的提高,也就是鸡蛋不要放在同一个篮子里。线程
既然加机器就能解决问题,那为了系统可以获得高可用,咱们就无限加机器就行了呗。其实并不尽然,首先来讲咱们的成本并非无限的,老板们巴不得一块钱当成8块使怎么能让你在那里撒欢挥霍呢?最重要的是咱们的再加机器的同时也带来新的系统复杂度,加机器并非1+1=2的简单运算,而是打开的潘多拉魔盒。为啥这么说呢我将示例具体说明
咱们首先看一个系统的单机架构以下图:
在这个架构只有一个业务服务器,一个数据库服务器,这种架构在咱们公司内部常用,主要场景是用于开发和测试,如他的单一节点所示的那样若是应用到高流量的环境下基本上是不堪一击的。为了增长其可用性咱们须要跟他增长冗余,首先咱们加一个业务服务器以下图
咱们的确增长了一个业务服务器,可是咱们同时也增长了一个新的设备叫任务分配器,故名思意他干的是的给业务服务器分配任务的活。为啥须要这台设备呢?由于咱们的系统对外最好提供一个统一的入口这样才能方便用户访问,我记住一个地址总比记住两个地址容易多了,其次有了这台设备咱们能够保障每台服务器都不会超过他的最大承受能力来。那么这两台设备产生的复杂的问题也随着增长这台任务服务器来了,既然是分配任务那么怎么保证每次都能命中压力最小的呢?具体任务如何分配呢?若是一台服务器坏掉了任务分配器如何得知呢?如何保证session的一致性呢咱们每次登录时都要登录两遍吗 ?那若是有多个服务器时难道还要登录N遍?若是真是如此那真是逆天的操做。对于这些问题在技术层面上已经不是问题好比应对如何分配任务的问题,分配服务器就有轮询,IP Hash两种算法,这两种算法一个时挨着服务器的发放请求,一个则是将相同IP地址的请求分配到同一台机器上 可是咱们必须得作出正确的选择,以保证系统可以更好的运行他的功能。
咱们才加了一个业务服务器就引来这么多的复杂性问题,若是再加个数据库的化,须要解决的问题会更多,问题处理起来就更加棘手,那咱们如何才能找到适合系统可用性的架构呢?方法说简单也简单,说复杂又复杂,具体要看咱们业务的具体要求,好比业务要求用户不能屡次登录,咱们能够将服务器上的session实现同步,每一个server的session都有一个副本这样用户就不用那么费劲的每一个服务器都去登录了。咱们还能够将系统的功能按照重要性安排一个优先级,先选择优先级的功能实现高可用的方案。具体的方法我会在后面文章中阐述。