大型网站构架

 一,大型网站的构架演化
随着访问量(并发量),数据存储量的增大而不断添加服务器的过程。
1,初始阶段:数据库,应用程序,文件部署在同一服务器。LAMP(linux+Apache+MySQL+PHP).
大型网站构架 - Garfield - 张广辉的博客
 
2,应用服务与数据服务分离:应用服务器处理业务逻辑,需要CPU;数据库服务器需要磁盘检索和数据缓存;文件服务器存储用户上传文件。
大型网站构架 - Garfield - 张广辉的博客
 
3,使用缓存:将热点数据放到内存中,提升访问速度。分为本地缓存和远程分布式缓存。
大型网站构架 - Garfield - 张广辉的博客
 
4,将单一服务器改为应用服务器集群,并行计算MapReduce。
大型网站构架 - Garfield - 张广辉的博客
 
5,数据库读写分离。将数据库部署在两台服务器,主数据库负责写操作,写完之后立即备份到从数据库,从数据库负责读操作。
大型网站构架 - Garfield - 张广辉的博客
 
6,反向代理和CDN加速网络,两种缓存方式。

  大型网站构架 - Garfield - 张广辉的博客
 
7,使用分布式文件系统和分布式数据库系统。这里包含了数据库的垂直分割(不同表)和水平分割(相同表)。详见数据库调优
大型网站构架 - Garfield - 张广辉的博客
 
 
8,使用Nosql和搜索引擎
大型网站构架 - Garfield - 张广辉的博客
 
9,应用的业务种类拆分,将不同业务拆分为多个系统
大型网站构架 - Garfield - 张广辉的博客
 
10,应用与可复用的服务拆分。详见7.2
大型网站构架 - Garfield - 张广辉的博客
 

二,大型网站的构架模式
1,分层:应用层(业务逻辑处理,特点:无状态),服务层(复用的代码,无状态),数据层(数据访问)。
应用层和服务层类似,可细分为MVC。应用层专注于与浏览器打交道,服务层与数据库连接。
大型网站构架 - Garfield - 张广辉的博客 大型网站构架 - Garfield - 张广辉的博客
 网站前端是指应用层之前的部分,包括DNS服务,CDN服务,反向代理等;网站后端是被应用层严重依赖的服务,包括缓存和数据库,他们是有状态的。 
网站前台和后台是分别为客户和管理员访问的界面,都是html写的。

2,分割:将不同功能的模块分割。包括应用和数据库(水平垂直)。
3,分布式部署:将分层和分割的模块部署在不同服务器或者分布式并行计算。
4,集群:将多台服务器部署相同的应用,防止服务器故障。需要做负载均衡处理,使http请求均衡( 集群中所有节点所存内容相中,所以请求可以交给任何一个节点 )。
5,缓存: 本质是内存哈希表
1)CDN:离用户最近的ISP服务器提供缓存;
2)反向代理:传统的代理服务器是在用户端局域网中的代理服务器,反向代理存放在网站的机房中,任何请求先访问代理,如果代理没有,代理去访问服务器。
3)本地缓存:应用服务器本地内存缓存的热点数据;
4)分布式缓存:专门用作缓存的分布式集群,应用服务器通过网络通信访问。 Memcached互不通信的缓存集群。
缓存的前提条件:1)数据访问热点不均衡;2)数据不会很快过期。
像维基百科这种读数据远远大于写数据的网站,缓存就尤其重要。
6,异步:通过消息队列,用户向服务器发出的请求装入消息队列中,服务器的处理线程从消息队列中取出请求不处理返回。
比如在提交订单的过程,订单提交后网页上提示待审核,其实就是订单请求在消息队列中等待的过程。
大型网站构架 - Garfield - 张广辉的博客
 

三,大型网站的要素
1,性能
2,可用性:系统出现几台服务器宕机,系统整体是否可用。
3,伸缩性:集群的构建与增删服务器,使服务器数量与处理能力呈线性。
4,扩展性:扩展新功能,并且不需要对现有系统和结构修改。
5,安全性:

四,系统性能优化

1,性能指标:响应时间(用户发出请求收到相应的时间),并发数(系统能够同时处理的请求数,系统负载特性),吞吐量(单位时间内处理的请求数,系统整体处理能力)。
系统资源就像一个高速公路:吞吐量是每天通过的车数目,并发数是正在公路上行驶的车数,响应时间时车速。
大型网站构架 - Garfield - 张广辉的博客
 
大型网站构架 - Garfield - 张广辉的博客
 
分布式的解决方案解决了高并发环境下的访问延迟,但由于自身节点通信延迟,架构复杂等问题提高了低并发的延迟。
另外,要想性能提升,服务器数量需要增多,要想延迟减小,数据一致性要下降。这就是性能优化的利与弊。

2,web前端优化:
1)浏览器优化:减少http请求(合并html,js,css);使用浏览器缓存;压缩文本;减少Cookie传输;
2)使用CDN和反向代理;
3,应用服务器优化
1)缓存
2)异步
3)集群
4,代码优化
1)并发优化:比如servlet不适用成员变量,尽量使用局部变量。
2)资源复用:每个web请求服务器都需要用独立线程处理,可使用数据库连接池和线程池。
3)算法优化
4)垃圾回收,减少full GC。
5、存储性能优化
1)机械硬盘(快速顺序读写,慢速随机读写),固态硬盘(和访问内存速度差不多)
2)B树,LSM树   ...........详见数据库。
3)RAID,HDFS

五,可用性优化
1,应用层
1)失效转移
大型网站构架 - Garfield - 张广辉的博客
应用服务器无状态,不像存储服务器。当负载均衡服务器通过心跳监测发现有台应用服务器宕机时,就会把它从服务器列表中删除,将请求转移到其他节点。
2)Session管理(需要session的应用记录了用户状态):session复制(冗余太大,传输缓慢,不用),session绑定(将用户IP与服务器绑定,但该服务器当即就完蛋了,不用),Cookie记录session(需要session时,查找cookie中的sessionID并发送给服务器获取session,常用),session服务器(将有状态与无状态分离)
大型网站构架 - Garfield - 张广辉的博客

2,服务层(同应用层)
 分级管理(等级不同的服务放在等级不同的硬件),超时设置,异步调用,拒绝服务,关闭功能。

3,数据层
1)CAP原理:数据容忍性(系统部分出问题但总体可用),数据可访问性(随时访问数据,无论成功失败总会收到响应),数据一致性(各个副本在每个时刻数据一致)。为了保证高可用,网站常常牺牲一致性,就是保证最终结果一致,但不保证数据变化后所有节点立刻一致,如nosql。详见hadoop的nosql。
2)数倍备份:冷备份(每隔一段时间进行备份,成本低,但一致性差)。热备份:每次写入数据就立刻备份,分为同步和异步。
大型网站构架 - Garfield - 张广辉的博客
 
大型网站构架 - Garfield - 张广辉的博客
 
异步方式进行读写分离。数据热备份可以考虑中间做一张增量日志表,用于记录在备份过程中数据的改变,备份完成后再把增量日志的内容复制过去。
  3)失效转移:失效确认(心跳检测,应用程序访问失败报告),访问转移,数据恢复(将数据的副本数目恢复到之前水平)
4,网站发布:网站的升级和发布是一次人为的宕机,频率较高,因此软件发布是非常重要的过程。它犹如给正在飞行的飞机换引擎,既不能让飞机剧烈晃动,也不能降落,更不能坠毁。另外,测试不是万能的,经过严格测试的系统也会出现问题。
5,网站故障监测
1)数据采集:日志采集(服务器和客户端日志),服务器性能监测(CPU,内存,IO性能,缓存命中率,访问延时)
2)故障处理手段:系统报警(设定阈值),失效转移,自动降级(关闭某些非核心功能)。

六,伸缩性优化
分为功能伸缩和集群伸缩。,
1,应用服务器集群的伸缩性
负载均衡服务器 大型网站构架 - Garfield - 张广辉的博客

1)HTTP重定向实现(不常用)
大型网站构架 - Garfield - 张广辉的博客
 
2)DNS域名解析实现(常用作第一级负载均衡),在DNS服务器一个域名下注册多个IP
大型网站构架 - Garfield - 张广辉的博客
 
3)反向代理实现,这样反向代理有缓存和负载均衡功能
大型网站构架 - Garfield - 张广辉的博客
 
4)IP实现,用网关作负载均衡,并执行NAT。
大型网站构架 - Garfield - 张广辉的博客
 
5)数据链路实现(最常用),使负载均衡服务器与web服务器的IP相同,但每台MAC不同,负载均衡服务器只需要修改MAC进行直接路由。由于数据包中源和目的IP没有变,这样返回响应时,web服务器就可直接找到用户,不用再经过负载均衡,减小了负载均衡的压力。
大型网站构架 - Garfield - 张广辉的博客

 前两种方式用户与服务器直连,后三种都通过中间代理。

6)负载均衡算法(运行在负载均衡服务器中的算法)
轮询,加权轮询(按服务器硬件性能加权),随机,最小连接(统计每台服务器当前的连接数,选择最小的),原地址散列(对源IP哈希,这样同一台客户机总被分到同一台服务器)

 2,缓存集群的伸缩性
缓存集群中,每台服务器缓存的内容都不一样,所以没法用负载均衡的方式。但缓存内容的丢失不影响业务正常服务,只是增大了数据库的访问压力。
余数hash算法:可以解决访问问题,但服务器数量的改变会使已经缓存的大部分内容失效。
一致性哈希:详见集合框架。
节点扩容只会使很小一部分内容失效。
大型网站构架 - Garfield - 张广辉的博客
  大型网站构架 - Garfield - 张广辉的博客
 
虚拟节点(一台物理机对应多个hash值)保证负载均衡。
大型网站构架 - Garfield - 张广辉的博客
 3,数据存储集群的伸缩性
1)关系数据库
通过关系数据库访问代理,可以解决不同数据分库的问题,但不能使用跨库join和事物
大型网站构架 - Garfield - 张广辉的博客
 2)非关系型数据库
详见Hadoop。

七,扩展性优化
主要目标是降低耦合性。
1,分布式消息中间件JMS:就是将消息队列部署在单独的服务器,应用服务器通过远程调用或者socket通信进行访问。降低了生产者和消费者之间的耦合性。如果消息队列内存满了,就将消息暂存于硬盘。为防止消息队列宕机,生产者在消息被处理之前暂存消息,如果消息在未处理之前服务器宕机,那发送发会选择其他队列。比较著名的有Apache的ActiveMQ,简单的有mysql数据库可以当作消息队列。
消息队列模型:queue模型:所有消费者共同消费队列中消息;topic模型:所有消费者会独立收到所有消息。多个集群间用topic,集群内部用queue。

2,分布式服务构架(SOA)
1)服务:多个应用模块都需要使用(复用)的应用称为服务,比如用户管理模块。服务可以给网站内部的应用服务器使用,也可以给第三方的开发者使用。为了降低服务模块与其他模块的耦合性,通常在用暴露接口的形式提供服务。因此被服务者只要遵循该接口,无论是用什么语言,都可以进行应用开发。
2)简单实例:比如应用服务器需要一个add(a,b)的结果。如果在用用服务器中设计该程序,那其他应用需要此函数时还需要从新设计相同的代码。于是我们可以把add(a,b)的代码放在服务服务器中。当应用需要此代码时,通过socket向服务服务器传递需要服务的接口名和方法和参数a,b。服务器接收到传递的信息后,通过接口名new出实例对象,并将参数传入计算结果,最后将结果返回给应用服务器。
在实际项目中,是在应用程序(需要服务的程序)中含有一个服务接口的引用,这个引用实际是通过远程调用方式生成的动态代理,通过该代理完成服务方法的调用。
3)服务的接口
大型网站构架 - Garfield - 张广辉的博客 大型网站构架 - Garfield - 张广辉的博客
  

Web Serverce是SOA构架的一个具体实现。详见网络编程的Web Serverce.
4)服务层负载均衡
大型网站构架 - Garfield - 张广辉的博客
 

3,可扩展的数据结构(列存储的列族)
详见hadoop中的nosql
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值