《阿里是如何抗住双 11 的?.docx》由会员分享,可在线阅读,更多相关《阿里是如何抗住双 11 的?.docx(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、阿里是如何抗住双11的?每天早晨干货准时奉上本文huashiou来源segmentfault/a/1190000018626163双11昨天已经悄悄过去那你知道昨天阿里工程师都经历了如何的考研么本文以设计淘宝网的后台架构为例介绍从一百个并发到千万级并发情况下效劳端的架构的14次演进经过同时列举出每个演进阶段会遇到的相关技术让大众对架构的演进有一个整体的认知。文章最后汇总了一些架构设计的原那么。根本概念在介绍架构之前为了防止局部读者对架构设计中的一些概念不解析下面对几个最根底的概念进展介绍。1什么是分布式系统中的多个模块在不同效劳器上部署即可称为分布式系统如Tomcat以及数据库分别部署在不同的
2、效劳器上或者两个一样功能的Tomcat分别部署在不同效劳器上。2什么是高可用系统中局部节点失效时其他节点可以接替它继续提供效劳那么可认为系统具有高可用性。3什么是集群一个特定领域的软件部署在多台效劳器上并作为一个整体提供一类效劳这个整体称为集群。如Zookeeper中的Master以及Slave分别部署在多台效劳器上共同组成一个整体提供集中配置效劳。在常见的集群中客户端往往可以连接任意一个节点获得效劳并且当集群中一个节点掉线时其他节点往往可以自动的接替它继续提供效劳这时候讲明集群具有高可用性。4什么是负载平衡恳求发送到系统时通过某些方式把恳求均匀分发到多个节点上使系统中每个节点可以均匀的处理恳
3、求负载那么可认为系统是负载平衡的。5什么是正向代理以及反向代理系统内部要访问外部网络时统一通过一个代理效劳器把恳求转发出去在外部网络看来就是代理效劳器提议的访问此时代理效劳器实现的是正向代理当外部恳求进入系统时代理效劳器把该恳求转发到系统中的某台效劳器上对外部恳求来讲与之交互的只有代理效劳器此时代理效劳器实现的是反向代理。简单来讲正向代理是代理效劳器代替系统内部来访问外部网络的经过反向代理是外部恳求访问系统时通过代理效劳器转发到内部效劳器的经过。纯真年度代单机架构以淘宝作为例子在网站最初时应用数量与用户数都较少可以把Tomcat以及数据库部署在同一台效劳器上。阅读器往taobao提议恳求时首先
4、经过DNS效劳器域名系统把域名转换为实际IP地址10.102.4.1阅读器转而访问该IP对应的Tomcat。架构瓶颈随着用户数的增长Tomcat以及数据库之间竞争资源单机性能缺乏以支撑业务。第一次演进Tomcat与数据库分开部署Tomcat以及数据库分别独占效劳器资源显著进步两者各自性能。架构瓶颈随着用户数的增长并发读写数据库成为瓶颈。Tips欢送关注微信公众号Java后端获取更多技术博文推送。第二次演进引入本地缓存以及分布式缓存在Tomcat同效劳器上或者同JVM中增加本地缓存并在外部增加分布式缓存缓存热门商品信息或者热门商品的html页面等。通过缓存能把绝大多数恳求在读写数据库前拦截掉大大
5、降低数据库压力。其中涉及的技术包括使用memcached作为本地缓存使用Redis作为分布式缓存还会涉及缓存一致性、缓存穿透/击穿、缓存雪崩、热点数据集中失效等问题。架构瓶颈缓存抗住了大局部的访问恳求随着用户数的增长并发压力主要落在单机的Tomcat上响应逐渐变慢。第三次演进引入反向代理实现负载平衡在多台效劳器上分别部署Tomcat使用反向代理软件Nginx把恳求均匀分发到每个Tomcat中。此处假设Tomcat最多支持100个并发Nginx最多支持50000个并发那么理论上Nginx把恳求分发到500个Tomcat上就能抗住50000个并发。其中涉及的技术包括Nginx、HAProxy两者都
6、是工作在网络第七层的反向代理软件主要支持协议还会涉及session分享、文件上传下载的问题。架构瓶颈反向代理使应用效劳器可支持的并发量大大增加但并发量的增长也意味着更多恳求穿透到数据库单机的数据库最终成为瓶颈。第四次演进数据库读写别离把数据库划分为读库以及写库读库可以有多个通过同步机制把写库的数据同步到读库对于需要查询最新写入数据场景可通过在缓存中多写一份通过缓存获得最新数据。其中涉及的技术包括Mycat它是数据库中间件可通过它来组织数据库的别离读写以及分库分表客户端通过它来访问下层数据库还会涉及数据同步数据一致性的问题。架构瓶颈业务逐渐变多不同业务之间的访问量差距较大不同业务直接竞争数据库互
7、相影响性能。第五次演进数据库按业务分库把不同业务的数据保存到不同的数据库中使业务之间的资源竞争降低对于访问量大的业务可以部署更多的效劳器来支撑。这样同时导致跨业务的表无法直接做关联分析需要通过其他途径来解决但这不是本文讨论的重点有兴趣的可以自行搜索解决方案。架构瓶颈随着用户数的增长单机的写库会逐渐会到达性能瓶颈。第六次演进把大表拆分为小表比方针对评论数据可按照商品ID进展hash路由到对应的表中存储针对支付记录可按照小时创立表每个小时表继续拆分为小表使用用户ID或者记录编号来路由数据。只要实时操作的表数据量足够小恳求可以足够均匀的分发到多台效劳器上的小表那数据库就能通过程度扩展的方式来进步性能
8、。其中前面提到的Mycat也支持在大表拆分为小表情况下的访问控制。这种做法显著的增加了数据库运维的难度对DBA的要求较高。数据库设计到这种构造时已经可以称为分布式数据库但是这只是一个逻辑的数据库整体数据库里不同的组成局部是由不同的组件单独来实现的如分库分表的管理以及恳求分发由Mycat实现SQL的解析由单机的数据库实现读写别离可能由网关以及消息队列来实现查询结果的汇总可能由数据库接口层来实现等等这种架构其实是MPP大规模并行处理架构的一类实现。架构瓶颈数据库以及Tomcat都可以程度扩展可支撑的并发大幅进步随着用户数的增长最终单机的Nginx会成为瓶颈。第七次演进使用LVS或者F5来使多个Ng
9、inx负载平衡由于瓶颈在Nginx因此无法通过两层的Nginx来实现多个Nginx的负载平衡。图中的LVS以及F5是工作在网络第四层的负载平衡解决方案其中LVS是软件运行在操作系统内核态可对TCP恳求或者更高层级的网络协议进展转发因此支持的协议更丰富并且性能也远高于Nginx可假设单机的LVS可支持几十万个并发的恳求转发F5是一种负载平衡硬件与LVS提供的才能类似性能比LVS更高但价格昂贵。由于LVS是单机版的软件假设LVS所在效劳器宕机那么会导致整个后端系统都无法访问因此需要有备用节点。可使用keepalived软件模拟出虚拟IP然后把虚拟IP绑定到多台LVS效劳器上阅读器访问虚拟IP时会被
10、路由器重定向到真实的LVS效劳器当主LVS效劳器宕机时keepalived软件会自动更新路由器中的路由表把虚拟IP重定向到另外一台正常的LVS效劳器进而到达LVS效劳器高可用的效果。此处需要注意的是上图中从Nginx层到Tomcat层这样画并不代表全部Nginx都转发恳求到全部的Tomcat在实际使用时可能会是几个Nginx下面接一局部的Tomcat这些Nginx之间通过keepalived实现高可用其他的Nginx接另外的Tomcat这样可接入的Tomcat数量就能成倍的增加。架构瓶颈由于LVS也是单机的随着并发数增长到几十万时LVS效劳器最终会到达瓶颈此时用户数到达千万甚至上亿级别用户分布
11、在不同的地区与效劳器机房间隔不同导致了访问的延迟会明显不同。第八次演进通过DNS轮询实现机房间的负载平衡在DNS效劳器中可配置一个域名对应多个IP地址每个IP地址对应到不同的机房里的虚拟IP。当用户访问taobao时DNS效劳器会使用轮询策略或者其他策略来选择某个IP供用户访问。此方式能实现机房间的负载平衡至此系统可做到机房级别的程度扩展千万级到亿级的并发量都可通过增加机房来解决系统入口处的恳求并发量不再是问题。架构瓶颈随着数据的丰富程度以及业务的开展检索、分析等需求越来越丰富单单依靠数据库无法解决如此丰富的需求。第九次演进引入NoSQL数据库以及搜索引擎等技术当数据库中的数据多到一定规模时数
12、据库就不适用于复杂的查询了往往只能知足普通查询的场景。对于统计报表场景在数据量大时不一定能跑出结果而且在跑复杂查询时会导致其他查询变慢对于全文检索、可变数据构造等场景数据库天生不适用。因此需要针对特定的场景引入适宜的解决方案。如对于海量文件存储可通过分布式文件系统HDFS解决对于keyvalue类型的数据可通过HBase以及Redis等方案解决对于全文检索场景可通过搜索引擎如ElasticSearch解决对于多维分析场景可通过Kylin或者Druid等方案解决。当然引入更多组件同时会进步系统的复杂度不同的组件保存的数据需要同步需要考虑一致性的问题需要有更多的运维手段来管理这些组件等。架构瓶颈引
13、入更多组件解决了丰富的需求业务维度可以极大扩大随之而来的是一个应用中包含了过多的业务代码业务的晋级迭代变得困难。第十次演进大应用拆分为小应用按照业务板块来划分应用代码使单个应用的职责更明晰互相之间可以做到独立晋级迭代。这时候应用之间可能会涉及到一些公共配置可以通过分布式配置中心Zookeeper来解决。架构瓶颈不同应用之间存在共用的模块由应用单独管理睬导致一样代码存在多份导致公共功能晋级时全部应用代码都要跟着晋级。第十一次演进复用的功能抽离成微效劳如用户管理、订单、支付、鉴权等功能在多个应用中都存在那么可以把这些功能的代码单独抽取出来形成一个单独的效劳来管理这样的效劳就是所谓的微效劳应用以及效
14、劳之间通过HTTP、TCP或者RPC恳求等多种方式来访问公共效劳每个单独的效劳都可以由单独的团队来管理。此外可以通过Dubbo、SpringCloud等框架实现效劳治理、限流、熔断、降级等功能进步效劳的稳定性以及可用性。架构瓶颈不同效劳的接口访问方式不同应用代码需要适配多种访问方式才能使用效劳此外应用访问效劳效劳之间可以能互相访问调用链将会变得非常复杂逻辑变得混乱。第十二次演进引入企业效劳总线ESB屏蔽效劳接口的访问差异通过ESB统一进展访问协议转换应用统一通过ESB来访问后端效劳效劳与效劳之间也通过ESB来互相调用以此降低系统的耦合程度。这种单个应用拆分为多个应用公共效劳单独抽取出来来管理并
15、使用企业消息总线来解除效劳之间耦合问题的架构就是所谓的SOA面向效劳架构这种架构与微效劳架构容易混淆因为表现形式特别相似。个人理解微效劳架构更多是指把系统里的公共效劳抽取出来单独运维管理的思想而SOA架构那么是指一种拆分效劳并使效劳接口访问变得统一的架构思想SOA架构中包含了微效劳的思想。架构瓶颈业务不断开展应用以及效劳都会不断变多应用以及效劳的部署变得复杂同一台效劳器上部署多个效劳还要解决运行环境冲突的问题此外对于如大促这类需要动态扩缩容的场景需要程度扩展效劳的性能就需要在新增的效劳上准备运行环境部署效劳等运维将变得特别困难。第十三次演进引入容器化技术实现运行环境隔离与动态效劳管理目前最流行
16、的容器化技术是Docker最流行的容器管理效劳是Kubernetes(K8S)应用/效劳可以打包为Docker镜像通过K8S来动态分发以及部署镜像。Docker镜像可理解为一个能运行你的应用/效劳的最小的操作系统里面放着应用/效劳的运行代码运行环境根据实际的需要设置好。把整个“操作系统打包为一个镜像后就可以分发到需要部署相关效劳的机器上直接启动Docker镜像就可以把效劳起起来使效劳的部署以及运维变得简单。在大促的之前可以在现有的机器集群上划分出效劳器来启动Docker镜像增强效劳的性能大促过后就可以关闭镜像对机器上的其他效劳不造成影响在第18节之前效劳运行在新增机器上需要修改系统配置来适配效
17、劳这会导致机器上其他效劳需要的运行环境被破坏。架构瓶颈使用容器化技术后效劳动态扩缩容问题得以解决但是机器还是需要公司自身来管理在非大促的时候还是需要闲置着大量的机器资源来应对大促机器自身本钱以及运维本钱都极高资源利用率低。第十四次演进以云平台承载系统系统可部署到公有云上利用公有云的海量机器资源解决动态硬件资源的问题在大促的时间段里在云平台中临时申请更多的资源结合Docker以及K8S来快速部署效劳在大促完毕后释放资源真正做到按需付费资源利用率大大进步同时大大降低了运维本钱。所谓的云平台就是把海量机器资源通过统一的资源管理抽象为一个资源整体在之上可按需动态申请硬件资源如CPU、内存、网络等并且之
18、上提供通用的操作系统提供常用的技术组件如Hadoop技术栈MPP数据库等供用户使用甚至提供开发好的应用用户不需要关系应用内部使用了什么技术就可以解决需求如音视频转码效劳、邮件效劳、个人boke等。在云平台中会涉及如下几个概念1IaaS根底设施即效劳。对应于上面所讲的机器资源统一为资源整体可动态申请硬件资源的层面2PaaS平台即效劳。对应于上面所讲的提供常用的技术组件方便系统的开发以及维护3SaaS软件即效劳。对应于上面所讲的提供开发好的应用或者效劳按功能或者性能要求付费。至此以上所提到的从高并发访问问题到效劳的架构以及系统施行的层面都有了各自的解决方案。但同时也应该意识到在上面的介绍中其实是有
19、意忽略了诸如跨机房数据同步、分布式事务实现等等的实际问题这些问题以后有时机再拿出来单独讨论。架构设计经历小结1架构的调整是否必须按照上述演变途径进展不是的以上所讲的架构演变顺序只是针对某个侧面进展单独的改良在实际场景中可能同一时间会有几个问题需要解决或可能先到达瓶颈的是另外的方面这时候就应该按照实际问题实际解决。如在政府类的并发量可能不大但业务可能很丰富的场景高并发就不是重点解决的问题此时优先需要的可能会是丰富需求的解决方案。2对于将要施行的系统架构应该设计到什么程度对于单次施行并且性能指标明确的系统架构设计到可以支持系统的性能指标要求就足够了但要留有扩展架构的接口以便不备之需。对于不断开展的
20、系统如电商平台应设计到能知足下一阶段用户量以及性能指标要求的程度并根据业务的增长不断的迭代晋级架构以支持更高的并发以及更丰富的业务。3效劳端架构以及大数据架构有什么区别所谓的“大数据其实是海量数据收集清洗转换、数据存储、数据分析、数据效劳等场景解决方案的一个统称在每一个场景都包含了多种可选的技术如数据收集有Flume、Sqoop、Kettle等数据存储有分布式文件系统HDFS、FastDFSNoSQL数据库HBase、MongoDB等数据分析有Spark技术栈、机器学习算法等。总的来讲大数据架构就是根据业务的需求整合各种大数据组件组合而成的架构一般会提供分布式存储、分布式计算、多维分析、数据仓
21、库、机器学习算法等才能。而效劳端架构更多指的是应用组织层面的架构底层才能往往是由大数据架构来提供。4有没有一些架构设计的原那么N1设计系统中的每个组件都应做到没有单点故障回滚设计确保系统可以向前兼容在系统晋级时应能有方法回滚版本禁用设计应该提供控制详细功能是否可用的配置在系统出现故障时可以快速下线功能监控设计在设计阶段就要考虑监控的手段多活数据中心设计假设系统需要极高的高可用应考虑在多地施行数据中心进展多活至少在一个机房断电的情况下系统仍然可用采用成熟的技术刚开发的或者开源的技术往往存在很多隐藏的bug出了问题没有商业支持可能会是一个灾难资源隔离设计应防止单一业务占用全部资源架构应能程度扩展系统只有做到能程度扩展才能有效防止瓶颈问题非核心那么购置非核心功能假设需要占用大量的研发资源才能解决那么考虑购置成熟的产品使用商用硬件商用硬件能有效降低硬件故障的机率快速迭代系统应该快速开发小功能模块尽快上线进展验证早日发现问题大大降低系统交付的风险无状态设计效劳接口应该做成无状态的当前接口的访问不依赖于接口上次访问的状态。-|更多精彩文章-资源助手-