对于一个访问量日益增加的网站架构而言,从单机到集群、从集群到分布式,架构演化是必然的。笔者现在的在刚接手时算是单机LAMP。在单机LAMP时,由于访问量逐渐变大,网站会经常出现打不开的情况,到后来为了满足业务访问需求,将架构改为CDN+Nginx负载均衡+LNMP+代码层请看如下
对于一个访问量日益增加的网站架构而言,从单机到集群、从集群到分布式,架构演化是必然的。笔者现在的在刚接手时算是单机LAMP。在单机LAMP时,由于访问量逐渐变大,网站会经常出现打不开的情况,到后来为了满足业务访问需求,将架构改为CDN+Nginx负载均衡+LNMP+代码层缓存+MySQL主从,从而将网站整体负载性能提升15倍。
AD:
【51CTO独家特稿】面对网站服务器端负载增大的问题,是“拿15万¥买一台服务器”来解决,还是靠“加三倍服务器”来解决?还是用其它一些办法?
对于一个访问量日益增加的网站架构而言,从单机到集群、从集群到分布式,架构演化是必然的。
接手,分析瓶颈,扩展架构
笔者现在的在刚接手时算是单机LAMP。在单机LAMP时,由于访问量逐渐变大,网站会经常出现打不开的情况,为了解决这个问题在LAMP前端临时加了一台vanish来缓存一些静态文件,从而减轻了web服务器的负载。再到后来为了满足业务访问需求,将架构改为CDN+Nginx负载均衡(反向代理)+LNMP+代码层缓存+MySQL主从,从而将网站整体负载性能提升15倍,且访问速度也得到很大提升。
负载均衡为什么要选择使用Nginx呢?
普通负载均衡用LVS,文艺负载均衡用Nginx/F5/HAproxy,负载均衡用NLB
LVS:四层负载均衡的典型代表,目前已经被添加到linux发行版的内核。LVS用于较为成熟,因此不再做类述,在此推荐一篇不错的LVS文章:《互联网运营智慧》第六章负载均衡及服务器集群(LVS)。
Nginx/F5/HAproxy:均为七层负载均衡,F5为商业设备,功能强大,但价格不菲,所以在此不做讨论;HAproxy为重量级的七层负载均衡/反向代理程序,一般应用于大中型站点;而Nginx虽然属于轻量级产品,但是功能毫不逊色与HAproxy,如可以对静态文件可以实现缓存、可以通过URL、目录结构、静动分离对网站实现分流,还可以实现对后端服务器状态码健康检测、对网络依赖较小、对虚拟主机支持友好等等,这也是笔者选择Nginx来做负载均衡的原因。
NLB:windows下的东东,性能、可操作性可想而知。在此也提醒一下各位同仁,针对HTTP类的应用千万不要选择使用windows,如同样的业务放linux上只需两台服务器,而放windows上可能会需要三台甚至更多,运维/硬件采购成本也会增加,同时license也是一笔不小的费用。国内较大的一些web站点后端架构为windows的分别有京东商城、当当网、凡客诚品、麦包包。
使用Nginx构建负载均衡时需要注意的几个问题
Session同步:由于笔者所的架构硬件预算受限,所以在整个架构中没有共享存储,针对于session处理,笔者使用ip_hash来解决后端服务器session问题。另外,关于存储session,推荐使用redis或memcached(感谢小卫、小灰狼两位兄弟的)。
网站代码存储:还是由于没有共享存储,所以笔者每台web服务器本地均存放一份代码,为了多台web服务器的代码数据一致性,使用rsync+inotify实现动态同步(具体实现方在后面的文章中介绍)。倘若硬件条件允许的情况下,推荐使用NFS来存储;若考虑到NFS无法满足性能需求,可以将NFS的硬盘换成SSD或者使用分布式文件系统来解决。
负载均衡模式选择:在不受session困扰的情况下,负载均衡模式可以使用weight,因为ip_hash会有导致后端服务器负载不均的情况出现。
开始部署Nginx和Keepalived
为了避免负载均衡出现单点故障,所以使用keepalived对Nginx负载均衡做了HA,也就是说当主负载均衡发生软硬件故障时,负载均衡服务将有备用负载均衡服务器自动接管服务,拓扑如下:
Nginx-proxy-master:192.168.1.101
http 192.168.1.100Nginx-proxy-backup:192.168.1.102
安装Nginx与Keepalived
在Nginx-proxy-master和Nginx-proxy-backup上分别安装Nginx、Keepalived,两台主机安装步骤相同
安装Nginx
#yum-yinstallpcrepcre-devel#useraddwww-s/sbin/nologin#tarzxvfnginx-0.7.62.tar.gz#cdnginx-0.7.62#./configure\--prefix=/usr/local/nginx\--user=www\--group=www\--with-http_stub_status_module\--with-http_ssl_module#make&&makeinstall
tags:http 192.168