分布式架构的演进之道

一、前言

我们都知道,当今无论在BAT这样的大公司,还是各种各样的小公司,甚至是传统行业刚转互联网的企业都开始使用分布式架构,那么什么叫分布式架构呢?分布式架构有什么好处呢?分布式架构经过了怎样的发展呢?是哪家企业开启了分布式架构的时代呢?读完本文,你就会得到这些答案,下面让我们一起来开启分布式概述的奇妙之旅吧!

二、分布式架构的发展历史

1946年2.14日,那是一个浪漫的情人节 , 世界上第一台电子数字计算机在美国宾夕法尼亚大学诞生了,她的名字叫ENIAC。这台计算机占地170平米、重达 30 吨,每秒可以进行 5000 次加法运算。

第一台电子计算机诞生以后,就意味着一个日新月异的 IT 时代到来了。单台计算机的性能不断得到提升,从最早的 8 位 CPU 到现在的 64 位 CPU;从早期的 MB 级内存到现在的 GB 级别内存;从慢速的机械存储到现在的固态 SSD 硬盘存储。

ENIAC 之后,电子计算机就进入了 IBM 主导的大型机时代。1964 年 4 月 7 日,在吉恩.阿姆达尔(IBM 大型机之父, 被认为是有史以来最伟大的计算机设计师之一)的带领下,耗费 50 亿美元,历时三年,第一台 IBM 大型机 SYSTEM/360 诞生了。这使得 IBM 在 20 世纪 50~60 年代统治着整个大型计算机工业,奠定了 IBM 计算机帝国的基础。IBM 大型机曾支撑美国航天登月计划,IBM 主机一直服务于金融等核心行业的关键领域。由于超强的计算能力和高可靠性,即使在 X86 和云计算高速发展的背景下,IBM 的大型机依然牢牢占据着一定的高端市场份额。

20 世纪 80 年代,在大型机霸权的时代下,计算机的架构同时向两个方向发展:

1、以 CISC (微处理器执行的计算机语言指令集) CPU 为架构的面向个人、价格便宜的PC。

2、以 RISC (精简指令集计算机) CPU 为架构的面向企业、价格昂贵的小型 UNIX 服务器。

三、分布式架构发展的里程碑

大型主机凭借着大型机超强的计算和 I/O 处理能力、安全性、 稳定性等,在很长一段时间内,大型机引领着计算机行业及商业计算领域的发展。而集中式的计算机系统架构也渐渐成为了主流。但是随着社会的发展,这种架构越来越难以适应企业的需求,比如说:

1、大型主机复杂性高,培养一个能够熟练运维大型主机的人成本很高。

2、大型主机很贵,一般只有土豪机构(政府、电信、金融)才能用得起。

3、会有单点问题,一旦大型主机出现故障,那整个系统就将处于不可用的状态。而对于大型机的使用机构来说,这种不可用导致的损失是非常具大的。

4、由于科技的进步、技术的发展,PC 机性能得到了不断提升,所以很多企业放弃大型机改用小型机及普通 PC 来搭建系统架构。

阿里巴巴发起的"去 IOE"运动开启新时代

IOE 指的是 IBM 小型机、Oracle 数据库、EMC 的高端存储。阿里巴巴2009 年“去 IOE”战略技术总监透露,截止到 2013 年 5 月 17 日阿里巴巴最后一台 IBM 小型机在支付宝下线。

为什么要去 IOE?

随着业务的快速发展,阿里巴巴业务量和数据量呈爆发性增长,传统集中式 Oracle 数据库架构在系统的扩展性方面遭遇到了瓶颈。 传统的商业数据库软件(Oracle,DB2)多以集中式架构为主, 那么这些传统数据库软件的最大特点就是将所有的数据都集中在 一个数据库中,只能依靠大型高端设备来提供高处理能力和扩展性。 集中式数据库的扩展性主要采用向上扩展(Scale up)的方式, 通过增加 CPU、内存、磁盘等方式提高系统处理能力。这种集中式数据库的架构,使得数据库成为了整个系统的瓶颈,已经越来越不能适应海量数据对计算能力的要求。

四、分布式系统的意义

之所以要发展分布式系统架构,是因为单机系统存在着如下诸多缺点等待被解决:

1、升级单机处理能力的性价比越来越低,我们知道单机的处理能力主要依靠 CPU、内存、磁盘。通过升级硬件来这种垂直扩展的方式来提升性能,成本会越来越高。性价比会越来越低。

2、单机处理能力存在瓶颈,并且单机处理能力存在瓶颈,CPU、内存、磁盘都会有自己的性能瓶颈, 就算你是土豪不惜成本去提升硬件,但是硬件的发展速度和性能也还是有限制的。

3、稳定性和可用性这两个指标很难达到

4、最后就是单机系统存在可用性和稳定性的问题,这两个指标又是我们亟待要去解决的问题。

五、分布式架构的常见概念

1.集群

小张开了一家小饭店,刚开始的时候店里只有一个厨师,切菜洗菜备料炒菜全干。后来由于饭香甜可口,人流量越来越多了,一个厨师忙不过来了,小张又请了两个厨师,那么这时候三个厨师炒一样的菜,做相同的切菜洗菜备料炒菜等工作,那这三个厨师的关系是集群。也就意味着来一个顾客,只有其中的一个厨师会为这个顾客服务。

2.分布式

又经过一段时间,店里的生意更加火爆了,小张为了让厨师们能专心炒菜,把菜做到极致,又请了个配菜师负责切菜、备菜、备料,那么厨师和配菜师的关系是分布式,后来一个配菜师也忙不过来了,小张就又请了两个配菜师,三个配菜师关系也是集群。

3.节点

节点是指一个可以独立按照分布式协议完成一组逻辑的程序个体。在具体的项目中,一个节点表示的是一个操作系统上的进程。 那这里的每一个配菜师和厨师都是一个节点。

4.副本机制

副本(replica/copy)是指在分布式系统中为数据或服务提供的冗余。 数据副本指在不同的节点上持久化同一份数据,当某一个节点出现数据丢失时,可以从副本上恢复数据。数据副本是分布式系统中解决数据丢失问题的唯一手段。 服务副本表示多个节点提供相同的服务,通过主从关系来实现服务高可用的方案。

5.中间件

中间件位于操作系统提供的服务之外,但又不属于应用,他是位于应用和系统层之间的、为开发者方便的处理通信、输入输出的一类软件,能够让用户只关心自己应用的部分。

六、分布式领域中冯诺依曼模型的变化

上图是经典理论-冯.诺依曼体系,计算机硬件由运算器、 控制器、存储器、输入设备、输出设备五大部分组成。不管架构怎么变化,计算机仍没有跳出该体系的范畴。

输入设备的变化

分布式系统架构中,输入设备可以分两类:第一类是互相连接的多个节点,在接收其他节点传来的信息作为该节点的输入;另一种就是传统意义上的人机交互的输入设备了。

输出设备的变化

分布式系统架构中,输出也分两类,一种是系统中的节点向其他节点传输信息时,该节点可以看作是输出设备;另一种就是传统意义上的人际交互的输出设备,比如用户的终端。

控制器的变化

在单机中,控制器指的是 CPU 中的控制器,在分布式系统中,控制器主要的作用是协调或控制节点之间的动作和行为; 比如硬件负载均衡器;LVS 软负载;规则服务器等等。

运算器

分布式系统中,运算器是由多个节点来组成的。运用多个节点的计算能力来协同完成整个计算任务。

存储器

分布式系统中,我们需要把承担存储功能的多个节点组织在一起, 组成一个整体的存储器;比如数据库、redis(key-value 存储) 。

七、分布式系统的难点

毫无疑问,分布式系统对于集中式系统而言,在实现上会更加 复杂。分布式系统将会是更难理解、设计、构建 和管理的,同 时意味着应用程序的根源问题更难发现。

三态

在集中式架构中,调用一个接口返回的结果只有两种, 成功或失败。但是在分布式架构中,会出现“超时”这个状态。

分布式事务

这其实是一个老生常谈的问题,我们都知道事务就是一系列操作的原子性保证,在单机的情况下,我们能够依靠本机的数据库连接和组件很轻易的做到事务控制,但在分布式架构下,业务原子性操作很可能是跨服务的,这样就会导致分布式事务。比如 A 、B 操作分别是在不同服务下的同一个事务内的操作,A 调用 B,如果A可以清楚的知道 B 是否成功提交从而控制自身提交还是回滚,但我们知道在分布式系统调用中会出现一个新状 态就是超时,就是 A 并无法知道 B 是成功还是失败,这个时候 A 是提交本地事务还是执行回滚呢?这其实是一个很难的问题,如果要强行保证事务一致性,可以采取分布式锁,但那样会增加系统复杂度而且会增大系统的开销,而且事务跨越的服务越多, 消耗的资源越大,性能越低,那么最好的解决方案就是避免分布式事务。 还有一种解决方案就是重试机制,但是重试如果不是查询接口, 久必然涉及到数据库的变更,如果第一次调用成功但是没返回成功结果,那调用方第二次调用对调用方来说依然是重试,但是此时对于被调用方来说是重复调用,例如 A 向 B 转账,A-100,B + 100,这样会导致 A 扣了 100,而 B 增加 200。这样的结果并不是我们期望的,因此需在要写入的接口做幂等设计(多次调用和单次调用是一样的效果)。通常可以设置一个唯一键,在写入的时候查询是否已经存在,避免重复写入。但是幂等设计的一 个前提就是服务高可用,否则无论怎么重试都不能调用返回一个明确的结果,那调用方会一直等待,虽然可以限制重试的次数, 但是这已经进入异常状态了,甚至到了极端情况还需要人肉补偿处理。其实根据 CAP 和 BASE 理论,不可能在高可用分布式情况下做到一致性,一般都是最终一致性保证。

负载均衡

为了达到服务高可用,每个服务至少是部署两台机器,因为互联网公司一般使用可靠性不是很高的普通机器, 长期运行宕机概率很高,所以两台机器能够大大降低服务不可用的可能性,而大型项目往往会采用十几台甚至上百台来部署一 个服务,这不仅是保证服务的高可用,更是为了提升服务的 QPS, 但是这样又带来一个问题,一个请求过来到底路由到哪台机器呢? 路由算法很多,有 DNS 路由,如果 session 在本机,还会根据用户 id 或则 cookie 等信息路由到固定的机器,当然现在应用服务器为了扩展的方便都会设计为无状态的,session 会保存到专有的 session 服务器,所以一般不会涉及到拿不到 session 问 题。那路由规则是随机获取么?这是一个方法,但是据我所知, 实际情况肯定比这个复杂得多,在一定范围内随机,但是在大范围也会分为很多个域,比如如果为了保证异地多活的多机房, 夸机房调用的开销太大,肯定会优先选择同机房的服务,这个 要参考具体的机器分布来考虑。

一致性

数据被分散或者复制到不同的机器上,如何保证各台主机之间的数据一致性将成为一个难点。

故障的独立性

分布式系统由多个节点组成,整个分布式系统完全出问题的概率是存在的,但是在实践中出现更多的是某个节点出问题,其他节点都没问题。这种情况下我们实现分布式系统时需要考虑得更加全面些。

写在最后:欢迎留言讨论,加关注,持续更新!!!

第一部分 论架构 第1章 架构概述  13 1.1 简介  13 1.2 创建软件架构  19 1.3 架构结构  23 1.4 好的架构  27 1.5 美丽的架构  28 致谢  30 参考文献  31 第2章 两个系统的故事:现代软件神话  33 2.1 混乱大都市  34 2.2 设计之城  40 2.3 说明什么问题  47 2.4 轮到你了  48 参考文献  48 第二部分 企业级应用架构 第3章 伸缩性架构设计  51 3.1 简介  51 3.2 背景  52 3.3 架构  56 3.4 关于架构的思考  61 第4章 记忆留存  67 4.1 功能和约束  68 4.2 工作流 69 4.3 架构关注点  70 4.4 用户反应  90 4.5 结论  90 参考文献  90 第5章 面向资源的架构:在Web中  91 5.1 简介  91 5.2 传统的Web服务  92 5.3 Web  94 5.4 面向资源的架构  99 5.5 数据驱动的应用  102 5.6 应用面向资源的架构  103 5.7 结论  108 第6章 数据增长:Facebook平台的架构  109 6.1 简介  109 6.2 创建一个社会关系Web服务  114 6.3 创建社会关系数据查询服务  121 6.4 创建一个社会关系Web门户:FBML  129 6.5 系统的支持功能  142 6.6 总结  147 第三部分 系统架构 第7章 Xen和虚拟化之美  151 7.1 简介  151 7.2 Xenoservers  152 7.3 虚拟化的挑战  154 7.4 半虚拟化  155 7.5 Xen的变换形式  158 7.6 改变的硬件,改变的Xen  163 7.7 经验教训  165 7.8 延伸阅读  166 第8章 Guardian:一个容错操作系统环境  169 8.1 Tandem/16,将来所有的计算机都会像这样构建 170 8.2 硬件  170 8.3 物理布局  172 8.4 处理器架构  172 8.5 处理器间总线  178 8.6 输入/输出  178 8.7 进程结构  179 8.8 消息系统  179 8.9 文件系统  183 8.10 轶闻趣事  188 8.11 弊端  189 8.12 后继者  190 8.13 延伸阅读  191 第9章 JPC:一个纯Java的x86 PC模拟程序  193 9.1 简介  193 9.2 概念验证  195 9.3 PC架构  198 9.4 Java性能技巧  199 9.5 把4GB放入4GB:这不起作用  200 9.6 保护模式的危险  203 9.7 从事一项毫无成功希望的斗争  206 9.8 劫持JVM  210 9.9 终极灵活性  220 9.10 终极安全性  222 9.11 第二次做会更好  223 第10章 元循环虚拟机的力量:Jikes RVM  225 10.1 背景  225 10.2 与运行时环境相关的传言  227 10.3 Jikes RVM简史  229 10.4 一个自足执行的运行时自举  230 10.5 运行时组件  234 10.6 经验教训  246 参考文献  247 第四部分 最终用户应用架构 第11章 GNU Emacs:滋长的特性是其优势  251 11.1 使用中的Emacs  252 11.2 Emacs的架构  254 11.3 滋长的特性  260 11.4 另外两个架构  262 第12章 当集市开始构建教堂  267 12.1 简介  267 12.2 KDE项目的历史和组织结构  269 12.3 Akonadi  274 12.4 ThreadWeaver  289 第五部分 语言与架构 第13章 软件架构:面向对象与面向函数  299 13.1 概述  299 13.2 函数式示例  302 13.3 函数式解决方案的模块性评价  305 13.4 面向对象视图  313 13.5 面向对象模块性的评价和改进  319 13.6 代理:将操作封装到对象中  323 致谢 328 参考文献 328 第14章 重读经典  331 14.1 所有东西都是对象  335 14.2 类型是隐式定义的  342 14.3 问题  348 14.4 砖块和灰浆建筑架构  352 参考资料  359 跋 漂亮地构建 363
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值