本人网站架构优化(较为全面,倾向于安全、高并发、高可用)的详解、通解

最近一段时间本人对自己网站服务架构进行了优化,起因是网站有时候访问量较大时会卡死(加载超时),后来我在仔细琢磨和思考后就对其进行了升级,详细过程见以下文章(不是专业的,仅供参考,由于金钱实力有限,网站未做到真正所谓的高并发、高可用)。
以下一些内部并非很详细,如有需要可网上检索相关信息或参阅专业书籍了解。

最初的网站架构

本人最初的网站服务端的架构是腾讯云的一台轻量应用服务器,其配置为:4C 8G 10M 100GB(4核心、8G内存、10M的公网宽带、100GB SSD云硬盘)。

在此台服务器上安装的软件(运行环境)有:MySQL、ngnix、redis、PHP等等。即一台服务器要处理数据库、web请求等等多项数据,所以网站访问量大的时候就直接连接超时了。

现以图细说网站结构会更详细:

网站架构图
网站架构图

从左往右看,可以看见服务器/源站这里是数据库(Redis、MySQL)、PHP、Ngnix等等软件都在同一台服务器上,当用户通过浏览器请求时,其请求会通过CDN发送到服务器/源站(图片、压缩文件等静态文件存储在腾讯云COS对象存储中的文件将会通过CDN发送到用户的浏览器),然后服务器/源站对其响应后又通过CDN回到用户的浏览器上解析处理。正是由于数据库、PHP等等诸多软件在同一服务器上,当访问量大时,就会导致服务器处理繁忙,最后堵塞。

所以,本人思考良久,并参考很多技术文章后,决定将重新设计一下网站服务架构,以便可以处理较大的请求量,即向高并发、高可用方向出发。

以下便是正文的开始。

更改后的网站架构

本人经过良久思考并决定使用以下自己设想的网站架构:

更改过后的网站架构
更改过后的网站架构

对比此新架构图和更改前的架构图,不难看出我将Redis和MySQL从服务器分离出来并迁移至腾讯云,从实际数据来看腾讯云的Redis、MySQL性能比我自建的性能更好、数据收发读写能力更强。

现在介绍一下此图不同于最初网站架构的特别之处:

1.MySQL

我将MySQL从服务器中分离出去了,这会降低服务器CPU查询时的负载、释放了原本MySQL占用的内存,这使得服务器只需要处理请求并通过内网访问MySQL数据库读写数据(由于服务器的带宽有限,所以本人将服务器设置为通过内网访问MySQL,这样带宽的局限性就破除了,可以高性能的读写数据,内网带宽可以达5Gbps,实际看数据库实例、服务器实例等相关的限制)。

腾讯云的TDSQL-C数据库集群颇具弹性,功能颇多,这使得业务升级、站库分离(web服务器、数据库分离)等等更加轻松简单。

腾讯云TDSQL-C数据库集群展示图:

腾讯云TDSQL-C MySQL数据库集群管理页面
腾讯云TDSQL-C MySQL数据库集群管理页面

此数据库可以横向、纵向扩展(数据库服务器自身配置的升级、数据库服务器数量增多、读写分离等等),即高扩展性,各位可前往腾讯云官网查看。

倾向于个人博客,碍于学生身份,无收入这一问题,各大云计算厂商都对学生有优惠(原价购买云服务器、云数据库等等这些产品的价格对于学生来说实在有些昂贵),所以这些产商或多或少对学生身份的用户有额外的优惠。

腾讯云TDSQL-C数据库集群“云+校园”活动优惠:

腾讯云TDSQL-C数据库集群“云+校园”活动优惠
腾讯云TDSQL-C数据库集群“云+校园”活动优惠

26元一年,实在很便宜,官网原价一般是800+一年,且在此页面可以优惠续费三次。

购买链接直达:腾讯云TDSQL-C MySQL

关于站库分离,就是数据库和web服务器分离,部分服务器单一地处理数据库读写,部分服务器单一地处理web请求(此处略讲)。

其它关系型数据库也差不多。

2.Redis

本人分离MySQL数据库的同时也将Redis数据库也分离了,极大降低web服务器的负载,这样就可以在一定程度上提高web服务器的并发处理能力。

Redis是什么?Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。由于Redis的特性,根据网站业务的特点,可以将部分MySQL数据库的数据存入内存中,以提高读写速度、程序数据响应速度。其对比常规的数据库(MySQL、SQL Serve等等),主要还是体现在,Redis是数据存在内存中,常规数据库(MySQL这样的)是存在硬盘中,内存读写的速度远远快于硬盘,数据体现在固态硬盘(常规企业级固态硬盘)达到3GB/S,而内存(服务器主流DDR4内存)可达到40GB/S,这相差一个远大于10倍的量级。

本人的Redis也是迁至腾讯云,即腾讯云Redis,关于为何我不去自建数据库服务器,而是迁至云计算平台,在此点上我要说的就是云计算平台的数据库服务器是有很强的优化的,云数据库对比自建的数据库服务器,其区别主要体现在性能(读写、带宽、QPS等等)、安全(Web安全、防火墙等等)、高扩展性(可以轻松升配、扩展)、高可用(故障率非常低)等等方面,这些方面对于个人网站来说或许不是什么大问题,但是对于企业来说是极其重要的,这会影响到企业的业务处理。

Redis也同样是通过内网连接我的Web服务器,对于内网,我在此细说一下:内网不同于公网,内网是可以自行组建且不收取宽带费用的(具体看是否跨地域),而公网是收取费用的,类似于家用宽带这样的(唯一不同的就是云上是公网IP,家用宽带可能没有公网IP)。由于不受运营商的显示,内网的传输速率十分快,具体看硬件规格了,高至Gpbs为单位,甚至是Tbps。

这边推荐一下本人使用的腾讯云Redis,关于腾讯云Redis,没什么优惠(国内的云计算平台提供的Redis基本上差不多,但是部分还是有很大力度的优惠的,最近阿里云、天翼云、华为云都有优惠),一般小型网站(根据业务特点)256MB的内存就够用了,腾讯云这样的配置也才19元/月。链接直达→:腾讯云Redis

其它nosql型数据库也可这样分离分布。

3.用内网连接Redis和MySQL?

原因很简单,就是Web服务器公网宽带有限且腾讯云Redis只能通过内网访问(MySQL可以通过公网访问)。即充分利用服务器的公网宽带,如果是通过公网访问Redis、MySQL数据库,这会占用一部分带宽处理数据收发,导致只有少部分的带宽预留用于处理Web业务收发,故数据库的连接选择内网会是最佳选择。

对于服务器来说,转发流量、处理流量远比去进行程序的计算负载低得多。

4.服务器集群

服务器集群,这里主要指的是安装了Web服务器软件的服务器集群,即处理Web请求的,根据网站业务的不同,也会运行类似于PHP文件进行计算(并非专指数学计算,而是网站功能请求的处理,例如:点赞、验证等等)。

对于本人的网站,即一个集博客、社区、论坛为一体的网站,更改服务器架构后安装的Web软件就是Ngnix-tengine,程序语言就是PHP(程序是WordPress,主题为zibill子比主题)。且新架构新增了一台服务器,即两台服务器轮询进行处理请求,以达到负载均衡。服务器的增多自然就可以提高并发量、高可用性。

至于网站文件如何同步,其实有很多方法,例如:rsync。

还有个重要的就是由于网站业务有登录功能,即Web服务器会保留session、cookie等信息,所以为同步服务器集群内的这些数据(保存用户登录状态等等信息,以防止不同服务器之间session的不同造成用户的异常登出、重复登录等异常情况),我的选择就是在PHP中设置将session保存在Redis数据库中(内网连接,延迟低、读写速度极其高),这样所有服务器都是有连接Redis数据库的,所以session数据都会是一样的,这样就做到了。

如果流量增多,几台服务器处理不过来,可以进行扩展,增添多台服务器直至可以合理分担流量即可,不必做到“多多益善”(这样成本过高)。

5.Ngnix

Ngnix是是一个高性能的HTTP和反向代理web服务器,相对于其它的Web服务器软件,其并发能力很强,且国内多数的企业业务选择的都是Ngnix。

为何我会在此处提到Ngnix?这有什么好优化的?其实本文章的标题就表示出来了,就是要高并发,自然Ngnix是开源的,我后续网站架构升级的选用了Ngnix-Tengine。

Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。它的目的是打造一个高效、安全的Web平台。

Tengine的特性有很多,例如:组合多个CSS、JavaScript文件的访问请求变成一个请求;输入过滤器机制支持。通过使用这种机制Web应用防火墙的编写更为方便;更强大的防攻击(访问速度限制)模块……

这里无脑安装最新版就行了,其高并发能力很强,实际数据就是:相比Nginx默认配置,提升200%的处理能力;相比Nginx优化配置,提升60%的处理能力。这是非常强大的提升了。

所以,针对高并发、大流量的业务场景,Ngnix-tengine无疑是不错的选择。

至于对于企业级的业务场景,还得是针对具体业务具体分析。

6.云储存

云储存,就是云端的存储。为减小Web服务器的存储压力、流量处理压力,本人选择将图片、压缩文件、视频等等储存至云计算平台的对象存储中。

本人使用的就是腾讯云COS储存,不过在此处是再接入了CDN,CDN会缓存这些静态资源,用户访问这些分发内容会更快。

云计算平台的云储存也具有很大的扩展性,成本也远比购买云硬盘低,容量上限也极高,这是非常有利于用户自身的业务部署的。

7.CDN

CDN,即内容分发网络,CDN 是构建在数据网络上的一种分布式的内容分发网。 CDN 的作用是采用流媒体服务器集群技术,克服单机系统输出带宽及并发能力不足的缺点,可极大提升系统支持的并发流数目,减少或避免单点失效带来的不良影响。

一般云计算平台的CDN节点可达成百数千个,单点带宽能力都是几十Gbps起步,总宽带一般都超越1Tbps。

CDN实现的过程原理:用户需将域名解析到对应的CNAME上,网站接入CDN后,CDN会间断性(大概是3~5秒一次)的访问源站,确保源站的连通性。当有多个源站的时候,会进行轮询访问,按照设置权重进行回源等等操作。当用户访问该网站域名时,DNS会解析指向至对应的节点,但是CDN也有负载均衡、智能DNS解析的,所以CDN会将用户的访问指向最近的CDN节点上,这样可以降低延迟,减少响应时长,提高访问速度。同时用户请求会从CDN转发到源站,源站会将其返回,这样就完成了一次访问。

其实CDN的原理在细节上会很复杂,算法也不简单,具体可以自行网上检索CDN相关内容、技术。

为何要用CDN?一定程度上会降低源站服务器的压力,比如一些静态资源可以缓存在CDN节点上以便用户访问快速分发。但是一些网站的构建并非将静态资源和动态资源很明显的划分,所以近几年云计算平台就推出了动静加速、动态加速、全站加速等等CDN的衍生服务,说白了还是CDN,只不过其技术有了很大提升。对于业务动静态内容不是很明确的,全站加速/动态加速/动静态加速会是很好的选择。这一服务的技术原理应该是:通过程序智能识别源站发送到CDN上的内容,结合分发的多组数据对比确定不变的文件(静态)、变的文件(动态),然后静态文件自动缓存,这样就完成动静态的智能分离。自然,由于这一技术对于服务器要求较高,其使用产生的费用也比传统的CDN高得多。

其二,CDN可以在一定程度上隐藏服务器源站,这也是下面要说的信息安全标题的内容之一。

8.信息安全

信息安全,这一词在最近几年的见闻中频频出现,也是我国互联网发展的重点之一。Web安全、系统安全、软件安全、数据加密等等,都是不可忽视的。就本人而言也是最看重信息安全的,对于企业而言,信息安全的重要性是和企业的存亡密切相关的,下面会讲述一些本人对于信息安全的浅显的看法和网站优化建议。

防火墙。防火墙是必要的,开放端口,监视端口异常流量等等。Ngnix防火墙,针对请求中的攻击进行防御,常见的攻击有XSS、SQL注入、CC攻击、Post渗透、Get渗透、恶意User-Agent、恶意扫描、恶意HEAD请求、恶意文件上传等等,所以源站环境不装防火墙(安全软件大类的)是极其危险的,且公网上时刻有主机在无差别扫描暴露端口的服务器并进行无差别的攻击。

其实也可以将服务器/源站这边关闭公网出口,专门配置几台WAF的服务器,将CDN公网进来的流量通过WAF过滤后从内网转发到源站,这样也可提高一定的安全性,在安全组的端口开放这边仅仅对需要的服务器IP开放并时刻监视异常流量包以防止攻击。

定时备份,数据是无价的,无论是服务器/源站的网站文件还是数据库数据,必须定时备份,至于需要完全版备份还是增量备份还是得对业务具体分析了。

灾备,即对于Web服务器故障、数据库故障等等不确定的异常情况需要时刻监控并作出对应措施,其实在负载均衡、CDN这边有设置以及算法指向,也就是其会对源站服务器间歇性访问确保源站服务器的可用性,其实对于企业级的业务来说这是远远不够的,需要在服务器中加入探针类的软件监控服务器的状态,时刻监控(最好小于1s每次),这样一旦出现问题就可以在CDN或者负载均衡这里暂时弃用这台服务器的请求访问(用户传入的流量),直至服务器恢复正常预置的阈值。数据库方面也类似,不过在云计算平台可以设置数据库副本、主从数据库、灾备,在这些云计算平台上会有相关的设置确保业务的正常运转。

监管用户和管理员的权限分配,就是网站或者其它一些业务的用户账号,用户和管理员的最好区分开,甚至需要将管理端和用户端分离,类似前后端分离,甚至域名和通道也得区别开,防止非法提权。

登录的图形验证码、滑块验证,如果正视这一安全验证的话,需要将验证端放在服务器源站端验证并确认,而不是暴露在浏览器这边本地验证(防君子但不防小人),再者就是现阶段的人工智能是完全可以识别并正确填写这些图像验证码、滑块验证码,所以验证应当提升或者混淆人工智能的识别以防止遭到爆破(防火墙这边防CC攻击模块也是可以防止一部分的)。

内容安全,即内容合规性,对网站用户的评论、文章、图片、视频等内容进行智能化审核,可以接入第三方的API,例如:百度审核平台、腾讯云内容安全等等。

DNS安全,DNS攻击基础防御、DNS攻击全力防御,域名服务商是有这项服务的,DNS防劫持等等。(此条更新于2023年1月30日20:55:58)

CDN遭盗刷流量?在CDN管理面板设置下行限速、防盗链、远程鉴权、QPS限制等等。(此条更新于2023年1月30日21:00:31)

一时想不起来了,其实还有很多。

9.业务优化

最后一部分,对于业务优化那就得对其(业务)具体分析了,这其实比较复杂了,不过举一些小例子还是可以理解的。

读写分离,对于只进行展示的数据只需要走副本只读的数据库(例如:用户账号显示、评论显示、文章内容显示、点赞数量、收藏数量等等),而只写就是单独走只写的数据库(例如:评论操作、修改密码、点赞操作修改点赞总数等等),副本数据库什么的主从复制即可,这样可以提高读、写速度,降低延迟,提高响应速度,对于用户的体验也是相当好的。

缓存,Redis缓存、缓存脚本、浏览器缓存控制等等都是不错的方法。

想不到了,就先写到这里吧。


以上内容为本人完成于2023年1月30日20:41:06,特与此记录并分享。

© 版权声明
THE END
喜欢就点赞支持一下吧,如果觉得不错或日后有所需要,可以收藏文章和关注作者哦。
点赞7打赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容