打个比方,原先的大型企业系统架构,就好像一架大型的民航客机。作为出行来讲,飞机无疑是最舒适最快的交通工具,同时安全性也很好。但飞机却也不是人人都能坐的。首先:做飞机要经过换领登机牌,安检等若干道手续,乘客必须提前一个多小时到机场办理各种手续,而坐火车大巴则随到随买随上车,方便的多;其次:坐飞机很多东西不能随身携带甚至不能托运,火车大巴则相对宽松;还有:机票很贵坐飞机花销很大而且飞机运载能力也不如火车。当你有数万数千人要一次性到达某地时,一两架飞机的运载能力根本不够,要调动成批飞机的话整体成本又太高。最后:虽然飞机很少出事故,飞机一旦出现事故的话危险级别往往都会很高。
但是,以前除了飞机之外,就只有火车,大巴这种交通方式选择了。相比之下,这些方式虽然收费低廉,乘车,携带物品都比较方便,但是速度实在太慢而且受外界因素诸如雨雪等等的影响太大,乘坐也不是很舒适。只能满足那些相对时间宽裕,或者囊中羞涩人群的出行需求。
于是,为了满足更多人,更便利更高速的交通运输需求,新的交通运输模式—动车/高铁就出现了。它和火车最大的区别是:火车只有一节车头有动力,后面能拖几节车厢跑多快基本就是看一个车头有多强劲。但个体的力量终究有限,一个车头再强劲也有个极限,发展空间也就那点了,实在难以有太大作为。动车则不同,它每节列车都独立有自己的动力系统,连在一起各节车厢动力系统就是一个叠加递增的关系。所以理论上越多节车厢接在一起就可以拉更多人跑的更快,是一个无限扩展的系统!而且因为动车可以搭载的乘客很多,所以均摊到每个乘客头上,坐动车的速度可以某种程度上接近坐飞机,但成本要低很多。
现在互联网,云计算的系统架构其实和动车的理念相类似,就是分布式系统的架构 – 将任务分解交由每个小计算单元进行分布式的并行处理,充分利用每个单元的计算和存储能力,理论上性能可以无限线性扩展,任何一个节点的故障不影响整个系统的运行,整个系统没有单点故障。
也就是说:我们可以简单把大型企业核心架构,或者说就是大型机,RISC系统比作飞机;而把互联网,云计算的系统架构比作动车。现在,就可以做些很有意思的讨论了。
还是来说说稳定性和可靠性:飞机也好,动车也好,新闻里面都有报道过出现严重事故,可见没有一种系统是完全稳定可靠不会出现任何宕机风险的,但是其概率都是非常非常小的。从整体来讲,都是很稳定很可靠很安全的选择。只不过各自对于如何防灾冗余的策略还是有些不一样。先说飞机,因为飞在空中,万一出了事情没有后备可用,所以能采取的方式只有想尽一切办法提高飞机自身个部件的冗余度,设计时尽可能多的考虑各种小概率事件。哪怕发生某故障的概率只有千万分之一甚至亿万分之一,只要有可能,也要把应对措施设计进去。这也是飞机造价为什么会那么高,对携带物的要求会那么多的原因。而动车则相对简单:反正多拖几节车厢又不影响我速度,那我就尽量多拖些备用车厢跑着呗。万一某节车厢出事了,就把里面乘客挪到备用车厢里,车照样跑得欢。然后等到了站再去更换检查有问题车厢也不迟。
回到IT世界也是一样。分布式系统基本都是基于x86的PC服务器。单就一台服务器而言,虽然性能可靠性在不断加强,但肯定还是不如RISC系统的。但是没关系,咱可以用数量来弥补单机冗余度的不足啊。设计没你好冗余度没你考虑的多我就多拉几台呗。坏了几台没事,应用任务再分配到别的空闲机器上就好了。坏了的机器也不用马上修,反正没坏的机器加起来也够用。等到故障机器到了一定数量我再一次性批量检修更换部件效率更高。对于用户来讲,即使我坏了100来台服务器只要剩下的服务器还能正常工作,应用就不会受任何影响。谷歌,Facebook那些超大型数据中心现在的工作思路大致如此。这么做看起来是个很简单有效,很聪明的方法,但其实也有不少问题存在。
首先我觉得这个架构好处是实现原理简单,而且扩展性弹性比起RISC架构来好处不言而喻。但其实这个架构里面也存在着无谓的资源浪费可能性。例如拿存储而言,目前Hadoop类的多副本分布式存储很火。一份数据存三份,发现有数据损坏立即找空闲空间恢复。听上去很简单很容易实现很高效,但如果你真的坐下来仔细算算账,你就会发现:
1. 当你数据量不大(小于PB)的情况下这种一份数据存三份方式的成本其实比现有任何商业存储方案的成本都要高。
2. 这种方式下每台服务器的CPU利用率都很低,而现在市面上的大存储容量服务器,CPU配置都很高。所以这种方式,基本上是对于CPU资源的一种浪费。所以,或许对于数据量适中的企业来说,用EC CODE这种以计算能力换存储的分布式存储解决方案会比多副本方案更经济实惠。
3. 这种方式很容易让IT运维人员产生一种习惯性思维 – 即要提高系统在线时间就多买些服务器就好了。因为服务器多了分布性好了自然冗余度就高了。于是不必要的服务器采购就这么产生了,每个数据中心也就又多了很大一笔不是很必要的电费开销。
其次,我觉得分布式架构的某些故障很可能会产生连锁效应,导致更严重全局瘫痪。打个比方,大家都知道赤壁之战的故事。里面有个很着名的桥段就是庞统献连环计,铁锁连舟。起始时使曹操万余战船连成一体稳如平地进可攻退可守前后都可照应看似完美,但唯有一个命门就是怕火攻。而诸葛亮周瑜正是利用这个命门,解东风火烧赤壁把曹操百万大军杀的丢盔卸甲。互联网的分布式架构其实我觉得也有类似“命门”。大型机之所以那么贵,其实很多时候用户在为千万分之一甚至亿万分之一的“万一”买单。而互联网,现在的公有云架构,在设计之初,基本的考虑思路是大用户,大并发,然后尽量减少TCO。所以很多时候,设计架构时会先把那些“千万分之一”排除在外,暂时不予考虑。而系统上线之后,稳定运行一段时间用户量暴涨,精力往往又会去专注扩容方面了。搞不好就会把一些“命门”漏掉,于是乎万一正好遇上“东风”吹到了命门上,后果估计会比曹阿瞒更惨。因为IT世界里还没有那么仁义的关云长会在华容道上放曹操一马。
最后,我想说互联网,云计算的业务类型其实和传统企业的业务类型不一样,所以大型机,系统处理的任务,运行的计算并不一定都适合移植到分布式系统架构上来。还是以交通运输举例:我要去美国,目前还是只有飞机可以满足我的需求。当然你可以说我坐动车也可以,无非是多转几趟跨国列车。但那毕竟很勉强,速度不快,费时费力还不省钱,毫无意义。人家直接飞过去就行了,你却要绕着太平洋海岸线跑一个大圈来兜,何必呢?
那么以上这些问题有没有办法解决呢?其实我觉得解决以上问题的关键就是两个字:运维。分布式系统,要保障其安全可靠的运行,合理有效的扩容,关键不在系统的软硬件,而是在系统搭建之后的运维和持续的对系统的改进修正!现在网络上很多人都在热衷于各种开源架构如openstack,Hadoop的开发,应用场景探讨。但个人以为这些开源系统的特点是搭建简单,维护艰难!要想把这些架构和技术真正投入企业成熟应用,在运维管理上投入的成本可能大得多。因为这些系统架构更分散,出现的不可预估性更多,同时也更需要有人来理清何时用分布式架构,何种场景还是需要传统架构。那么可能有人要问,既然如此,我们还有必要走分布式系统这条路吗?当然有!原因也很简单:分布式架构给了我们处理海量请求的能力和应对突发事件的弹性;同时分布式架构也使系统具备了更好的扩展能力和更多业务创新的可能性。
说了这么多,基本要讲的也就讲得差不多了。怕前面说的有些散稍微总结下我想说的观点:无论传统架构还是现在流行的分布式架构,虽然实现方式各有不同,但都是具有很高的稳定性可靠性的系统。但没有一个系统是绝对稳定不会宕机的,要保障系统稳定可靠运行,运维管理很重要。分布式系统相比传统架构有扩展性和灵活性方面的巨大优势,但也存在资源浪费和故障隐患危险。在这一方面,分布式系统架构还需要多向传统架构的运维管理学习借鉴,提升自身的忧患意识和故障预警处理能力。
====================================分割线================================
本文转自d1net(转载)