1、现代计算机Modern Computer第 29 卷 第 13 期2023 年 7 月 10 日基于Docker容器的高并发Web系统架构设计与实现欧阳习彪*,徐宝林(广东白云学院大数据与计算机学院,广州 510450)摘要:近几年来,随着移动互联网的快速发展,网络用户数激增,搭建一个高可用系统架构已经成为很多企业迫切的需求。以植物大战僵尸游戏系统为背景,探讨用户量大、高并发的Web系统架构设计与实现,该系统基于Docker容器进行项目部署,采用服务器集群、负载均衡、数据库分区分表、高性能服务器缓存等技术,支撑起千万用户、百万日活、数千并发的业务场景,满足了系统高并发、高性能、高可用的要求。关
2、键词:高并发;高可用;负载均衡;缓存;集群文章编号:10071423(2023)13010504DOI:10.3969/j.issn.10071423.2023.13.019收稿日期:20230309修稿日期:20230319基金项目:广东白云学院 2022年度校级科研项目(2022BYKY17)作者简介:*通信作者:欧阳习彪(1987),男,湖南邵阳人,硕士,讲师,研究方向为软件工程,Email:;徐宝林(1972),男,湖南邵阳人,学士,副教授,研究方向为软件工程、信息系统集成0引言高并发系统是当今互联网时代的关键技术之一。随着互联网用户数量的不断增加,社交、媒体以及电商、游戏等Web网站
3、用户数量越来越大,并发流量也越来越高,这对于传统Web系统架构设计提出新的挑战,如何构建高效、稳定、可扩展的系统成为了互联网企业必须面对的问题1。高并发系统架构作为解决这一问题的核心技术,已经成为了各大互联网企业竞争的重要因素。本文将从架构设计和技术选型及实现等方面,对高并发系统架构进行深入研究。探讨如何通过分布式架构、缓存技术、负载均衡等手段来提高系统的性能和可用性,从而为用户提供更好的服务体验。1Docker部署对传统虚拟机技术下LAMP架构部署的Web应用资源消耗大、部署速度较慢等问题,使用Docker可更快地打包、测试以及部署应用程序,过去需要用数天乃至数周的任务,在Docker容器的
4、处理下,只需要数秒就能完成,提供持续集成和持续部署的服务。同时Docker容器包含了运行环境和可执行程序,可以跨平台和主机使用,也避免了开发环境、测试环境、生成环境不一致的问题2。在本系统中采用 docker-compose 编排工具来创建容器和镜像,docker-compose.yml配置内容如图1所示,通过docker-compose命令启动容器,docker images可查看到系统共创建了 php+nginx+mysql+redis 四个镜像以及docker psa命令可看到共创建了php+nginx+mysql+redis四个容器,如图2所示。图 1docker-compose.ym
5、l配置 105现代计算机2023年图 2创建的容器及镜像2基于Docker的系统架构设计与实现面向高并发的Web系统架构设计的核心思想是降低服务器端对资源调度和使用的程度,除了在程序设计应用高效的算法之外,在系统架构上可以采取分布式架构、缓存技术、负载均衡等技术来降低服务器端的数据处理性能开销3。系统架构设计如图3所示。CDN内容分发负载均衡层keepalivedLVSNginx服务器集群图片、css等服务器集群docker容器Redis主从复制主从从主从从从Web应用层数据库应用层用户MySQL主从复制、读写分离从图 3系统架构2 2.1 1CDNCDN内容分发内容分发CDN加速的原理是通过
6、在现有的网络中增加一层网络架构,将目标网站的内容发布到最接近用户的网络“边缘”,使用户可以就近取得所需的内容,提高用户访问网站的响应速度。CDN 主要是用来缓存网站中的静态数据,如:CSS、JS、图片和静态页面等数据。用户发送请求到后端服务器,处理完动态内容后,直接从CDN中获取静态数据,从而加快响应时间4。2 2.2 2负载均衡层负载均衡层在高并发系统中,需要保证系统的高可用性和负载均衡,而 Keepalived LVS(linux virtualserver)是一种常见的解决方案。Keepalived LVS通过将请求分发到多个服务器上,来实现负载均衡和高可用性。它使用IP负载均衡技术将网
7、络流量分发到多个服务器,并使用虚拟IP地址来屏蔽后端服务器的IP地址。当一个服务器故障时,Keepalived LVS会将请求重新路由到其他可用服务器上,从而保证系统的高可用性。2 2.3 3WebWeb应用层应用层2 2.3 3.1 1动静分离动静分离通过中间件将动态请求和静态请求分离,可以减少不必要的请求消耗,同时能减少请求的延时。动静分离后,即使动态服务不可用,静态资源也不会受到影响。2 2.3 3.2 2负载均衡负载均衡随着网站用户量不断增大,同一时间请求数不断提高,单台服务器已经不能满足需要,此时需要进行服务器扩容,将客户端发过来的请求分摊到其他服务器上,减少每台服务器的压力,进而提
8、高系统的吞吐率;另外如果其中某一台服务器宕机,其他服务器还可以正常提供服务,以此来提高系统的可伸缩性与可靠性。常见的负载均衡算法有轮询、加权轮询和hash。在本游戏系统中由于三台服务器配置一样,故选用加权轮询的策略,nginx负载均衡主要配置如图4所示。Http RequstNginx后端服务器集群192.168.0.13192.168.0.14192.168.0.15upstream zwdzjszz server 192.168.0.13 weight=1;server 192.168.0.14 weight=3;server 192.168.0.15 weight=6;sever lis
9、ten 80;.location /proxy_pass http:/;图 4nginx负载均衡机制示意图 106欧阳习彪等:基于Docker容器的高并发Web系统架构设计与实现第13期2 2.4 4数据库应用层数据库应用层2 2.4 4.1 1分布式数据库分布式数据库高并发系统中,随着业务的发展,系统用户数越来越多,单表数量达到一定量的时候,可能会导致表中索引失效,查询速度变得非常慢,同时现有的单台数据库服务器满足不了业务需求,需要进行扩容,本系统主要采用数据库分布式部署、负载均衡、分库分表、读写分离的技术来满足高并发场景下数据库服务器的高性能、高可用特性5。(1)读写分离:由于业务中大多数
10、是处理读的操作,数据库的压力主要是由这些读的请求造成的,通过数据库读写分离,能有效减少数据库的压力,提高查询响应速度。(2)主从复制:对系统进行读写分离后,主服务器负责写入操作,从服务器负责读操作,由于读和写操作不是同一个表,会导致数据不一致的问题。因此,需要通过主从复制的方式来同步数据,保证主从服务器数据的一致。(3)数据库负载均衡:在主从部署的数据库集群系统中,从服务器通常有几台,为了分摊系统请求压力,最大化利用每台从服务器,本系统中采用 Haproxy+Keepalived 负载均衡技术,通过Haproxy实现负载均衡,Keepalived确保即使主服务器宕机,从服务器仍旧可以作为主服务
11、器使用,保证系统的高可用性。(4)分库分表:在高并发数据量大的系统中,频繁的IO操作成了数据库的性能瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值,使得可用数据库连接少甚至无连接可用。通过分库分表,将数据分散存储,使得单一数据库/表的数据量变小来缓解单一数据库的性能问题。在本游戏系统中,用户千万级,游戏记录表数据每日新增量非常大,单表已不能满足需要,故采用范围分表的方式,共分为20个子表,每个子表存放500000条记录,根据用户ID对单表最大记录数 500000取商,再加 1,以此确定当前用户游戏数据对应保存的子表序号,具体实现代码如下:const MA
12、X_TABLE_INDEX=20;const TABLE_SIZE=500000;const TABLE_PREFIX=arena_battle_record;/指定子表序号public static function tableIndex($userId=null)return$userId time();/redis缓存玩家游戏数据$redis-hMSet($cache_key,array_merge($gdata,$cache_value);unset($gdata);107现代计算机2023年/保存数据变化的UID列表$redis-sAdd(self:getChangedUserExt
13、UidsCacheKey(),$uid);return true;/*定时任务将缓存中的玩家游戏数据同步到数据库*/private function doTask()$redis=RedisHelper:getRedis(persistence);$cache_key=UserExt:getChangedUserExtUidsCacheKey(Carbon:yesterday()-format(Ymd);$count=0;if($redis-exists($cache_key)$count=$redis-sCard($cache_key);Log:get()-info(准备将用户游戏数据从缓存
14、同步到数据库!数量:.$count);$iterator=null;while($changedUidList=$redis-sScan($cache_key,$iterator)foreach($changedUidList as$uid)$cache_value=$redis-hGetAll(UserExt:getUserExtCacheKey($uid);if($cache_value)$this-saveCacheData($uid,$cache_value);unset($cache_value);elseLog:get()-info(将用户游戏数据从缓存同步到数据库未执行,Cach
15、e Key不存在);由于 redis 是纯内存操作,内存空间有限,在高并发系统中一台redis服务器并不能满足系统高可用的要求,本游戏系统中采用一主二从的架构,通过主从复制实现了数据的热备份,当主服务器宕机时,从服务器可以充当主服务器进行使用,同时在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务,分担服务器负载;尤其是在写多读少的情况下,通过多个从节点分担读负载,可以大大提高redis服务器的并发量。3结语对于大流量、高并发系统,任何一个环节到达性能瓶颈都可能导致系统宕机崩溃,进行在进行系统架构设计时,每一层都需要考虑系统的可用性、扩展性、安全性,等等。本文从接入层
16、、应用层、数据存储层三个方面进行了探讨,利用 DNS 加速、负载均衡、redis 主从、MySQL主从复制、MySQL读写分离等技术实现了系统高并发、高性能、高可用的特性。参考文献:1 何双元.高并发下消息队列模型的研究与应用D.武汉:武汉理工大学,2015.2 庄欠满.面向高并发的Web系统架构设计 J.科技创新导报,2013,4:33.3 肖小芳,宋建新.Docker网络通信研究与实现 J.通讯世界,2017(22):12.4 曹敏,吴博.内容分发网络技术的比较与分析 J.中州大学学报,2008,25(2):109110.5 张清涛.基于MyCat的数据库读写分离技术的研究与应用 J.现代
17、信息科技,2021,8(5):125129.Design and implementation of high concurrent Web system architecturebased on Docker containerOuyang Xibiao*,Xu Baolin(Faculty of Mega Data and Computer,Guangdong Baiyun University,Guangzhou 510450,China)Abstract:In recent years,with the rapid development of mobile Internet and
18、the surge of network users,building a high availability system architecture has become an urgent demand of many enterprises.Based on the game system of Plants vs.Zombies,thispaper discusses the architecture design and implementation of Web system with large number of users and high concurrency.Based
19、on Docker container for project deployment,this system adopts server clustering,load balancing,database partition and table,highperformance server cache and other technologies to support business scenarios with tens of millions of users,millions of daily livesand thousands of concurrent transactions.The system meets the requirements of high concurrency,high performance,and highavailability.Keywords:high concurrency;high availability;load balancing;cache;cluster 108