找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 132|回复: 4

[网站] 设计千万级用户量网站的高并发架构

[复制链接]
  • 打卡等级:热心大叔
  • 打卡总天数:245
  • 打卡月天数:2
  • 打卡总奖励:7719
  • 最近打卡:2025-12-05 20:56:49

350

主题

557

回帖

1万

积分

管理员

积分
10407
发表于 2024-3-11 16:31:08 | 显示全部楼层 |阅读模式
(1)单块架构
网站开始建立时,用户少 , 网站架构都是用单体架构设计,共部署3台服务器,1台应用,1台数据库,1台图片。
1、应用服务器上发布,可能是把应用服务器上的Tomcat给关掉,替换系统的代码war包,重新启动Tomcat。
2、数据库服务器,存全部核心数据。
3、网络文件系统(NFS)作图片服务器,存网站全部图片。应用服务器上代码会连接以及操作数据库以及图片服务器。
如下图所示:

但是这种纯单块系统架构下,有高可用问题存在,最大的问题就是应用服务器可能会故障,或者是数据库可能会故障
所以在这个时期,一般稍微预算充足一点的公司,都会做一个初步的高可用架构出来。
(2)初步的高可用架构
应用服务器而言,集群化部署,初期用户量少的情况下,一般就是部署两台应用服务器,前面会放一台服务器部署负载均衡设备,如说LVS(Linux虚拟服务器),均匀把用户请求打到两台应用服务器上去。
如此时某台应用服务器故障了,还有另外一台应用服务器是可以使用的,这就避免了单点故障问题。如下图所示:

对于数据库服务器而言,此时一般也会使用主从架构,部署一台从库来从主库同步数据,这样一旦主库出现问题,可以迅速使用从库继续提供数据库服务,避免数据库故障导致整个系统都彻底故障不可用。如下图:


(3)千万级用户量的压力预估
这个假设这个网站预估的用户数是1000万,那么根据28法则,每天会来访问这个网站的用户占到20%,也就是200万用户每天会过来访问。
通常假设平均每个用户每次过来会有30次的点击,那么总共就有6000万的点击(PV)。
每天24小时,根据28法则,每天大部分用户最活跃的时间集中在(24小时 * 0.2)≈ 5小时内,而大部分用户指的是(6000万点击 * 0.8 ≈ 5000万点击)
也就是说,在5小时内会有5000万点击进来。
换算下来,在那5小时的活跃访问期内,大概每秒钟会有3000左右的请求量,然后这5小时中可能又会出现大量用户集中访问的高峰时间段。
比如在集中半个小时内大量用户涌入形成高峰访问。根据线上经验,一般高峰访问是活跃访问的2~3倍。假设我们按照3倍来计算,那么5小时内可能有短暂的峰值会出现每秒有10000左右的请求。

(4)服务器压力预估
大概知道了高峰期每秒钟可能会有1万左右的请求量之后,来看一下系统中各个服务器的压力预估。
一般来说一台虚拟机部署的应用服务器,上面放一个Tomcat,也就支撑最多每秒几百的请求。
按每秒支撑500的请求来计算,那么支撑高峰期的每秒1万访问量,需要部署20台应用服务。
而且应用服务器对数据库的访问量又是要翻几倍的,因为假设一秒钟应用服务器接收到1万个请求,但是应用服务器为了处理每个请求可能要涉及到平均3~5次数据库的访问。
按3次数据库访问来算,那么每秒会对数据库形成3万次的请求。
按照一台数据库服务器最高支撑每秒5000左右的请求量,此时需要通过6台数据库服务器才能支撑每秒3万左右的请求。
图片服务器的压力同样会很大,因为需要大量的读取图片展示页面,这个不太好估算,但是大致可以推算出来每秒至少也会有几千次请求,因此也需要多台图片服务器来支撑图片访问的请求。
(5)业务垂直拆分
一般来说在这个阶段要做的第一件事儿就是业务的垂直拆分
因为如果所有业务代码都混合在一起部署,会导致多人协作开发时难以维护。在网站到了千万级用户的时候,研发团队一般都有几十人甚至上百人。
所以这时如果还是在一个单块系统里做开发,是一件非常痛苦的事情,此时需要做的就是进行业务的垂直拆分,把一个单块系统拆分为多个业务系统,然后一个小团队10个人左右就专门负责维护一个业务系统。如下
(6)分布式缓存扛下读请求
这个时候应用服务器层面一般没什么大问题,因为无非就是加机器就可以抗住更高的并发请求。
现在估算出来每秒钟是1万左右的请求,部署个二三十台机器就没问题了。
但是目前上述系统架构中压力最大的,其实是数据库层面 ,因为估算出来可能高峰期对数据库的读写并发会有3万左右的请求。
此时就需要引入分布式缓存来抗下对数据库的读请求压力了,也就是引入Redis集群。
一般来说对数据库的读写请求也大致遵循28法则,所以每秒3万的读写请求中,大概有2.4万左右是读请求
这些读请求基本上90%都可以通过分布式缓存集群来抗下来,也就是大概2万左右的读请求可以通过 Redis集群来抗住。
我们完全可以把热点的、常见的数据都在Redis集群里放一份作为缓存,然后对外提供缓存服务。
在读数据的时候优先从缓存里读,如果缓存里没有,再从数据库里读取。这样2万读请求就落到Redis上了,1万读写请求继续落在数据库上。
Redis一般单台服务器抗每秒几万请求是没问题的,所以Redis集群一般就部署3台机器,抗下每秒2万读请求是绝对没问题的。如下图所示


(7)基于数据库主从架构做读写分离
此时数据库服务器还是存在每秒1万的请求,对于单台服务器来说压力还是过大。
但是数据库一般都支持主从架构,也就是有一个从库一直从主库同步数据过去。此时可以基于主从架构做读写分离
也就是说,每秒大概6000写请求是进入主库,大概还有4000个读请求是在从库上去读,这样就可以把1万读写请求压力分摊到两台服务器上去。
这么分摊过后,主库每秒最多6000写请求,从库每秒最多4000读请求,基本上可以勉强把压力给抗住。如下图:


(8)总结
本文主要是探讨在千万级用户场景下的大型网站的高并发架构设计,也就是预估出了千万级用户的访问压力以及对应的后台系统为了要抗住高并发,在业务系统、缓存、数据库几个层面的架构设计以及抗高并发的分析。
但是要记住,大型网站架构中共涉及的技术远远不止这些,还包括了MQ、CDN、静态化、分库分表、NoSQL、搜索、分布式文件系统、反向代理,等等很多话题,但是本文不能一一涉及,主要是在高并发这个角度分析一下系统如何抗下每秒上万的请求。




好啦,上面就是今天分享的内容啦,希望可以帮到你呀,快快收藏起来吧!!!不要忘记点赞呦!!!
往期有分享SSM框架等模板、Java面试精选题等知识,有需要的朋友可以翻翻;下期会分享微服务知识点汇总等知识,关注我,带你找到高薪工作!!!





  • 打卡等级:热心大叔
  • 打卡总天数:245
  • 打卡月天数:2
  • 打卡总奖励:7719
  • 最近打卡:2025-12-05 20:56:49

350

主题

557

回帖

1万

积分

管理员

积分
10407
 楼主| 发表于 2024-3-11 16:35:50 | 显示全部楼层
火车票代售点大全

全国火车票代售点查询
安徽火车票代售点

北京火车票代售点

重庆火车票代售点

福建火车票代售点

贵州火车票代售点

甘肃火车票代售点

广东火车票代售点

广西火车票代售点

河北火车票代售点

黑龙江火车票代售点

河南火车票代售点

湖北火车票代售点

湖南火车票代售点

海南火车票代售点

吉林火车票代售点

江苏火车票代售点

江西火车票代售点

辽宁火车票代售点

内蒙古火车票代售点

宁夏火车票代售点

青海火车票代售点

山西火车票代售点

四川火车票代售点

陕西火车票代售点

上海火车票代售点

山东火车票代售点

天津火车票代售点

西藏火车票代售点

新疆火车票代售点

云南火车票代售点

浙江火车票代售点





全国各地列车时刻表
华北地区北京天津河北山西内蒙古东北地区辽宁吉林黑龙江华东地区上海江苏浙江安徽福建江西山东中南地区河南湖北湖南广东广西海南西南地区重庆四川贵州云南西藏西北地区陕西甘肃青海宁夏新疆港澳台地区香港






  • 打卡等级:热心大叔
  • 打卡总天数:245
  • 打卡月天数:2
  • 打卡总奖励:7719
  • 最近打卡:2025-12-05 20:56:49

350

主题

557

回帖

1万

积分

管理员

积分
10407
 楼主| 发表于 2024-3-11 16:41:01 | 显示全部楼层
        目录
        (1)单块架构
        (2)初步的高可用架构
        (3)千万级用户量的压力预估
        (4)服务器压力预估
        (5)业务垂直拆分
        (6)用分布式缓存抗下读请求
        (7)基于数据库主从架构做读写分离
        (8)总结
        本文将会从一个大型的网站发展历程出发,一步一步的探索这个网站的架构是如何从单体架构,演化到分布式架构,然后演化到高并发架构的。
        (1)单块架构
        一般一个网站刚开始建立的时候,用户量是很少的,大概可能就几万或者几十万的用户量,每天活跃的用户可能就几百或者几千个。
        这个时候一般网站架构都是采用单体架构来设计的,总共就部署3台服务器,1台应用服务器,1台数据库服务器,1台图片服务器。
        研发团队通常都在10人以内,就是在一个单块应用里写代码,然后写好之后合并代码,接着就是直接在线上的应用服务器上发布。 很可能就是手动把应用服务器上的Tomcat给关掉,然后替换系统的代码war包,接着重新启动Tomcat。
        数据库一般就部署在一台独立的服务器上,存放网站的全部核心数据。
        然后在另外一台独立的服务器上部署NFS作为图片服务器,存放网站的全部图片。应用服务器上的代码会连接以及操作数据库以及图片服务器。如下图所示:




        (2)初步的高可用架构
        但是这种纯单块系统架构下,有高可用问题存在,最大的问题就是应用服务器可能会故障,或者是数据库可能会故障
        所以在这个时期,一般稍微预算充足一点的公司,都会做一个初步的高可用架构出来。
        对于应用服务器而言,一般会集群化部署。当然所谓的集群化部署,在初期用户量很少的情况下,其实一般也就是部署两台应用服务器而已,然后前面会放一台服务器部署负载均衡设备,比如说LVS,均匀的把用户请求打到两台应用服务器上去。
        如果此时某台应用服务器故障了,还有另外一台应用服务器是可以使用的,这样就避免了单点故障问题。如下图所示:




        对于数据库服务器而言,此时一般也会使用主从架构,部署一台从库来从主库同步数据,这样一旦主库出现问题,可以迅速使用从库继续提供数据库服务,避免数据库故障导致整个系统都彻底故障不可用。如下图:




        (3)千万级用户量的压力预估
        这个假设这个网站预估的用户数是1000万,那么根据28法则,每天会来访问这个网站的用户占到20%,也就是200万用户每天会过来访问。
        通常假设平均每个用户每次过来会有30次的点击,那么总共就有6000万的点击(PV)。
        每天24小时,根据28法则,每天大部分用户最活跃的时间集中在(24小时 * 0.2)≈ 5小时内,而大部分用户指的是(6000万点击 * 0.8 ≈ 5000万点击)
        也就是说,在5小时内会有5000万点击进来。
        换算下来,在那5小时的活跃访问期内,大概每秒钟会有3000左右的请求量,然后这5小时中可能又会出现大量用户集中访问的高峰时间段。
        比如在集中半个小时内大量用户涌入形成高峰访问。根据线上经验,一般高峰访问是活跃访问的2~3倍。假设我们按照3倍来计算,那么5小时内可能有短暂的峰值会出现每秒有10000左右的请求。
        (4)服务器压力预估
        大概知道了高峰期每秒钟可能会有1万左右的请求量之后,来看一下系统中各个服务器的压力预估。
        一般来说一台虚拟机部署的应用服务器,上面放一个Tomcat,也就支撑最多每秒几百的请求。
        按每秒支撑500的请求来计算,那么支撑高峰期的每秒1万访问量,需要部署20台应用服务。
        而且应用服务器对数据库的访问量又是要翻几倍的,因为假设一秒钟应用服务器接收到1万个请求,但是应用服务器为了处理每个请求可能要涉及到平均3~5次数据库的访问。
        按照3次数据库访问来算,那么每秒会对数据库形成3万次的请求。
        按照一台数据库服务器最高支撑每秒5000左右的请求量,此时需要通过6台数据库服务器才能支撑每秒3万左右的请求。
        图片服务器的压力同样会很大,因为需要大量的读取图片展示页面,这个不太好估算,但是大致可以推算出来每秒至少也会有几千次请求,因此也需要多台图片服务器来支撑图片访问的请求。
        (5)业务垂直拆分
        一般来说在这个阶段要做的第一件事儿就是 业务的垂直拆分
        因为如果所有业务代码都混合在一起部署,会导致多人协作开发时难以维护。在网站到了千万级用户的时候,研发团队一般都有几十人甚至上百人。
        所以这时如果还是在一个单块系统里做开发,是一件非常痛苦的事情,此时需要做的就是进行业务的垂直拆分,把一个单块系统拆分为多个业务系统,然后一个小团队10个人左右就专门负责维护一个业务系统。如下图




        (6)分布式缓存扛下读请求
        这个时候应用服务器层面一般没什么大问题,因为无非就是加机器就可以抗住更高的并发请求。
        现在估算出来每秒钟是1万左右的请求,部署个二三十台机器就没问题了。
        但是目前上述系统架构中压力最大的,其实是 数据库层面 ,因为估算出来可能高峰期对数据库的读写并发会有3万左右的请求。
        此时就需要引入 分布式缓存 来抗下对数据库的读请求压力了,也就是引入Redis集群。
        一般来说对数据库的读写请求也大致遵循28法则,所以每秒3万的读写请求中,大概有2.4万左右是读请求
        这些读请求基本上90%都可以通过分布式缓存集群来抗下来,也就是大概2万左右的读请求可以通过 Redis集群来抗住。
        我们完全可以把热点的、常见的数据都在Redis集群里放一份作为缓存,然后对外提供缓存服务。
        在读数据的时候优先从缓存里读,如果缓存里没有,再从数据库里读取。这样2万读请求就落到Redis上了,1万读写请求继续落在数据库上。
        Redis一般单台服务器抗每秒几万请求是没问题的,所以Redis集群一般就部署3台机器,抗下每秒2万读请求是绝对没问题的。如下图所示:




        (7)基于数据库主从架构做读写分离
        此时数据库服务器还是存在每秒1万的请求,对于单台服务器来说压力还是过大。
        但是数据库一般都支持主从架构,也就是有一个从库一直从主库同步数据过去。此时可以基于主从架构做 读写分离
        也就是说,每秒大概6000写请求是进入主库,大概还有4000个读请求是在从库上去读,这样就可以把1万读写请求压力分摊到两台服务器上去。
        这么分摊过后,主库每秒最多6000写请求,从库每秒最多4000读请求,基本上可以勉强把压力给抗住。 如下图:




        (8)总结
        本文主要是探讨在千万级用户场景下的大型网站的高并发架构设计,也就是预估出了千万级用户的访问压力以及对应的后台系统为了要抗住高并发,在业务系统、缓存、数据库几个层面的架构设计以及抗高并发的分析。
        但是要记住,大型网站架构中共涉及的技术远远不止这些,还包括了MQ、CDN、静态化、分库分表、NoSQL、搜索、分布式文件系统、反向代理,等等很多话题,但是本文不能一一涉及,主要是在 高并发 这个角度分析一下系统如何抗下每秒上万的请求。

  • 打卡等级:热心大叔
  • 打卡总天数:245
  • 打卡月天数:2
  • 打卡总奖励:7719
  • 最近打卡:2025-12-05 20:56:49

350

主题

557

回帖

1万

积分

管理员

积分
10407
 楼主| 发表于 2024-3-11 16:50:18 | 显示全部楼层
2020.3.30更正  日活已是20w+,pv2000万每日左右
所有服务器全部换成了linux,win性能跟不上
请求网页走阿里云或腾讯云,根据自身需要设置静态缓存时间,动态请求一律不缓存
图片自建多台图源服务器,bgp节点3g独享带宽。
搭建内网做2台热备份服务器,源服务器不对外,所有请求从指定内网机器代理出去。
搭建缓存数据库服务器1台
服务器整体费用在3.8万每月左右,带宽价格尽量找闲置,会比较便宜,长期合同看你和机房怎么谈,机柜费用一般都能免
2021更正:目前电信单线带宽6000左右1g,bgp8500一个g,比前几年便宜了不少,成本差不多,带宽多了1.5g





之前了解了一下国内某团购网站的架构,其中提到了服务器硬件和 pv 以及 qps 的一些关系。
百万级别的访问量,应该指的是 PV 吧。
并发数计算 PV 的粗算计算公式是
qps(或并发数) x 86400(秒)÷  2 (分昼夜)
所以 PV 100万 粗算来并发数只有 23 。

按照经验,剥离图片和js,css 等静态页面,纯动态内容。一台 4 核 4G 内存的机器可以抗住 100左右的并发数。

  • 百万 pv 小网站的 并发只有 23. 1000000 ÷ 86400 x 2 = 23
  • 4核 4G,能抗住100左右的并发, 日 五百万级别的 pv 了。
服务器资源的消耗主要是后端程序这一块,例如 tomcat 或 php 等其他需要链接数据库的程序,还有些需要编译的内容。所以这个公式只能是粗算,因为提供的服务大家各不相同。

概念:
QPS = req/sec = 请求数/秒
qps 是 new 的请求,叫每秒新建链接数, 很多连接进来的链接,已经 tcp 三次握手的完成内容交互之后的,没有超过 tcp 的断开时间,虽然是活动状态,但是已经基本不消耗服务器资源了, 这种是最大活动链接数, 每台机器65535个链接数,这个链接数基本不考虑。
PV = Page View
pv 是指页面被浏览的次数,比如你打开一网页,那么这个网站的pv就算加了一次。






  • 打卡等级:热心大叔
  • 打卡总天数:245
  • 打卡月天数:2
  • 打卡总奖励:7719
  • 最近打卡:2025-12-05 20:56:49

350

主题

557

回帖

1万

积分

管理员

积分
10407
 楼主| 发表于 2024-3-11 17:32:05 | 显示全部楼层


这要看你的网站是以什么为主,比如博客站/门户站,跟视频站是两回事,跟系统站又是另外的东西,侧重点不同,计算的方式也不同.
pv(分昼夜,82法则,即 80W 日间,20W夜间)
tps日间 = 800000 /  60 / 60 / 12 = 18.5
tps夜间 = 200000 / 60 / 60 / 12 = 4.6
不按照综合算也就23 tps
这是前提
文字类的文章发布站,主要以静态资源为主,这类网站
以一篇文章5000字计算 utf8 编码 50000 * 8 / 1024 = 39kb
算上其他静态资源,图片,js,css等等 压缩后 总计按500kb估算
23 * 500 / 1024 = 11.23mb/s
换算成带宽89.84 mbps  也就是百兆宽带
现在随便一台pc小型机(4C8G)都能跑60tps左右,无任何优化(当然博客本身也没什么复杂逻辑)
因此一台4c8g的服务器 配合 百兆宽带就能应对了,不过这后面可能还需要数据库磁盘空间等等成本

12月37日更新
这里之前计算错误,视频类的网站,还需要考虑在线时长,并不是一次性点击就结束的,如果按照23并发,1.5mb/s的带宽的话,那么这23个用户,挂一天,也才23pv而已,不像博客,当然不计算播放时长的话,单独就打开页面的pv来说,还是没区别的。
只是播放视频的服务器要另外计算,要考虑长时间保持连接,一台服务器按照可支持2千人(只做为理论公式计算,实际值可能更低,带宽有限)同时在线观看的话,1.5 * 2000 = 3000 * 8 = 24000 / 1024 ≈ 2.4gbps
同时保持10w人在线点播,需要           100000 / 2000 = 50台这样的服务器,还需要另外的视频存储服务器
这些是最低要求,所以这里是我之前漏算了,抱歉。
以下原答

视频网站pv相同,但带宽稍高,比如你看蓝光,1080P 差不多得1.5mb/s+才能流畅,包括调戏进度条
1.5 * 23 * 8 = 276mbps
也就是同样配置的服务器,但却需要300兆以上带宽才能满足

系统站对于业务复杂度和稳定性要求更高,带宽看实际业务,需要额外的服务器来处理其他复杂的业务逻辑,比如容灾,备份,多系统组合(每个系统都需要服务器,不大可能共用)



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Discuz! X

GMT+8, 2025-12-7 07:34 , Processed in 0.033989 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表