分布式架构专题(一)概述
前言:
每个程序员都梦想有一天能成为架构师,技术大牛,当然我也想。所以现在慢慢将分布式架构的技术栈整理成一个个专题,慢慢积累,在工作中实践,希望一天可以到达那个高度看看那里的风景。下面引用架构师流行的一句话:作为一名架构师,我们要专业,要能看懂代码,即使光着臂膀去机房,也能独挡一面!即使同事搞不定问题,或者撂挑子,你也能给老大一个坚定的眼神:不怕,有我在!还能在会议室里滔滔不绝,如若无人,让不懂技术的妹子看你的眼神迷离,就好像落霞与孤鹜齐飞。好牛逼的独白!
什么是分布式?
互联网技术架构里面最大的两个特点是:高并发,海量数据。而且用户量是没有上限的。这两个特点在传统项目中一般是不会出现的。分布式是:把一些计算机通过网络连接起来,然后协同工作。协同工作需要解决两个问题。第一个是任务分解,第二个是节点通信。通俗讲就是由多个小型的服务器或者由多个节点组成的一台超级服务器。
任务分解:领域模型,对不同的业务进行任务拆分。
节点通信:通过rpc框架或消息中间件等使不同的节点之间相互通信传递信息。
分布式架构示意图:
分布式和集群的关系?
分布式是一个业务拆分成多个子系统,部署在不同的服务器上,比如说一个电商系统可以拆分出:用户,商品,订单,交易。
集群是指将同一个业务部署在多台服务器上,保证服务的高可用。分布式真正解决的问题是:高性能,而集群解决高可用的问题。
计算机的发展历史:
计算机的演变历史和架构的发展历史关系紧密。
- 第一台计算机发明与1946 年,情人节。
- 第一台大型主机诞生于1964 年, IBM SYSTEM/360。
- 超强的算力
- 高可靠性
大型机凭借自身的超强算力和高可靠性在金融领域和通信领域大展身手。随着计算机性能的提升,软件架构也开始往集中式方向发展。
- 大型主机之后,计算机以 X86 CPU 往个人的 PC 机方向发展。
- RISC CPU 小型机。
分布式架构的发展:
当时在大型主机的这种背景下,软件架构相对稳定。但随着互联网的发展,这种架构慢慢出现了瓶颈。
大型机被替代的原因:
- 大型主机体型庞大。
- 维护复杂,对人员培养要求很高。
- 大型主机价格昂贵。
- 单点问题,如果大型主机出现问题,整个服务会不可用。
- PC 机的性能不断提升,很多企业放弃了大型机,用 PC 机替代(里程碑)。
分布式架构的出现:
- 时机成熟了,pc机的性能不断提升
- 企业必须要做了,2008-2009 年淘宝的去 IOE(I:IBM 小型机,O:Oracle Rac,E:EMC 存储设备) 运动。因为阿里庞大的业务,单纯靠增加昂贵的机器性价比已经不高。于是用 PC 机来替代。数据库用 msql。2013 5月 17 号阿里最后一台小型机下线,意味着去 IOE 运动的成功。去 Oracle Rac 是因为商业系统,价格昂贵,对分布式的扩展支持不够好,是个瓶颈。
单机计算机架构到分布式架构:
计算机最早的模型是冯诺依曼模型,这也是单机模型。如果把分布式架构的组成也看作是一个超级单机模型,那么在分布式架构中的每个物理节点在冯诺依曼模型中分别代表什么呢?
- 输入设备:用户界面,RPC,消息中间件。
- 输出设备:用户展示的终端,RPC,消息中间件。
- 存储器:数据库服务器,缓存服务器。
- 运算器:WEB 服务器,业务逻辑。
- 控制器:负载均衡,高可用的主/备模型。
架构的发展演变过程:
一个成熟的大型分布式架构不是一开始就非常完美,而是随着业务的发展而去逐渐演变,逐渐完善的。所以架构发展的源动力是业务。BAT ,百度侧重点是海量数据的搜索,阿里的侧重点是商品和下单支付,腾讯的侧重点是数亿级别的用户消息的实时传输。每一个企业的业务不一样,架构也不一样。
什么是大型架构:
怎么取衡量一个大型架构?
- 访问量(tps,qps)。
- 数据量(存储量)。
电商平台的发展:
- 初始阶段:用户,商品,订单三个平台。早期做会选择开源技术栈:tomcat容器,jsp/servlet;数据库:mysql。
- 特征:应用程序,数据库,文件等所有资源都放在一台服务器上。
- 示意图:
- 应用服务 和 数据服务 以及 文件服务 分离:
- 说明:好景不长,发现随着系统访问量的再度增加,webserver机器的压力在高峰期会上升到比较高,这个时候开始考虑增加一台webserver。
- 特征:应用程序、数据库、文件分别部署在独立的资源上。
- 示意图:
- 使用缓存改善性能:
- 说明:系统访问特点遵循二八定律,即80%的业务访问集中在20%的数据上。
-
缓存分为 本地缓存 和 远程分布式缓存,本地缓存访问速度更快但缓存数据量有限,同时存在与应用程序争用内存的情况。
-
特征:数据库中访问较集中的一小部分数据存储在缓存服务器中,减少数据库的访问次数,降低数据库的访问压力。
-
示意图:
- 使用“应用服务器”集群:
- 说明:在做完分库分表这些工作后,数据库上的压力已经降到比较低了,又开始过着每天看着访问量暴增的幸福生活了。突然有一天,发现系统的访问又开始有变慢的趋势了,这个时候首先查看数据库,压力一切正常,之后查看webserver,发现apache阻塞了很多的请求,而应用服务器对每个请求也是比较快的,看来是请求数太高导致需要排队等待,响应速度变慢。
- 特征:多台服务器通过负载均衡同时向外部提供服务,解决单台服务器处理能力和存储空间上限的问题。
- 描述:使用集群是系统解决高并发、海量数据问题的常用手段。通过向集群中追加资源,提升系统的并发处理能力,使得服务器的负载压力不再成为整个系统的瓶颈。
- 示意图:
- 数据库读写分离:
- 说明:享受了一段时间的系统访问量高速增长的幸福后,发现系统又开始变慢了,这次又是什么状况呢,经过查找,发现数据库写入、更新的这些操作的部分数据库连接的资源竞争非常激烈,导致了系统变慢。
- 特征:多台服务器通过负载均衡同时向外部提供服务,解决单台服务器处理能力和存储空间上限的问题。
- 描述:使用集群是系统解决高并发、海量数据问题的常用手段。通过向集群中追加资源,使得服务器的负载压力不在成为整个系统的瓶颈。
- 示意图:
- 反向代理和CDN加速:
- 特征:采用CDN和反向代理加快系统的访问速度。
- 描述:为了应付复杂的网络环境和不同地区用户的访问,通过CDN和反向代理加快用户访问的速度,同时减轻后端服务器的负载压力。CDN与反向代理的基本原理都是缓存。
- 示意图:
- “分布式文件”系统 和 “分布式数据库”:
- 说明:随着系统的不断运行,数据量开始大幅度增长,这个时候发现分库后查询仍然会有些慢,于是按照分库的思想开始做分表的工作
- 特征:数据库采用分布式数据库,文件系统采用分布式文件系统。
- 描述:任何强大的单一服务器都满足不了大型系统持续增长的业务需求,数据库读写分离随着业务的发展最终也将无法满足需求,需要使用分布式数据库及分布式文件系统来支撑。分布式数据库是系统数据库拆分的最后方法,只有在单表数据规模非常庞大的时候才使用,更常用的数据库拆分手段是业务分库,将不同的业务数据库部署在不同的物理服务器上。
- 示意图:
- 使用NoSQL和搜索引擎 :
- 特征:系统引入NoSQL数据库及搜索引擎。
- 描述:随着业务越来越复杂,对数据存储和检索的需求也越来越复杂,系统需要采用一些非关系型数据库如NoSQL和分数据库查询技术如搜索引擎。应用服务器通过统一数据访问模块访问各种数据,减轻应用程序管理诸多数据源的麻烦。
- 示意图:
- 业务拆分:
- 特征:系统上按照业务进行拆分改造,应用服务器按照业务区分进行分别部署。
-
描述:为了应对日益复杂的业务场景,通常使用分而治之的手段将整个系统业务分成不同的产品线,应用之间通过超链接建立关系,也可以通过消息队列进行数据分发,当然更多的还是通过访问同一个数据存储系统来构成一个关联的完整系统。
-
纵向拆分:将一个大应用拆分为多个小应用,如果新业务较为独立,那么就直接将其设计部署为一个独立的Web应用系统 纵向拆分相对较为简单,通过梳理业务,将较少相关的业务剥离即可。
-
横向拆分:将复用的业务拆分出来,独立部署为分布式服务,新增业务只需要调用这些分布式服务 横向拆分需要识别可复用的业务,设计服务接口,规范服务依赖关系。
-
示意图:
- 分布式服务:
- 特征:公共的应用模块被提取出来,部署在分布式服务器上供应用服务器调用。
- 描述:随着业务越拆越小,应用系统整体复杂程度呈指数级上升,由于所有应用要和所有数据库系统连接,最终导致数据库连接资源不足,拒绝服务。
- 示意图:
分布式服务应用会面临哪些问题?
- 当服务越来越多时,服务URL配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大。
- 当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。
- 服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?
- 服务多了,沟通成本也开始上升,调某个服务失败该找谁?服务的参数都有什么约定?
- 一个服务有多个业务消费者,如何确保服务质量?
- 随着服务的不停升级,总有些意想不到的事发生,比如cache写错了导致内存溢出,故障不可避免,每次核心服务一挂,影响一大片,人心慌慌,如何控制故障的影响面?服务是否可以功能降级?或者资源劣化?
2301_76639816: 深奥啊
m0_68857974: 博主什么时候继续更新这个版块呀!!!!
马耳朵浪里个浪: 沃糙
Tisfy: 看完楼主的帖子,我的心情竟是久久不能平复,正如老子所云:大音希声,大象希形。