千万级用户的大型网站,应该如何设计其高并发架构?

news/2024/5/9 5:08:00/文章来源:https://blog.csdn.net/l18848956739/article/details/95231235

目录

(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、搜索、分布式文件系统、反向代理,等等很多话题,但是本文不能一一涉及,主要是在高并发这个角度分析一下系统如何抗下每秒上万的请求。

转载自:狸猫技术窝 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_837864.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站发展历程九大阶段,及知识体系梳理

目录 网站发展历程 java入门 框架基础 阶段一:单体项目 阶段二:物理分离应用和数据库 阶段三:缓存化、静态化 阶段四:应用负载均衡,集群 阶段五:动静分离 阶段六:分布式缓存、缓存集群…

基于docker+reveal.js搭建一个属于自己的在线ppt网站

前言 最近热衷于Docker,由于这段时间使用Docker来折腾自己的服务器,越来越感觉这是一种极其被应该推广的技术,因此想在公司内部也做一次技术分享。当然,如果只是做的PPT,我就不写这文章了。既然把Docker说这么好&#…

seo是计算机专业毕业,本科计算机专业的他,在34岁时成为了银行行长

曾经看到过这样一段话,意思是说个人成长和人生选择过程中有这三个悖论:在你18岁对学科与知识一无所知的时候,就被要求选择自己的专业;在你22-25岁对商业世界运行规则毫无概念的时候,就被要求选择工作方向;在你25-28岁对自己和人际…

oss存html静态文件,Github改造成免费OSS对象存储,加速网站静态文件(js/css/字体文件)...

今天小白看到一篇文章,可以把github改成图床使用。小白测试了一下CDN居然还是国内的。那么咱们也可以把它改造成oss来加速网站使用。如果你是wordpress,那么可以查看以下文章:wordpress免插件实现静态资源CDN 。其他程序的话就得自己研究下怎…

支付宝电脑网站支付

选择电脑网站支付,填写信息,创建网站应用 下载demo  https://docs.open.alipay.com/54/106682/ 填写配置信息 同步和异步。 1.同步是给用户发的。用get 2.异步是被服务器发的。用post 当一个支付请求被发送到支付渠道方,支付渠道会很快返回…

python3.6+django2.0+mysql搭建网站

之前用过python2.7版本,改用3.6版本发现很多语法发生了变化。 在templates里新建一个html文件,命名为index.html作为要测试的界面, 新建一个应用,Tools-》Run manage.py Task 输入startapp应用名称 然后对urls进行配置&#xff0…

GitHub上搭建个人网站

大致如下步骤:1、注册Git账号2、创建SSH keys3、新建repository---4、设置网站5、clone库到本地6、提交、上传7、预览本教程默认你了解GitHub的基础之上 会使用基本命令,如果不了解 前三步可参考文章:GitHub入门教程 GitHub创建SSH Keys一、…

Bootstrap网站模板

分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow基于上一篇文章,觉得再这样写下去,意义不大,决定收手。还是直接做…

角点 python实现_角点科技教你怎么自己搭建电影网站

如何自己搭建电影网站?随着网络的发展,很多人都对网站的产生了兴趣,开始大多数人并不知道网站是怎么搭建 的,接下来角点科技的小编就来和大家聊聊如何自己搭建电影网站。前期准备:域名空间(几大主流服务商&…

云速建站_【云速建站】云建站的最初动机和试探之路

一直想写一篇华为云的文章,今天就描述下我的华为云体验之旅。一、 独行键盘侠作为程序员,老有研究技术的冲动,csdn,GitHub,技术论坛没少逛。有一天突然想能不能有一台自己专属的服务器,既可以自己研究下技术…

Socket和访问网站慢的问题

目录 TCP/IP socket 一、socket()套接字有哪些? socket通信流程 四、如果你访问一个网站很慢,怎么排查和解决? TCP/IP 要想理解socket首先得熟悉一下TCP/IP协议族, TCP/IP(Transmission Control Protocol/Intern…

【一周安全热点】湖北首例入侵物联网案致十万台设备掉线|俄罗斯多个政府网站共泄露225万公民信息...

湖北首例入侵物联网案致十万台设备掉线,暴露企业重业务轻安全 近日,湖北省破获首例入侵物联网计算机信息系统刑事案件。经统计,受害公司因超百台设备被恶意升级、10万台设备“被”离线而无法使用。 互联网发展早期,企业往往对安全…

在.net core上,Web网站调用微信支付-统一下单接口(xml传参)一直返回错误:mch_id参数格式错误...

这是 微信支付-统一下单 接口文档 一、问题描述 在调用统一下单接口时,报mch_id参数格式错误,但商户ID确实是10位数字正确的,可就是一直报这个错误 返回的错误xml如下: 二、排错过程 1、多次对比官网xml格式,确认生成…

连接打印机提示:找不到驱动程序,windows在网络上找不到Canon LBP2900的驱动程序,若要手动查找,请单击“确定”。否则,请单击“取消”并咨询你的网络管理员或者访问打印机制造商的网站

本机系统:windows server 2012 Datacenter Evaluation Build 9200 bit64 打印机USB连接的系统: windows XP SP3 bit32 解决: 问题在于本机系统与对方系统不一样,无法复制给你对应的驱动(一个是win2012,一个是xp ; 一个是64位,一个是32位) 那么就只能在网上下载本机系统的对应驱…

一文读懂网站SEO优化国际版

前言 SEO即Search Engine Optimization搜索引擎优化,目的是通过提升网站在搜索引擎的排名来提升网站的自然流量。简而言之,SEO的工作原理是向搜索引擎证明您的内容是当前主题的最佳结果。SEO技术涉及关键字研究、内容创建、链接构建和技术审核等内容。 G…

apache网站服务器

apache简介 Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通…

freebsd+Heartbeat2+php+postgres实现数据库复制和高可用网站

用2节点实现。采用heartbeat老版本2.x , 采用自己编写的resource agent,没有采用OCF 1 安装freebsd——废话 2 安装apache php (略) postgres,并设置复制,见: http://blog.csdn.net/zeeeitch/ar…

python爬取网站图像文件(网络爬虫)

一、代码 from bs4 import BeautifulSoup from bs4 import UnicodeDammit import urllib.request import threading def imageSpider(start_url):global threadsglobal counttry:urls[]requrllib.request.Request(start_url,headersheaders)dataurllib.request.urlopen(req)da…

html5 交互性网站,HTML5和CSS3的新交互性盘点:炫酷体验

【IT168 技术】本文标题的这副图片,是用Phosotshop制作的。但是,在搜索引擎中你却无法搜索到它,搜索引擎还没有强大到能够识别图片里面的文字。并且由于图片的体积不算太小,可能网速慢的网友在浏览的时候不得不耐心的等待图片的刷…

百度云cdn设置州五年制大专_使用CDN提升网站速度

CDN是什么鬼,下面我们就来介绍一下,CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块&#x…