高性能的网站架构离不开各层中间件的支持,作为一个成长中的架构师,富有创造力固然很重要,但是博览各家之架构,集各家之所长,拓展眼界,不断进步无疑是同样重要的,看多了各大型互联网的架构,其实多多少少都离不开下面列到的一些东西,所谓万变不离其宗,这些就好比各种兵器,作为一个武林高手,18般武器还是多少要熟悉一些的。下面是我的一些整理,有些实战过,有些只是初步研究:
高性能网站的架构如下图:
1.最前端负载均衡层
硬件负载均衡:
NetScaler、F5、Radware和Array:优点就是有专业的维护团队来对这些服务进行维护、缺点就是花销太大,所以对于规模较小的网络服务来说暂时还没有需要使用。
软件负载均衡:
LVS:采用persistent机制(NAT/TUN/DR),工作在网络4层之上仅作分发之用,高抗负载,易配置,稳定性强,但对网络要求较高,且不支持正则,不能做动静分离。
Nginx:采用ip_hash机制,工作在网络7层之上,网络依赖小,支持灵活正则表达,能通过端口检测到服务器内部故障,但不支持url检测,而且仅能支持http和Email。
HA-Proxy:采用balance source机制,工作在网络第4层和第7层,纯负载软件,支持虚拟主机,能够补充Nginx的一些缺点比如Session的保持,COOKIE的引导等工作,并且支持url检测,负载效率和并发处理优于Nginx,它跟LVS的persistent和Nginx的ip_hash一样,是让客户机访问时始终访问后端的某一台真实的web服务器。
2.代理缓存层
代理缓存主要部署在web server之上,当用户对网站后台发起连接请求时,用户请求先到代理缓存中去查找,如果命中,则将请求返回给用户,如果没有命中,则代理缓存将请求发到 web server,然后web sever将请求复制一份到代理缓存中,同时把请求返回给客户。常用的代理缓存有varnish和squid。
Varnish:将所有的HTTP object存于一个单独的大文件中,该文件在工作进程初始化的时候,将其整个映射到内存中。这样Varnish在该块内存中实现一个简单的文件系统,具有分配、释放、修剪、合并内存等功能。其工作进程分为master进程和child进程,master进程负责初始化及fork并监控child进程,而child进程分配若干线程(Accept线程,Work线程,Epoll监听线程,Expire过期处理线程)
Squid:每一台Squid代理服务器上存有若干个颗磁盘。每颗磁盘又分割成多个分区,每一个分区又可建立很多目录,目录下存放着具体的文件(object)。其通过查询表的方式来定位某个资源的位置。所查询的表有两种,一种是Hash table,一种是Digest table。Hash table记录着所有Digest table表信息,所以Hash table可以称之为目录或者提纲。而Digest table记录了磁盘上每个分区、每个目录里存放的缓存摘要,所以Digest table可以称之为摘要或者索引。所以,Squid接到请求后先查询Hashtable,根据Hash table所指向的Digest table,再查询所需要的文件。
Nginx:Nginx已经具备Squid所拥有的Web缓存加速功能,此外,Nginx对多核CPU的利用,胜过Squid不少,现在越来越来的架构师都喜欢将Nginx同时作为“负载均衡服务器”与“Web缓存服务器”来使用。
3.Web Server
Web server的作用就是解析HTTP协议,通过用户发来请求的url地址从web服务器的文件系统中找到用户需要的HTML页面、静态文件,然后返回给用户。如果用户访问的是动态页面,则将请求转发到应用服务器(其上部署了如CGI(Common Gateway Interface), JSP, Servlets, ASP.NET,PHP脚本等)来执行。
Lighttpd:一个单进程模型的web server,内存使用量很小,CPU占用率低,性能好的轻量级Web Server。支持FastCGI, CGI, 输出压缩,URL重写,Alias等重要功能。使用FastCGI方式运行php。
Apache:是一款重量级的web服务器,也是世界上使用最多的web服务器,总体来讲,Apache web 服务器具有以下特性:
(1) 支持HTTP1.1通信协议。
(2) 支持通用网关接口。
(3) 支持基于ip、域名、端口的虚拟主机。
(4) 支持服务器端包含指令(ssl)。
(5) 支持FastCGI。
(6) 支持url重写。
Nginx:使用多线程来处理请求,这使得多个线程之间可以共享内存资源,使用分阶段的内存分配策略,按需分配,及时释放,总体占用内存很小,可以支持较大的并发连接数。能够选择高效的epoll(Linux 2.6内核)、kqueue(FreeBSD)、eventport(Solaris 10)作为网络I/O模型,在高连接并发的情况下,Nginx是Apache服务器很好的替代者,因为在同样并发连接的情况下,Nginx相对 Apache占用更少的系统资源。
4.应用服务器
Tomcat
websphere
JBoss
Weblogic
GlassFish
5.服务端缓存
Memcached:是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。默认情况下采用名为Slab Allocator机制分配、管理内存。Slab Allocator的基本原理是将分配的内存分割成各种尺寸的块(chunk),并将尺寸相同的块分成组(chunk的集合)
6.文件服务器层
单NFS:
热备DRDB+HeartBeat+NFS:
MFS:
自主研发分布式文件系统:
淘宝TFS
7.数据库
memcached数据缓存服务器:
Mysql主从复制,读写分离:
LVS+MySql集群:
当后面的MySQL机器超过十台时,HAProxy在这方面的性能不如LVS
水平分库设计:
垂直分区设计: