1.高性能网站每秒能够处理成千上万个请求。关键是:
良好的可伸缩
无处不在的缓存
2.可伸缩的理解
2.1性能得平衡(负载均衡、容错)
接入保护、Cache缓冲
2.2扩容容易
所有组件都应当可以简单扩展
无共享架构
2.3可控状态
可扩展与高性能
是先有可扩展再去考虑高性能。即可扩展设计是高性能的基础
WEB可扩展性
1.WEB服务器
2.负载均衡
3.南北互通
WEB服务器的选择
Apache
不适合静态文件的支持
内存、CPU占用比较大
非常成熟功能强大配置丰富
TWS----------值得推荐一试(有时间好好看一下)
架构中心自主开发
对CGI支持比较独特
CGI性能非常好
Qhttpd
公司内部软件
只适合静态文件的支持
非常稳定可靠-----可以考虑用它做静态加速
Lighttpd、Nginx
内存、CPU开销小
静态文件性能胜出很多
PS:可以测试一下nginx+php+fgi与TWS+fgi的性能。当接口服务器
性能改进
1.动态、静态内容分开
静态文件:qhttpd/lighttpd/nginx
动态内容:Apache
某些静态文件压缩传输:lighttpd的mod_compress
所以可以考虑这种架构nginx+apache进行搭建实现动、静分离即location ~ \.php$丢给apache处理
2.动态内容性能再次提升一下
传统CGI方式进行提升
PHP、Rails、SSI
FastCGI
TWS CGI ==========>测试一下性能看看效果如何
FastCGI
出现很早
减少了传统CGI调用的消耗
基本保持源代码级的兼容性
考虑一下在apache里面配置fastcgi
二、负载均衡技术
2.1 负载均衡是可扩展性的关键
2.2 提高网站的可用性
2.3 接入保护、失效检测
介绍几种负载均衡的技术实现
1.DNS轮询方式
(是最简单的负载均衡、域名设置多条A记录,DNS轮询)
示例:
96399 IN CNAME
300 IN A 192.168.0.1
300 IN A 192.168.0.2
300 IN A 192.168.0.3
300 IN A 192.168.0.4
理解一下什么是CNAME的概念
我的理解:CNAME其实就是呢称所对应的真实名字。像上面如果让用户去记可能不太好记
所以就可以给它取个呢称好记。那这个配置里面有了这个CNAME之后这条记录其它相关的记录像A记录
就得使用这个真实名称了。所以下面都是使用这个真实的名称。
而A记录其实功能就是/etc/hosts文件的作用了。即一个主机名对应哪个网络接口
2.硬件负载均衡技术
思科
alteon
foundry
F5====================>有所了解
PS:一般大公司都会引用硬件负载均衡技术
3.软件负载均衡
免费
LVS 基于内核通过修改TCP/IP数据报文实现负载均衡
高性能,但是布置相对麻烦
HAproxy
基于layer7
效率相对较低,部署容易有WEB界面便于观察
四层负载实现
TCP层的交换
根据源/目的地址和端口进行负载均衡
策略
round-robin
最少连接
七层即应用层来做负载均衡像nginx
基于HTTP请求
最常用的是URL分发
三、南北互通
3.1 双线服务器
多个IP 地址
一个IP地址,多个路由(服务器的路由策略选择)
3.2 动态DNS
根据来自不同的ISP用户接入到就近的服务器(目前CDN能做到这点?)
自开发动态DNS软件
自开发DNS服务器
IP地址库和IP测速(有了IP 测速工具才能知道什么是就近)
3.3 CDN
就近接入
代理缓存
域名解析增加CNAME即可(通过 UI界面直接修改DNS的配置文件提交更新即可)
二、缓存无处不在的缓存
WEB CACHE的类型
浏览器的cache
私有缓存
可以缓存private响应
Cache Proxy
Surrogates 缓存代理
WEB加速
共享缓存
只能缓存public响应
页面模板静态化
如何办到?
由模板生成静态页面
定时或有更新时再生成!(新闻CMS系统一般可以这样来处理)
困难:
静态化的页面太多了
页面里面有变化的东西不适合做
多台服务器维护麻烦
页面既包含静态内容又有动态内容
页面如何缓存?
按需静态化(不要全做只按需做)
前端cache存储动态页面内容
mod_cache
squid
varnish 像论坛感觉这个效果应该不错的。
遵循HTTP的cache规范
可精细控制cache
Expires
Cache-control
适合GET类型CGI请求
条件请求
IF-Modified-Since/Last-Modified
1.服务器响应:
200OK
Last-Modified
2.浏览器请求
GET HTTP/1.1
IF-Modified-Since
3.服务器响应
200OK或304
PS:如果返回304表示没有修改直接读本地缓存
IF-None-Match/ETag
1.Server响应
200OK
ETag:abcdef
2.浏览器请求
GET。。。HTTP/1.1
IF-None-Match:abcdef
3.Server响应
200OK或304
Expiration
Expires
设置对象的绝对失效时间
是HTTP/1.0规范
max-age
是Cache-control的一个指令
设置对象的年龄(秒数)
是HTTP/1.1规范
max-age优先于 Expires
Cache-control
no-cache=[Set-cookie]
浏览器和sqiud都不可以缓存
再次使用前需要发送条件请求
max-age=NNN
指定缓存有效时间
public
浏览器和sqiud都可以缓存
max-age指定缓存时间
private
只有浏览器可以缓存
ps:cache-control:max-age=120
示例:
返回个人信息
Cache-control: private, max-age=NNN (只有浏览器可以缓存)
CGI写操作
Cache-control: no-store, no-cache
CGI获取状态等信息
Cache-control: public, max-age=NNN
架构图:
负载------->cache层------->WEB服务器--------->DB
HAProxy squid Lightt/apach memcached/DB
阅读(2458) | 评论(6) | 转发(0) |