一, 前言
我们都知道, 当今无论在 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 年代, 在大型机霸权的时代下, 计算机的架构同时向两个方向发展:
以 CISC (微处理器执行的计算机语言指令集) CPU 为架构的面向个人, 价格便宜的 PC.
以 RISC (精简指令集计算机) CPU 为架构的面向企业, 价格昂贵的小型 UNIX 服务器.
三, 分布式架构发展的里程碑
大型主机凭借着大型机超强的计算和 I/O 处理能力, 安全性, 稳定性等, 在很长一段时间内, 大型机引领着计算机行业及商业计算领域的发展. 而集中式的计算机系统架构也渐渐成为了主流. 但是随着社会的发展, 这种架构越来越难以适应企业的需求, 比如说:
大型主机复杂性高, 培养一个能够熟练运维大型主机的人成本很高.
大型主机很贵, 一般只有土豪机构 (政府, 电信, 金融) 才能用得起.
会有单点问题, 一旦大型主机出现故障, 那整个系统就将处于不可用的状态. 而对于大型机的使用机构来说, 这种不可用导致的损失是非常具大的.
由于科技的进步, 技术的发展, PC 机性能得到了不断提升, 所以很多企业放弃大型机改用小型机及普通 PC 来搭建系统架构.
阿里巴巴发起的 "去 IOE" 运动开启新时代
IOE 指的是 IBM 小型机, Oracle 数据库, EMC 的高端存储. 阿里巴巴 2009 年 "去 IOE" 战略技术总监透露, 截止到 2013 年 5 月 17 日阿里巴巴最后一台 IBM 小型机在支付宝下线.
为什么要去 IOE?
随着业务的快速发展, 阿里巴巴业务量和数据量呈爆发性增长, 传统集中式 Oracle 数据库架构在系统的扩展性方面遭遇到了瓶颈. 传统的商业数据库软件 (Oracle,DB2) 多以集中式架构为主, 那么这些传统数据库软件的最大特点就是将所有的数据都集中在 一个数据库中, 只能依靠大型高端设备来提供高处理能力和扩展性. 集中式数据库的扩展性主要采用向上扩展 (Scale up) 的方式, 通过增加 CPU, 内存, 磁盘等方式提高系统处理能力. 这种集中式数据库的架构, 使得数据库成为了整个系统的瓶颈, 已经越来越不能适应海量数据对计算能力的要求.
四, 分布式系统的意义
之所以要发展分布式系统架构, 是因为单机系统存在着如下诸多缺点等待被解决:
升级单机处理能力的性价比越来越低
我们知道单机的处理能力主要依靠 CPU, 内存, 磁盘. 通过升级硬件来这种垂直扩展的方式来提升性能, 成本会越来越高. 性价比会越来越低.
单机处理能力存在瓶颈
并且单机处理能力存在瓶颈, CPU, 内存, 磁盘都会有自己的性能瓶颈, 就算你是土豪不惜成本去提升硬件, 但是硬件的发展速度和性能也还是有限制的.
稳定性和可用性这两个指标很难达到
最后就是单机系统存在可用性和稳定性的问题, 这两个指标又是我们亟待要去解决的问题.
五, 分布式架构的常见概念
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 问 题. 那路由规则是随机获取么? 这是一个方法, 但是据我所知, 实际情况肯定比这个复杂得多, 在一定范围内随机, 但是在大范围也会分为很多个域, 比如如果为了保证异地多活的多机房, 夸机房调用的开销太大, 肯定会优先选择同机房的服务, 这个 要参考具体的机器分布来考虑.
一致性
数据被分散或者复制到不同的机器上, 如何保证各台主机之间的数据一致性将成为一个难点.
故障的独立性
分布式系统由多个节点组成, 整个分布式系统完全出问题的概率是存在的, 但是在实践中出现更多的是某个节点出问题, 其他节点都没问题. 这种情况下我们实现分布式系统时需要考虑得更加全面些.
八, 总结
通过本文分布式系统的概述, 我们就对分布式有了一个很直观的了解, 里面涉及到的技术还是蛮多的, 后面的文章中, 我们一点点的来啃这些硬骨头. 为我们的成长加油点赞吧~ 下篇博文我们来聊分布式架构的演进过程怎么样? 评论区等你.
来源: https://www.cnblogs.com/hafiz/p/9212343.html