Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
可扩展 Web 架构探讨 echouzhou
高性能网站每秒能处理成千上万个请求,关键是 Scalability 良好的可伸缩性 Caching 无处不在的缓存
Scalability 是系统适应不断增长用户数量的能力 性能平稳 负载均衡、容错 接入保护、 Cache 缓冲 扩容容易 所有组件都应当可以简单扩展 无共享架构 可控状态
Vertical Scaling 更大的服务器 更快的 CPU 扩展性 / 价格比很差 超级计算机都是平行扩展的!
可伸缩性 vs. 高性能 在系统可扩展的前提下提高性能
Web 的可扩展性 Web 服务器 负载均衡 南北互通
Web 服务器
Web 服务器的选择 Apache 不适合静态文件的支持 内存、 CPU 占用比较大 非常成熟,功能强大,配置丰富 TWS 架构中心自主开发 对 CGI 的支持比较独特 CGI 性能非常好 Qhttpd 公司内部软件 只适合静态文件的支持 非常稳定可靠 Lighttpd 、 Nginx 内存、 CPU 开销小 静态文件性能胜出很多 越来越多的网站开始用它
性能改进 动态、静态内容分开 静态文件: qhttpd/lighttpd/nginx 动态内容: Apache 某些静态文件压缩传输: lighttpd 的 mod_compress 动态内容性能提升 传统 CGI PHP 、 Rails 、 SSI FastCGI TWS CGI
FastCGI 出现很早的技术 减少传统 CGI 调用的消耗 基本保持源代码级的兼容性 #include <stdio.h> #include <fcgi_stdio.h> While (FCGI_Accept() >= 0) { // CGI 代码 }
FastCGI 的配置
负载均衡技术
负载均衡 (Load Balancing) 是可扩展性的关键 提高网站的可用性 接入保护、失效检测
DNS 轮询 是最简单的负载均衡 域名设置多条 A 记录, DNS 轮询
硬件负载均衡 Cisco Alteon Foundry F5
软件负载均衡 免费解决方案 Linux Virtural Server 基于内核 , 通过修改 TCP/IP 数据报文实现负载均衡,确保可用性的守护进程 ldirectord 高性能,部署相对麻烦,不便于观察 HAproxy  基于  layer 7  效率相对较低,部署容易,有 web 界面便于观察
Layer 4 TCP 层的交换 根据源 / 目的地址和端口进行负载均衡 负载均衡策略 round-robin 最少连接
Layer 7 基于 HTTP 请求 最常用的是 URL 分发
南北互通
双线服务器 多个 IP 地址 一个 IP 地址,多个路由 深南花园: 电信、网通、教育网三通机房 北方网通访问深圳网通仍然很慢
动态 DNS 根据来自不同 ISP 的用户接入到就近的服务器 公司自己开发的动态 DNS 软件 自己开发的 DNS 服务器 IP 地址库和 IP 测速 存在业务分布的问题
CDN Content Delivery Network 就近接入 代理缓存 域名解析增加 CNAME 即可
Caching
Web Cache 的类型 浏览器 Cache 私有缓存 可以缓存“ private” 响应 Cache Proxy Surrogates - 缓存代理 Web 加速 共享缓存 只能缓存“ public” 响应
一些数据 多至 43% 的 Web 请求访问不可缓存的内容 Web 缓存命中率为 40% 左右是比较现实的
页面静态化 理想状态: 静态化所有页面——实际做不到 如何静态化? 由模板生成静态页面 定时或有更新时 困难: 成千上万个页面的静态化不现实 页面有变体,不适合静态化 多台服务器维护麻烦 页面既包含静态内容,又包含动态内容
页面缓存 按需静态化 前端 cache 存储动态页面内容 mod_cache Squid Varnish* 遵循 HTTP 的 Cache 规范 可精细控制 Cache Expires Cache-control 适合 GET 类 CGI 请求
HTTP 的 Cache 规范 要充分发挥 Cache 的效用,就必须了解 HTTP Cache 规范和机制 条件请求 Expiration Cache-control Cookie
条件请求 If-Modified-Since/Last-Modified 1.  服务器响应: 200 OK Last-Modified: … 2.  浏览器请求 GET … HTTP/1.1 If-Modified-Since: … 3. 服务器响应 200 OK  或 304 Not Modified
条件请求 (2) If-None-Match / ETag 1. Server 响应 200 OK ETag: abcdef 2.  浏览器请求 GET … HTTP/1.1 If-None-Match: abcdef 3. Server 响应 200 OK  或 304 Not Modified
Expiration Expires 设置对象的绝对失效时间 是 HTTP/1.0 规范 max-age 是 Cache-control 的一个指令 设置对象的年龄(秒数) 是 HTTP/1.1 规范 max-age 优先于 Expires
Cache-control no-cache=[Set-cookie] 浏览器和 squid 都不可以缓存 再次使用前需发送条件请求 max-age=NNN 指定缓存有效时间(秒) public 浏览器和 squid 都可以缓存 max-age 指定缓存时间 private 只有浏览器可以缓存
Cookies HTTP 请求携带 Cookies: Cookie: name=profile,domain=www.bigmoney.com, path=mysecrets.html, cookie=day-trader  HTTP 响应设置 Cookies: Set-cookie: name=profile,domain=www.bigmoney.com, path=mysecrets.html, cookie=day-trader  Cached content 需要的时候才设置 Cookies—— 太理想化 Squid 添加一个 IMS 头
一些典型的 Cache 场景 返回个人信息 Cache-control: private, max-age=NNN CGI 写操作 Cache-control: no-store, no-cache CGI 获取状态等信息 Cache-control: public, max-age=NNN
QQvideo 实践分享
QQvideo Web 架构图
实践要点 3DNS + HAProxy 实现负载均衡、接入保护 动态、静态文件分用不同服务器 首页静态化 某些频繁调用 CGI : Squid 缓存 视频播放: CDN 加速 缩略图: Squid 缓存 Web 数据缓存: Memcached
QQvideo 的一些数据 HAProxy : 每天转发 HTTP 请求: 5500 万 CPU 占用率: 10~20% <增加图片> 图片 Squid: 命中率: 90% <增加图片> Memcached : 命中率: 40% 左右 <增加图片>
相关软件介绍
HAProxy http://haproxy.1wt.eu 特色 L7 交换 采用 epoll ,效率很高 配置简单灵活,部署很容易 Graceful restart –  不影响已有连接 Web 监控界面 – 清晰直观 内容分发( Content Switching) ACL 定义规则 ACL 灵活组合选择分发 backend 请求 / 响应头改写 负载均衡和过载保护 负载均衡策略:加权 round-robin 、 Source 、 URL Sticky sessions  接入连接数限制 后端服务器健康监测
HAproxy 与 LVS 比较 HAProxy 效率不如 LVS User 级  vs.  内核级 HAProxy 部署简单 一个程序  vs.  内核 patch HAProxy 功能丰富 L7 vs. L4 HAProxy 性能可满足大部分网站需要,达到较大规模时可改用 LVS.
HAproxy 配置 URL 分发规则 多个 server 池 Sticky sessions 健康检测和接入限制
HAProxy Web 界面
 
Memcached http://www.danga.com/memcached 高性能的,分布式的内存对象缓存系统  Epoll 驱动,效率高 高效的内存管理机制 缓存对象可设置 Expire 时间 使用简单,部署更简单 万金油 Web Cache 昵称缓存 用户观看历史 后台管理系统 用户操作频率控制
Memcached 运行状况
Squid http://www.squid-cache.org 有力的竞争者  Varnish!
Squid 监控
谢 谢!

More Related Content

腾讯大讲堂08 可扩展web架构探讨