面对峰值响应冲击,解决高并发的三大策略

老毛 2018-08-20 10:27:37
当前在互联网+的大潮下,众所周知淘宝、京东这些交易系统每天产生的数据量都是海量的,每天的交易并发也是惊人的,尤其是“双11”、“6.18”这些活动,对系统的峰值响应提出了非常高的要求,所以对系统架构也就有了很要的要求。

 

在写这篇博客的前2天,听说某系统在25人的用户量下就宕机了,实在让人震惊,所以捋了下互联网交易系统我们可以采取哪些技术来解决互联网平台下大数据量高并发的问题。

 

首先根据架构分层把不同技术进行了一些分类,如下图:

 

互联网技术架构分层策略图

 

接下来我会逐一解释各个技术的大概原理和思路,供大家参考和学习:

 

一、互联网层

 

1、负载均衡
 

 

负载均衡英文名称为Load Balance,意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

 

比如Nginx是一款可以通过反向代理实现负载均衡的服务器,把流量导向不同的服务器;现在的云平台都提供了负载均衡服务,不过需要单独付费,比如阿里的SLB。

 

2、内容分发网络(CDN)
 


内容分发网络基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。

 

通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。

 

其目的,是使用户可就近取得所需内容,解决Internet网络拥挤的状况,提高用户访问网站的响应速度。这个不需要单独去实现,可以用现成的产品去做,比如: Akamai(好些,比较贵),Verizon EdgeCast(便宜些),ChinaCach;如果是云平台基本上都提供了这个服务,不过也需要付费的,比如阿里云基于自己的CDN加速提供了不同形式的加速;比如基于P2P技术的PCDN,增强防护DDoS、CC、Web应用攻击的SCDN以及全站加速。

 

二、Web服务器层

 

1、Session→Cookie


传统的B/S架构都是把用户会话放到Session里面,在在线用户量不高的情况下没啥问题,但是对于现在互联网采取了分布式或者微服务架构,就很难单独去维护Session了,因为Session会分布在不同的服务器上,会话的同步会面临着很大的问题。所以一种方式是把Session的维护拿到Cookie里去做,不依赖于某台或多台服务器,同时也减少了服务器的开销。当然,也可以利用内存缓存服务器来统一存储Session信息,有的内存缓存服务器还能把内存数据持久化到磁盘来提高可用性和可恢复性,就不会有同步问题了。

 

2、Static page


动态页面静态化,为什么又要把动态网页以静态网页的形式发布呢?一个很重要的原因就是搜索引擎;另一个重要原因就是提高程序性能。

 

很多大型网站,进去的时候看它页面很复杂,但是加载也没有耗费多长时间,原因在于先于用户获取资源或数据库数据,进而通过静态化处理,生成静态页面。所有人都访问这一个静态页面,而静态化处理的页面本身的访问速度要较动态页面快很多倍,因此程序性能会有大大的提升。使用场景是那些经常需要访问但是数据不经常更新的时候。这种情况就是时候将动态页面静态化了,比如淘宝的宝贝信息页面,页面动态部分可以用AJAX加载进来,比如月销多少笔。

 

3、Cache

 

缓存,Web服务层的缓存依赖于下面三个方面:

 

  • 浏览器端的缓存,比如CSS/JS等;

  • 在CDN这类技术当中大量页面缓存来提高就近访问速度;

  • 自己搭建内存缓存服务器对频率访问比较高的页面进行缓存,比如首页等。

 

4、Gzip

 

利用浏览器能自动进行Gzip解压缩的原理对访问页面和资源(含图片、JavaScript、CSS等)进行Gzip压缩,减少文件大小,以此来提高网络加载速度。

 

5、One file

 

原理是把多个需要加载的内容合成一个文件,减少加载次数和网络连接时间,提高访问效率,比如把小图标集合合成一个大图片,把CSS/JavaScript 合成到一个文件里面。

 

6、Cluster

 

集群和传统的高性能计算机技术相比,计算机集群通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作。在某种意义上,它们可以被看作是一台计算机。

 

集群系统中的单个计算机通常称为节点,通常通过局域网连接,但也有其它的可能连接方式。集群计算机通常用来改进单个计算机的计算速度和/或可靠性。一般情况下,集群计算机比单个计算机(比如工作站或超级计算机)性能价格比要高得多,大多数集群采用主从式来管理集群节点,比如Websphere Cluster。

 

和常见的分布式的不同点在于:集群是同一个业务部署在多个服务器上;分布式是一个业务分拆成多个子业务,或者本身就是不同的业务,部署在不同的服务器上。

 

简单地说,分布式是以缩短单个任务的执行时间来提升效率,而集群则是通过提高单位时间内执行的任务数来提升效率。

 

三、应用服务器或者业务服务器层

 

1、Distributed/分布式|SC/服务中心|微服务|Decouple/解耦


分布式系统是支持分布式处理的软件系统,是由通信网络互联的多处理机体系结构上执行任务的系统。简单来说,分布式处理就是多台相连的计算机各自承担同一工作任务的不同部分,在人的控制下同时运行,共同完成同一件工作任务。包括分布式操作系统、分布式程序设计语言及其编译系统、分布式文件系统、分布式数据库系统、分布式调度系统等。这常常伴随需要做负载均衡、熔断和限流等;还得考虑是全量计算还是增量计算等。


所以随着分布式的发展,微服务架构就变得越来越流行,它的主要作用是将功能分解到离散的各个服务当中,从而降低系统的耦合性,并提供更加灵活的服务支持,围绕业务领域组件来创建应用,这些应用可独立地进行开发、管理和迭代。在分散的组件中使用云架构和平台式部署、管理和服务功能,使产品交付变得更加简单,所以业务的解耦和拆分的就变得越来越重要。

 

现在随着容器(Docker)的发展让分布式、微服务变得更加灵活和容易,也让现在支持大数据量高并发提供了很好的基础设施。

 

2、Cache

 

这一层的缓存主要是对高频数据进行缓存,比如对中间计算结果进行缓存,而且是基于内存缓存居多,比如Memcached和Redis,有的还提供缓存持久化,比如Redis。在分布式计算中经常要对批量数据进行缓存预读取以提高计算速度。

 

3、同步转异步/MQ


同步转异步的思路一方面不让进程或者线程阻塞在顺序执行里,从而加快程序的执行,就像Node.js用异步和Java用同步做相同计算测试,好多时候速度Node.js比Java还快,不信大家可以试试,像双11的抢购都是采用了异步机制。

 

另一方面不让用户一直等在那里,用户可以继续做别的事情,等异步执行完毕通知用户。这里面大量用到了消息队列(MQ),流行的产品很多,最早的WebsphereMQ,到现在的Kafka、RabbitMQ,有些甚至和流行的开源框架紧密集成,比如RabbitMQ和SpringBoot。

 

四、数据访问、文件访问、内部网络访问层

 

1、读写分离


因为在大数据量并发情况下,读的操作频率远远超过写操作,所以通过读写分离来提高读的速度,其思路是让主数据库(master)处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库(slave)处理SELECT查询操作,下面是淘宝最早的时候采用的读写分离策略:

 

读写分离示意图

 

2、DB Cluster

 

集群就不再做过多说明,数据库集群是利用至少两台或者多台数据库服务器,构成一个虚拟单一数据库逻辑映像,像单数据库系统那样,向客户端提供透明的数据服务。其目的还是为了增加数据吞吐量,提高数据库性能,满足大数据量下对数据的读写速度要求。

 

阿里云的RDS云数据库就继承了上述2大特征,外面看来是一个MySQL集群,提供统一的透明访问,而在内部就自动实现了读写分离,为高性能数据库存储提供了很大便利。

 

3、分布式存储(DAS/NAS/SAN)

 

三种分布式存储方案,大家可自行百度,各种介绍比较比较多,这里不再赘述,比如阿里的OSS存储也是一种分布式存储。

 

4、Cache

 

缓存无处不在,连CPU都有二级缓存,在数据访问这一层,可以根据你的数据需要充分利用缓存技术来提供读写速度,比如对要求不是特别实时的大数据进行预统计分析,然后缓存下来做报表等,这个时候直接从缓存里读取即可,提高统计速度。

 

5、NoSQL,Key/Value

 

NoSQL,泛指非关系型的数据库。随着互联网Web2.0网站的兴起,传统的关系数据库在应付Web2.0网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其自身的特点(高可扩展性、分布式计算、低成本、架构的灵活性、半结构化数据,没有复杂的关系)得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。其数据库类型有列存储、文档存储、Key/Value存储、对象存储和图存储等。

参考:

http://www.runoob.com/mongodb/nosql.html

看看有哪些优势,劣势,特征以及相关的产品。

 

6、Split/分割,Partition/分区


表分区是DB对于非常大的表进行优化的一种有效方法,是根据数据库定义不同的分区策略决定的,比如取模、时间和哈希等,是非常有效的一种手段,在很多情况下比表分割更有效。

 

比如,有一个代码表使用分区表把100万纪录分在10个分区中(ID每从1到10万为一个分区),那样写查询语句的时候,只要给出查询条件中所需要的代码,DB自动会定位到对应的分区进行查询,大大降低的查询时间。

 

而采用表分割那必须先根据查询的代码指定所要查询的表,才能找到相应的记录,是由DBA或架构师根据业务需要来定义如何分割的。表分割分为水平分割和垂直分割:

 

  • 水平分割:根据一列或多列数据的值把数据行放到两个独立的表中;

  • 垂直分割:把主码和一些列放到一个表,然后把主码和另外的列放到另一个表中。

 

7、BGP

 

边界网关协议,主要用于互联网AS(自治系统)之间的互联,BGP的最主要功能在于控制路由的传播和选择最好的路由。中国网通与中国电信都具有AS号(自治系统号),全国各大网络运营商多数都是通过BGP协议与自身的AS号来互联的。

 

使用此方案来实现双线路需要在CNNIC(中国互联网信息中心)申请IDC自己的IP地址段和AS号,然后通过BGP协议将此段IP地址广播到移动,网通、电信等其它的网络运营商,使用BGP协议互联后移动。网通与电信的所有骨干路由设备将会判断到IDC机房IP段的最佳路由,以保证移动、网通和电信用户的高速访问。现在不少的云平台都支持BGP。

 

五、总结

 

“缓存”、“异步”和“分”是互联网大数据量高并发下架构策略中用的最多的3种策略,从上面各个技术层面,“分”也是占据了大多数技术的核心思想,所以考虑的时候要多想想分哪里、如何分,另外很多业务场景还得想想怎么合。

 

 

作者:老毛

来源:https://zhuanlan.zhihu.com/p/38497647

dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn

活动预告