欧亿体育大型网站技术架构核心原理剖析附知识图谱下载

发布日期:2024-05-01 19:25浏览次数:

  软件架构是指有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计

  开发人员视角关注程序本身及其相关子系统的性能,欧亿体育在线包括响应延迟、系统吞吐量、并发处理能力、系统稳定性等技术指标。

  运维人员视角关注基础设施性能和资源利用率,如网络运营商的带宽能力、服务器硬件配置、数据中心网络架构、服务器和网路带宽的资源利用率等。

  :应用执行一个操作需要的时间(从发出请求开始到收到最后响应数据所需要的时间)。

  :单位时间内系统处理的请求数量,体现系统的整体处理能力。存在一个极限值。

  System Load:系统负载,指当前正在被CPU执行和等待被CPU执行的进程数目总和(反映系统忙闲程度的重要指标)。

  性能测试是一个不断对系统增加访问压力,以 获得系统性能指标、最大负载能力、最大压力承受能力的过程。性能测试主要包括以下几种方法:

  :对系统不断增加并发请求,直到系统的某项或多项性能指标达到安全临界值。

  :在超过安全负载的情况下,对系统继续施压,直到系统崩溃或不能再处理请求,已获得系统最大承受能力。

  :系统在特定的硬件、软件、网路环境条件下,给系统加载一定压力,使系统运行一段较长时间,以检查系统是否稳定。

  排查网站的性能瓶颈的方法:检查请求处理的各个环节的日志,分析哪个环节响应时间不合理、超过预期;然后检查监控数据,分析影响性能的主要因素是内存、磁盘、网络还是 CPU,时代吗问题还是架构设置不合理,或者系统资源确实不足。

  定位到了性能具体问题后,然后根据性能产生的原因进行性能优化。性能优化主要从三个方面进行优化:

  减少HTTP请求:分别合并CSS、JS、图片等资源,减少浏览器的请求次数。

  使用浏览器缓存:浏览器将CSS、JS、图标等静态资源缓存在浏览器中,那样就不用每次都去请求服务器,可以极好地改善性能。设置HTTP头中

  启用压缩:在服务器端对文件进行压缩,在浏览器端对文件进行解压,可有效减少通信传输的数据量。压缩比80%以上。压缩和解压缩会消耗服务器和浏览器所在的系统的CPU资源。

  CSS放在页面最上面,JS放在页面最下面:加载JS后会立即执行,可能会阻塞页面渲染。

  减少Cookie传输:减少Cookie中传输的数据量,请求静态资源没有必要发送Cookie。

  CDN(Content Distribute Network,内容分发网络),是指将数据缓存在离用户最近的地方,使用户以最快的速度获取数据,提升网页的打开速度。

  反向代理是指服务器根据客户端的请求,从其关联的一组或多组后端服务器上获取资源,然后再将这些资源返回给客户端,客户端只会得知反向代理的IP地址,而不知道在代理服务器后面具体的真实服务器的存在。

  使用消息队列后,用户请求的数据发送给消息队列后就立即返回,再由消息队列的消费者从消息队列中获取数据,再进行逻辑处理(如写入数据库)。

  使用负载均衡技术为应用构建一个由多台服务器组成的服务器集群,将并发访问请求分发到多台服务器上处理,避免单一服务器因负载压力过大而响应缓存,降低用户请求响应延迟,提升用户体验。

  在网站应用中,大部分应用访问数据都是随机的,机械硬盘由于需要移动磁头臂,所以性能较差。SSD具有更好的性能。

  为了改善数据访问特性,文件系统或数据库系统通常会对数据排序后存储,以加快检索速度,这样就需要保证数据在不断更新、插入、删除后依然有序。

  传统关系数据库使用B+树,B+树是一种专门针对磁盘而优化的N叉排序树,以树节点为单位存储在磁盘中,从根开始查找所需数据所在的节点编号和磁盘位置,将其加载到内存中然后继续查找,直到找到所需的数据。

  LSM树是一个N阶合并树。数据的插入、修改和删除都是在内存中进行,并且都会创建一个新记录,这些数据在内存中以树结构排序,当数据量超过设定的阈值后,会和磁盘上最新的的排序树合并。在合并的过程中,会用最新更新的数据覆盖旧的数据。读操作先从内存中排序树开始搜索,如未找到,再从磁盘上排序树顺序查找。

  在LSM树上进行一次数据更新不需要磁盘访问,在内存即可完成,速度远快于B+树。

  对于写多,集中读最近写入数据的场景,使用LSM树可以极大的减少磁盘的访问次数,加快访问速度。

  廉价磁盘冗余阵列,主要是为了改善磁盘的访问延迟,增强磁盘的可用性和容错能力。

  多块磁盘通过使用RAID技术,实现数据在多块磁盘上的并发读写和数据备份。

  RAID0:在写的时候,根据磁盘数量将数据分成N份,并发写入N块磁盘。在读的时候,从N块磁盘上并发读。RAID0具有极快的数据读取速度,但是未做备份。

  RAID1:数据写入的时候,将一份数据同时写入两块磁盘,一块磁盘损坏不会导致数据丢失,插入新磁盘可以通过复制数据方式自动修复,可靠性高。

  RAID10:将所有磁盘平均分成两份,数据同时在两份磁盘写入,结合RAID0和RAID1两种方案,既提高了可靠性又改善了性能,但是RAID10的磁盘利用率较低,一般磁盘用来备份数据。

  RAID3:数据写入的时候,将数据分成N-1份,并发写入N-1块磁盘,并在第N块磁盘记录校验数据,任何一块磁盘损坏(包括校验数据磁盘),都可以利用其它N-1块磁盘的数据修复。在数据修改较多的场景,会导致第N块磁盘频繁重写校验数据,容易造成磁盘损坏,所以一般少在实践中使用。

  RAID5:与RAID3类似,但是校验数据是螺旋写入所有磁盘,避免频繁写一块盘。

  RAID6:与RAID5类似,数据值写入N-2块磁盘,螺旋式地在两块磁盘中写入校验信息(不同算法),数据可靠性最高。

  系统在整个存储集群的多台服务器上进行数据并发读写和备份。HDFS以块(Block)为单位管理文件内容,一个文件被切分成多个Block,当应用程序写文件时,每写完一个Block,HDFS会将其自动复制到另外两台机器上,保证3副本(默认)。在处理文件的时候(MapReduce),可以同时启动多个任务并行读取文件的不同Block,并发处理,提升读取效率。

  HDFS配置MapReduce等并行计算框架进行大数据处理时,可以在整个集群上并发读写访问所有的磁盘安,无需RAID支持。

  硬件故障是常态,网站的高可用架构设计主要目的:保证服务器硬件故障时服务依然可用、数据依然能保存并能被访问。

  无状态应用是指应用服务器不保存业务的上下文信息,仅根据每次请求提交的数据进行相应的业务逻辑处理。多个服务器实力之间完全对等,请求提交到任意服务器,处理结果都是完全一样的。

  通过负载均衡手段,将流量和数据均匀分配到一个集群组成的多台服务器上,以提高系统的整体负载处理能力。

  1. Session复制应用服务器开启Web容器的Session复制功能,在集群中的几台服务器之间同步Session对象,使得每台服务器上都保存所有用户的Session信息,这样任何一台机器宕机都不会导致Session数据的丢失。 适合小规模集群。当集群比较大时,集群服务器间需要大量的通信进行Session复制,会占用大量服务器和网络资源。

  2. Session绑定利用负载均衡的源地址Hash算法实现,负载均衡服务器总是将来源于同一IP的请求分发到同一台服务器上,也可以根据Cookie信息将同一个用户的请求总是分发到同一台机器上,这样在整个会话期间没用户所有的请求都在同一台服务器上处理,即Session绑定在某台特定服务器上,又称会话黏滞。

  缺点:不符合对系统高可用的需求,某台服务器宕机,那么该机器上的Session会丢失。很少使用。

  利用浏览器支持的Cookie记录Session。每次请求的时候,将Session放在请求中发送到服务器,服务器处理完请求之后再将修改过的Session响应给客户端。

  缺点:受Cookie大小限制,记录信息有限;每次请求都需传输Cookie,影响性能;如用户关闭Cookie,访问就会异常。

  利用独立部署的Session服务器集群统一管理Session,应用服务器每次读写Session时,都访问Session服务器。

  将应用服务器的状态分离,分为无状态的应用服务器和有状态的Session服务器,针对这两种服务器的不同特性分别设计其架构。

  根据应用和服务的重要程度进行分级管理,不同重要程序的服务使用不同的硬件资源,越重要的的服务使用越好的硬件资源。核心服务和数据部署在不同地域的数据中心。

  设置服务调用的超时时间,一旦超时,通信框架抛出异常,应用程序根据服务调度策略,选择继续重试或将请求转移到相同服务的其他服务器上。

  应用对服务的调用通过消息队列等异步方式完成,避免一个服务失败导致整个应用请求失败。

  网站访问高峰期,服务可能因为大量的并发调用而性能下降,严重时可能会导致服务宕机。为了保证核心应用和功能的正常运行,对服务进行降级。

  CAP原理:一个提供数据服务的存储系统无法同时满足数据一致性(Consistency)、数据可用性(Availibility)、**分区耐受性(Partition Tolerance,系统具有跨网络分区的伸缩性)**这三个条件。

  在大型网站应用中,数据规模总是快速扩张的,因此可伸缩即分区耐受性必不可少,规模变大以后,机器数量也会变得庞大,这是网路和服务器故障会频繁吹安,要想保证应用可用,就必须保证分布式处理系统的高可用。所以在大型网站中,通常会选择强化分布式存储系统的可用性(A)和伸缩性(P),而在某种程度上放弃一致性(C)。

  数据不一致出现原因:系统高并发写操作或者集群状态不稳定(故障恢复、集群扩容)。

  :各副本的数据在物理存储中总是一致的;数据更新操作结果和操作响应总是一致的,即操作响应通知更新失败,那么数据一定没有被更新,而不是出于不确定状态。

  :数据在物理存储中的各个副本的数据可能是不一致的,但终端用户访问时,通过纠错和校验机制,可以确定一个一直的且正确的数据返回给用户。

  :物理存储的数据可能不一致,终端用户访问到数据可能不一致,但系统经过一段时间的自我恢复和修正,数据最终达到一直。

  保证数据有多个副本,任意副本的失效都不会导致数据的永久丢失,从而实现数据完全的持久化。

  保证当一个数据副本不可访问时,可以快速切换访问数据的其他副本,保证系统可用。

  预发布验证:先发布到预发布机器上,然后进行预发布验证,验证典型的业务流程,确认没有问题后正式发布。

  代码控制:主干开发、分支发布;分支开发,主干发布。工具:SVN,Git。

  灰度发布:将集群服务器分成若干部分,每天只发布一部分服务器,观察运行是否稳定,第二天继续发布一部分服务器。

  需要根据实时监控数据进行风险预警,并对服务器进行失效转移,自动负载调整,最大化利用集群所有机器资源。

  伸缩性是指通过不断向集群中加入服务器的手段来缓解不断上升的用户并发访问压力和不断增长大数据存储需求。

  通过物理上分离不同的网站功能,实现网站伸缩性的手段,可以在网站发展的任何阶段使用。不同服务器部署不同的服务,提供不同的功能。

  随着网站访问量的逐步增加,单一的服务器也不同满足业务规模的要求,需要使用服务器集群,将相同服务部署在多台服务器上构成一个集群整体对外提供服务。

  HTTP重定向服务器会根据用户的HTTP请求计算一台真实的Web服务器地址,并将该Web服务器地址写入HTTP重定向响应(响应状态码302)中返回给用户浏览器,浏览器自动重新请求实际物理服务器。

  每次域名解析请求都会根据负载均衡算法计算一个不同的IP地址返回,可以将请求分布到多台服务器上,实现负载均衡。

  优点:将负载均衡的工作转交给DNS,省去了网站管理维护负载服务器的麻烦;DNS还支持基于地理位置的域名解析,会将域名解析成距离用户地理最近的一个服务器地址,从而加快用户访问速度,改善性能。

  缺点:DNS是多级解析,每级DNS都会缓存服务器配置,修改了DNS配置,需要较长时间才能生效。

  在网络层通过修改请求目标地址进行负载均衡。在内核进程中完成数据分发,性能较好。集群的最大响应数据吞吐量受制于负载均衡服务器网卡带宽。

  在通信协议的数据链路层修改mac地址进行负载均衡。Linux平台最好的链路层负载均衡开源产品LVS。

  所有请求被依次分发到每台应用服务器上,即每台服务器需要处理的请求数目都相同,适合于所有服务器硬件都相同的场景。

  根据应用服务器硬件性能的情况,在轮询的基础上,按照配置的权重将请求分发到每个服务器,性能高的服务器分配更多请求。

  记录每个应用服务器正在处理的连接数(请求数),将新到的请求分发到最少连接的服务器上。最符合负载均衡定义的算法。

  根据请求来源IP地址进行Hash计算,得到应用服务器,这样来自同一个IP地址的请求总在同一个服务器上处理,该请求的上下文信息可以存储在这台服务器上,在一个会话内重复使用,从而实现会话黏滞。

  分布式缓存服务器集群中不同服务器中缓存的数据各不相同,缓存访问请求不可以在缓存服务器集群中的任意一台处理,必须先找到缓存有需要数据的服务器,然后才能访问。

  分布式缓存集群伸缩性设计的主要目标:新加入缓存服务器应使整个缓存服务器集群中已经缓存的数据尽可能还被访问到。

  一致性Hash算法通过一致性Hash环的数据结构实现Key到缓存服务器的Hash映射。

  算法过程:先构造一个长度为 0~2^32的整数环(一致性Hash环),根据节点名称的Hash值( 范围0~ 2^32)将缓存服务器节点放置在这个Hash环上。然后根据需要缓存的数据的Key值计算得到其Hash值,然后再Hash环上顺时针找距离这个Key的Hash值(范围 0~2^32)最近的缓存服务节点,完成Key到服务器的Hash映射查找。

  扩容的时候,将新加入的节点的Hash放入一致性Hash环中,由于Key是顺时针查找距离最近的节点,因此新加入的节点只影响整个换中的一小段。

  将每台物理缓存服务器虚拟为一组虚拟缓存服务器,将虚拟服务器的Hash值放置在Hash环上,Key在换上先找到虚拟服务器节点,在得到物理服务器的信息。这样新加入的物理服务器节点是一组虚拟节点,如果虚拟节点足够多的,这组虚拟节点将会影响同样多数目的已经在环上存在的虚拟节点。

  物理节点对应的虚拟节点越多,各个物理节点之间的负载越均衡,新加入物理服务器对原有的物理服务器的影响越保持一致。

  数据存储层必须保证数据的可靠存储,任何情况下都必须保证数据的可用性和正确性。

  低耦合系统更容易扩展,低耦合模块更容易复用,低耦合的系统设计会让开发过程和维护变得更加轻松和容易管理。

  可扩展架构的核心思想:模块化,并在此基础之上,降低模块间的耦合性,提高模块的复用性。

  衡量标准:网站增加新的业务产品时,是否可以实现对现有产品透明无影响,不需要任何改动或者很少钙能既有业务功能就可以上线新产品。不同产品之间低耦合。

  事件驱动架构(Event Driven Architecture):通过在低耦合的模块之间传输事件消息,以保持模块的松散耦合,并借助事件消息的通信完成模块间合作。如生产者消费者模式。

  利用消息队列,将用户请求和其他业务事件构造成消息发布到消息队列,消息的处理者作为消费者从消息队列中获取消息进行处理。通过这种方式将消息产生和消息处理分离开来,可以透明地增加新的消息生产者任务或者新的消息消费者任务。

  消息生产者应用程序通过远程访问接口将消息推送给消息队列服务器,消息队列服务器将消息写入本地内存队列后即立即返回成功响应给消息生产者。消息队列服务器根据消息订阅列表查找订阅该消息的消息消费者应用程序,将消息队列中的消息按照先进先出的原则将消息通过远程通信接口发送给消息消费者程序。

  :将一个大应用拆分为多个小应用,如果新增业务比较独立,那么就直接将其部署为一个独立的应用系统。

  :将复用的业务拆分开来,独立部署为分布式服务,新增业务只需调用这些分布式服务,不需要依赖具体的模块代码。

  协议转换:将各种API输入转换成内部服务可以识别的形式,并将内部服务的返回封装成API的格式。

  流程:将一组离散的服务组织成一个上下文相关的新服务,隐藏服务细节,提供统一接口供开发者调用。

  XSS攻击即跨站点脚本攻击(Cross Site Script),指黑客通过篡改网页,注入恶意HTML脚本,在用户浏览网页时,控制用户浏览器进行恶意操作的一种攻击方式。常见攻击类型有:

  攻击者在HTTP请求中注入恶意SQL命令,服务器用请求参数构造数据库SQL命令(如删除数据库表)时,恶意SQL被一起构造,并在数据库中执行。

  CSRF(Cross Site Request Forgery,跨站点请求伪造),指的是攻击者通过跨站请求,以合法用户的身份进行非法操作,如转账交易、发表评论等。

  CSRF攻击的主要手法:利用跨站请求,在用户不知情的情况下,以用户的身份伪造请求。

  核心是利用了浏览器Cookie或服务器Session策略,盗取用户身份。

  :通过在请求参数中增加随机数的方法来阻止攻击者获得所有请求参数。正常请求会包含token随机数,每次请求都不一样,伪造请求无法获得该值,服务器检查请求参数中token的值是否存在并且正确以确定请求提交者是否合法。

  :在请求提交时,需要用户输入验证码,以避免在用户不知情的情况下被攻击者伪造请求。但是输入验证码是一个很糟糕的用户体验。

  :通过检查HTTP请求的Referer域中记录的请求来源,验证其是否合法。常见场景如:图片防盗链。

  防御:配置web服务器参数,跳转500页面到指定的错误页面,避免将异常堆栈信息直接返回给用户。

  在浏览器中是可以看到HTML代码中注释的部分,这样会给黑客造成攻击便利。

  防御:程序在最终发布前需要进行代码review或自动扫描,避免HTML注释漏洞。

  防御:设置上传文件白名单,只允许上传可靠的文件类型。此外还可以修改文件名、使用专门的存储等手段,保护服务器免受上传文件攻击。

  攻击方式:攻击者在请求的URL中使用相对路径,遍历系统为开放的目录和文件。

  防御:将JS、CSS等资源文件部署在独立服务器,使用独立域名,其他文件不适用静态URL访问,动态参数不包含文件路径信息。

  为了保护网站的敏感数据,需要对这些敏感数据进行加密处理,信息加密技术分为三类:

  通过对不同输入长度的信息进行散列计算,得到固定长度的输出,散列计算是单向的,即不能对固定长度的输出进行计算从而获得输入信息。

  加密和解密使用的密钥不同,其中一个对外界公开,叫做公钥,另一个只有所有者知道,被称为私钥。用公钥加密的信息必须用私钥才能解开,反之,用私钥加密的信息只有公钥才能解开。理论上不可能通过公钥计算获得私钥。

  HTTPS传输中浏览器使用的数字证书就是经过权威机构认证的非对称加密的公钥。

  算法原理:先将批量已经分好类的样本数据输入分类算法进行训练,可以得到一个分类模型,然后再利用分类算法结合分类模型对待处理邮件进行识别。

  将需要过滤的内容加入到黑名单中,然后从黑名单中进行查找,如果找到,就过滤掉。

  分享一张大型网站技术架构知识图谱,只有对每一个知识点仔细梳理并深入理解,才能打造出一个高可用、高性能、以扩展、可伸缩且安全的网站。

如果您有什么问题,欢迎咨询技术员 点击QQ咨询