• 高性能网站架构


    1. 讲讲你认为的高性能网站架构,或者说现在流行的网站架构。

      性能是网站的一个重要指标,是网站架构设计的一个重要方面。衡量性能有一系列指标,重要的有响应时间、TPS、系统性能计数器等,通过测试这些指标可以确定系统设计是否达到目标,分析瓶颈,预测网站容量,并对异常指标进行报警,保障系统可用性。根据网站分层架构,网站的性能优化可分为Web前端性能优化、应用服务器性能优化、存储性能优化三个方面。
    1)Web前端性能优化
    (1)浏览器访问优化
    • 减少HTTP请求
      ① 将浏览器一次访问需要的CSS、JavaScript合并成一个文件。
      ② 多张图片合并成一张。
    • 使用浏览器缓存
      ① 设置HTTP头中的Cache-Control和Expires属性,将一些更新频率比较低但又是每次HTTP请求都需要的静态资源文件,如CSS、JavaScript、Logo、图标等,缓存在浏览器中,改善性能。
      ② 有时,静态资源文件需要及时应用到客户端浏览器,可通过生成新的JavaScript文件来更新HTML中文件的引用,而不是更新JavaScript文件内容。
      ③ 使用浏览器缓存策略更新的网站,在更新静态资源时应采用批量更新的方法,比如需要更新10个图标文件,不宜把10个文件一次全部更新,而是应该一个文件一个文件逐步更新,且两个文件之间具有一定的时间间隔,以免用户浏览器突然大量缓存失效,集中更新缓存,造成服务器负载骤增、网络堵塞的情况。
    • 启用压缩
      在服务器端对文件进行压缩,在浏览器端对文件进行解压缩,可有效减少通信传输的数据量。但是压缩对服务器和浏览器产生一定的压力,在通信带宽良好,而服务器资源不足的情况下要权衡考虑。
    • CSS放在页面最上面,JavaScript放在页面底部
      浏览器会在下载全部CSS之后,才会对整个页面进行渲染,所以CSS放在页面最上面,让浏览器尽快下载CSS;而浏览器加载JavaScript后会立即执行,可能会阻塞整个页面,造成页面显示缓慢,因此JavaScript放在页面底部。
    • 减少cookie传输
      一方面,cookie包含在每次请求和响应中,太大的数据量会影响数据传输;另一方面,对于某些静态资源的访问,如CSS、JavaScript等,发送cookie没有意义,可以考虑静态资源使用独立域名访问,避免请求静态资源时发送cookie,减少cookie传输的次数。
    (2)CDN加速
    • CDN的本质仍然是一个缓存,将数据缓存在离用户最近的地方,使用户以最快的速度获取数据。
    • CDN能够缓存的一般是静态资源,如图片、文件、CSS、JavaScript脚本、静态网页等,这些文件的访问频度很高,将其缓存在CDN中,可极大改善网页打开的速度。
    • 当用户的请求到达CDN服务器后,如果CDN中存在浏览器请求的资源,就直接返回给浏览器,最短路径返回响应,加快用户访问速度,减少数据中心负载压力。
    (3)反向代理
      反向代理服务器位于网站机房一侧,代理网站web服务器接收HTTP请求。
    • 安全功能 任何来自互联网的访问请求必须经过反向代理服务器。
    • 缓存功能 当用户第一次访问静态内容的时候,静态内容就被缓存在反向代理服务器上,这样当其他用户访问该静态内容的时候,就可以直接从反向代理服务器返回,加速web请求响应速度,减轻web服务器负载压力。
    • 负载均衡功能 充当负载均衡服务器均衡地分发请求,平衡集群中各个服务器的负载压力。
    2)应用服务器性能优化
    (1)分布式缓存
      网站数据访问通常遵循二八定律,即80%的访问落在20%的数据上,因此,利用缓存可以提高数据访问速度,降低存储访问压力,改善系统性能。
      缓存主要用来存放那些读写比很高、很少变化的数据,如商品的类目信息、热门词的搜索列表信息、热门商品信息等。应用程序读取数据时,先到缓存中读取,如果读取不到或数据已经失效,再访问数据库,并将数据写入缓存。
    (2)异步操作
      如果不使用消息队,用户的请求直接写入数据库,在高并发情况下,会对数据库造成巨大的压力,响应延迟加剧。使用消息队列将调用异步化,用户请求的数据发送给消息队列后立即返回,再由消息队列的消费者进程从消息队列中获取数据,异步写入数据库,从而改善网站系统的性能。
    (3)使用集群
      在网站高并发场景,使用负载均衡技术为一个应用构建一个由多台服务器组成的服务器集群,将并发访问请求分发到多台服务器上处理,避免单一服务器因负载压力过大而响应缓慢。
    (4)代码优化
    • 使用多线程
      利用多线程IO阻塞与执行交替进行,可最大限度地利用CPU资源。
    • 资源复用
      系统运行时,尽量减少开销很大的系统资源的创建和销毁,如数据库链接、网络通信连接、线程、对象等。资源复用主要有两种模式:单例和对象池。
    • 数据结构
      在不同场景中合理使用恰当的数据结构,灵活组合各种数据结构改善数据读写和计算特性,可以极大优化程序性能。
    • 垃圾回收
      一个对象,可以有一个或多个引用变量指向它。当一个对象不再有任何一个引用变量指向它时,这个对象就被应用抛弃了。也就是这个对象可以被垃圾回收机制回收了。垃圾回收机制有助于程序优化和参数调优,以及编写内存安全的代码。
    3)存储性能优化
    (1)机械硬盘 VS 固态硬盘
      相比机械硬盘,固态硬盘SSD具有功耗更小、磁盘震动与噪声更小的特性。
    (2)B+树 VS LSM树
    • 传统数据库使用B+树来改善数据访问特性。B+树是一种专门针对磁盘存储而优化的N叉排序树,以树节点为单位存储在磁盘中,从根开始查找所需数据所在的节点编号和磁盘位置,将其加载到内存中然后继续查找,直到找到所需的数据。缺点是由于每次磁盘访问都是随机的,且传统机械硬盘在数据随机访问时性能较差,每次数据访问都需要多次访问磁盘影响数据访问性能。
    • LSM树可以看作是一个N阶合并树。数据写操作(包括插入、修改、删除)都在内存中进行,并且都会创建一个新记录,这些数据在内存中仍然还是一棵排序树。在需要进行读操作时,总是从内存中的排序树开始搜索,如果没有找到,就从磁盘上的排序树顺序查找。在LSM树上进行一次数据更新不需要磁盘访问,在内存即可完成,速度远快于B+树。当数据访问以写操作为主,而读操作则集中在最近写入的数据上时,使用LSM树可以极大程度地减少磁盘的访问次数,加快访问速度。
    (3)RAID VS HDFS
    • RAID(廉价磁盘冗余阵列)技术主要是为了改善磁盘的访问延迟,增强磁盘的可用性和容错能力。
    • HDFS(Hadoop分布式文件系统)在整个存储集群的多台服务器上进行数据并发读写和备份,可以看做在服务器集群规模上实现了类似RAID的功能,因此不需要磁盘RAID。

    2. 什么是一主多从?

    目前大部分主流数据库都提供主从热备功能,通过配置数据库的主从关系,将一台数据库服务器的数据更新同步到另一台服务器上,从而实现数据库读写分离,改善数据库负载压力。
    应用服务器在写数据的时候,访问主数据库,主数据库通过主从复制机制将数据更新同步到从数据库,这样当应用服务器读数据的时候,可以通过从服务器获得数据。
    怎么进行主从复制?
    MySQL在写入数据之前,会先写日志,这个术语叫WAL,即write after log,就是在日志之后再写入数据。对主MySQL服务器的binlog(binary log,二进制日志)进行解析,然后写入到从mysql服务器中。过程如下:
    ① Master将数据变化记录到二进制日志中;
    ② Slave将master的二进制日志拷贝到它的中继日志(relay log)中;
    ③ Slave重做中继日志中的事件,将数据变化,并反映到它自己的数据库中。
    为什么要进行主从复制?
    ① 数据备份
    对数据进行备份,降低数据丢失的风险。
    ② 负载均衡
    主要用于MySQL集群,解决单点故障或者故障切换,降低单台服务的负载,使访问均衡或读写分离。
    ③ 数据分发
    主要用于多数据中心的数据分发与同步。
    ④ 高可用和数据容错性
    检测主库是否正常工作,一旦发现主库宕机或无法正常工作,就会选择到最好的一个备库上。
     

    3. 什么是负载均衡?

      负载均衡负载均衡有两方面的含义:首先,大量的并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应的时间;其次,单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,将结果汇总,返回给用户,系统处理能力得到大幅度提高。比如,当大量用户同时登陆网站时,可以把不同人群的请求,分发到不同服务器上进行处理,完成类似的功能。假如有10台应用服务器,100个用户访问,那就可以平均地将这100个用户分发到这不同的10台应用服务器上进行登陆验证。不一定是平均10个,分发数量视分发算法而定。
      负载均衡也有一些算法,最简单的是哈希取余法。根据获取客户端的IP地址,通过哈希函数计算得到的一个数值,用该数值对机器数量取余,得到的结果便是客服端要访问服务器的序号。假设有10台服务器,编号是0-9,101%10,余数是1,就分发到1号服务器上,102%10,余数是2,就分发到2号服务器上。以此类推,根据余数将不同请求分发到0-9号服务器上。这种算法的缺点就是当添加或移除服务器时,余数发生变化,这样就无法获取与保存时相同的服务器,从而影响缓存的命中率。
  • 相关阅读:
    2.1.1 Speed Limit
    2.1.2 骑自行车的最短时间
    1.3.1提高实数精度的范例
    1.2.2一个数可以有多少种用连续素数之和表示
    求二倍关系的个数 1.2.1
    求平均值
    原生JS 购物车及购物页面的cookie使用
    基于Jquery的商城商品图片的放大镜效果(非组件)
    商城商品购买数量增减的完美JS效果
    弹性布局各种坑爹兼容
  • 原文地址:https://www.cnblogs.com/sunshineliulu/p/7474292.html
Copyright © 2020-2023  润新知