专业的IT培训机构|腾科IT教育集团
复制成功
微信号:togogoi
添加微信好友, 详细了解课程
已复制成功,如果自动跳转微信失败,请前往微信添加好友
打开微信
图片

腾科新闻

千万级PV高性能高并发网站架构设计

发布时间: 2022-03-28

随着网站的知名度和宣传力度越来越高,注册用户超过千万了,而且每天都有持续增涨的趋势,而PV/日已经有向千万/日靠近的趋势,原有的Web架构越来越满足不了我们的需求了。

这时候需要设计出高性能高可用的网站架构,在这套架构里,运维架构师应该做的是提升站点的整体性能和可用性,不只是前端代理,后端应用服务器、数据库、中间件等,都要综合考虑。这个架构里任何一个点存在瓶颈,整体系统处理能力都会大打折扣,我们不要让它们之一形成短板效应,网站拓扑图如图1所示。


图1 网站系统架构设计图


机房的选择应尽量选择BGP机房,双线次之。BGP机房的优势如下:

·服务器只需要设置一个IP地址,最佳访问路由是由网络上的骨干路由器根据路由跳数与其他技术指标来确定的,不会占用服务器的任何系统资源。服务器的上行路由与下行路由都能选择最优的路径,所以能真正实现单IP高速访问。

·由于BGP协议本身具有冗余备份、消除环路的特点,所以当IDC服务商有多条BGP互联线路时可以实现路由的相互备份,其中一条线路出现故障时路由会自动切换到其他线路。

·使用BGP协议还可以使网络具有很强的可扩展性,可以将IDC网络与其他运营商互联,轻松实现单IP多线路,使得所有互联运营商的用户访问都很快,这个是双IP双线路无法比拟的。

1.硬件防火墙(可选)

硬件防火墙的模式可以选择路由和透明两种,可根据具体环境而定。防火墙的型号一般选择用华赛或Juniper,大家可以根据自己业务网站的实际需求来加以选择,硬件防火墙的主要作用是用来防止DDoS攻击和端口映射。当然了,因为现在网站基本上都会有CDN服务,是否增加硬件防火墙是可以考虑的。

如果我们的网站是用于电子商务支付系统的,建议在前端放置硬件防火墙,国内的DDoS攻击是非常流行的,对付DDoS是一个复杂而且庞大的系统工程,想仅仅依靠某种系统或产品来防住DDoS是不现实的。可以肯定的是,目前完全杜绝DDoS是不可能的,但通过适当的措施抵御90%的DDoS攻击是可以做到的,基于攻击和防御都有成本开销的缘故。若通过适当的办法增强了抵御DDoS的能力,也就意味着加大了攻击者的攻击成本,那么绝大多数攻击者将因无法继续下去而放弃,也就相当于成功地抵御了DDoS攻击。

2.Z前端CDN缓存

对于图片量较多的电子商务网站和新闻资讯类网站来说,前端CDN缓存的意义重大:可加快用户访问本地网站的速度,从而提升用户体验。但应该使用哪种CDN系统呢?这里也面临着两种选择:自行搭建CDN系统或租赁别人的CDN。个人觉得自行搭建CDN系统是一件非常消耗财力和人力的事情,而且达不到预期目标,如果需要前端缓存,建议以租赁CDN为主,把更多的资金流投入到后端的文件存储和NoSQL缓存服务及数据库上面去。

3.负载均衡器

负载均衡器根据它们的特点来挑选即可,LVS的性能是最好的,特别是后端的节点超过10个以上时,但它对网络的要求很高,而且不支持动静分离,所以建议暂时将其作为数据库的负载均衡。HAProxy性能优异,稳定性强,自带强大的监控页面,并且支持动静分离,我们已用HAProxy+Keepalived实现了亿级/日的网站,在高并发的业务时间段,单HAProxy也是非常稳定,没有发生过宕机的情况。

在大公司的网站架构里,多级负载均衡也是很好的设计方案,最外面流量的负载均衡可用硬件负载均衡器(例如F5/NetScaler,这个是负责对流量进行转发作用的),以Nginx或HAProxy作为二层负载均衡根据频道或业务来分流。现在很多读者参考淘宝的架构,说网站最前端一定要放四层负载均衡,这个其实是针对淘宝这种巨量访问级别(十几亿PV/日)网站的,如果是千万级PV/日的网站,甚至是亿级PV/日的网站,用HAProxy/Nginx+Keepalived基本就可以满足需求了。

另外有个情况跟大家说明下,通过观察线上高流量网站的HAProxy负载情况,会发现HAProxy在高并发的情况下还是比较耗费CPU资源的,建议大家在此架构中采用高性能的服务器,建议使用DELL PowerEdge R710或更高型号的机器。另外,HAProxy/Nginx相对于LVS的优势如下:

·配置简单,语法通俗易懂。

·HAProxy/Nginx对网络的依赖性小,理论上只要ping得通的网络就可以部署实施七层负载均衡。

·根据应用配置URI路由规则,集中热点来提高缓存的命中率。·根据URI路由规则来进行动静分离。

4.Web缓存层

Web缓存层的搭建可以使用Squid或Varnish。笔者在公司的不少项目中都应用过Squid服务器,它作为老牌的反向代理服务器,在生产环境下的稳定性是有保证的。但Squid对多核CPU支持得不好,大家可以尝试下新兴的Varnish,它在稳定性和性能上不亚于Squid,而且对多核CPU支持得也很好,性能要优异于Squid。

有的朋友可能会疑惑,为什么前端已经有了CDN缓存,这里还需要自己再架设一层Web缓层呢?如果做过高并发高流量项目的朋友应该会发现,后端NFS文件服务器的I/O压力是巨大的,有时甚至会发生拒绝提供服务的现象,有了这层Web缓存,可以起到加速后端Web服务及降低NFS(或本地存储)文件服务器磁盘I/O压力的作用。

5.Web服务器及Servlet容器

关于Web服务器的选择,Apache作为Web的传统服务器,应用于电子商务、电子广告、页游网站都是非常稳定的,在8GB内存的标准配置下,抗并发能力也是非常不错的。许多公司的网站架构其实都是由最原先的一台Apache Web服务器发展起来的(公司高层要求平滑不中断业务升级)。

如果是访问量比较大的网站,建议用Nginx作为Web服务器。如果是每天访问量千万PV级别的网站,在业务高峰期间PV有可能过亿。推荐利用Java语言作为其网站核心开发语言。关于Servlet容器,可以考虑Tomcat和Jetty,尤其是Jetty,在我们的微信营销网站中,表现优异。我们利用Nginx配合Jetty,单机能够承受两万左右的并发连接。一些Web聊天应用非常适合用Jetty做服务器,像淘宝的Web旺旺就是用Jetty作为Servlet容器的。Jetty的详细工作原理及与Tomcat的比较可以参考文章:https://www.ibm.com/developerworks/cn/java/j-lo-jetty/。

6.文件服务器层

经过后期的宣传策划,网站的客户越来越多,原先的DRBD+Heartbeat+NFS高可用文件服务器的磁盘I/O压力也越来越大,这个时候就应该考虑采用分布式文件存储方案了,MooseFS或GlusterFS现在在国内也是很流行的趋势。

虽然分布式文件存储对于减轻文件服务器压力方面有所缓减,但它们占用机器的数量还是比较多的,维护起来比较复杂;而单NFS维护起来非常容易,事实上在有前端CDN和缓存层的前提下,还可以针对文件服务器进行NFS分组,这样从业务层面来就会更进一步减小NFS的压力。

·现在再说下图片服务器的问题,建议大家采用独立域名而非二级域名的方式,原因如下:

·主要是为了避免传输不必要的Cookie,从而提升速度而且减少不必要的攻击,因为跨域是不会传输Cookie的。

·多个域名可以增加浏览器并行下载的条数,因为浏览器对同一个域的域名下载条数是有限制的。

7.SessionSession数据默认是在各个服务器上分别存放的,这样的话,客户端在某一次请求过后,很有可能会将请求发送到集群中的另外一台机器上,这样就会导致Session的丢失。所以这里采用一台独立的Memcached或redis服务器来存储整个网站的Session数据,然后解决各个服务器中Session不同步的问题。

这里不推荐将Session放进MySQL的做法,在高流量的网站中,数据库的压力是非常大的,不应该再让Session的问题来增加数据库方面的压力了。另外,也不推荐采用Session复制的方式,Session复制的原理是通过组播的方式进行集群间的Session共享,比如我们常用的Tomcat目前就具备这样的功能。优点是Web容器自身支持,配置简单,这种处理Session的方式只适合小中型网站。缺点是当一台机器上的Session变更后会将变更的数据以组播的形式分发给集群间的所有节点,对网络和所有的Web容器都是存在开销的,集群越大浪费越严重。

运维架构师可以根据网站的实际情况来选择是否采用这种做法。

8.数据库的压力

最后再说下数据库方面的压力,这个环节经常是整个网站的性能瓶颈所在,所以我们要在这上面投入足够多的精力。网站上线以后,如果数据库的读写压力巨大,磁盘I/O负载越来越高,这时候应该怎么办呢?首先是增加数据库缓存,redis、Memcached等NoSQL数据库作为数据库缓存都非常理想,他们在减轻数据库读写压力方面效果显著,事实上,像很多业务数据,放在redis的效果要比放在MySQL里面好得多,比如IP List业务数据,一次导入量动辄十几亿条,放在redis里面的读取速度要远远优于MySQL,同时也会大大减轻MySQL数据库的压力。在这里大家需要注意一个情况,虽然我们可以用redis来提升网站性能,但也有一个弊端:如果需要Cache的数据对象非常多的时候,应用程序要增加的代码量就会很多,同时网站复杂度及维护成本也在直线上升,这个时候开发部门和系统部门的同事们就要协同工作了。

1)数据库架构可以采用一主多从,读写分离的方案,用LVS+Keepalived作为从数据库的负载均衡器,通过程序实现读写分离,前后台业务逻辑分离,针对后台的查询我们全部转到Slave机器上,这样就算查询的业务量再大的话也不会影响主要业务逻辑。

2)对网站的业务数据库进行分库,后面的业务是一组数据库,如Web、BBS、Blog等,对主要业务数据库进行数据的水平切分或垂直切分也是非常有必要的。综上所述,设计这种高流量高并发的网站系统架构,应该尽量做到以下几点。

·尽量把用户往外面推,保证源站的压力小。

·在网站测试阶段尽量做好压力测试的工作。

·保证网站的高可用。

·保证网站的高可扩展性。

·多利用NoSQL来减轻后端数据库的压力。

·合理优化数据库。做到了以上几点,我们的网站应该能够承受更大流量和并发量的冲击。

上一篇: CSMA/CD算法原理

下一篇: 数据库块的定义

在线咨询 ×

您好,请问有什么可以帮您?我们将竭诚提供最优质服务!