king

揭秘企业级web负载均衡完美架构(图)

king 运维技术 2022-11-14 617浏览 0

相信很多朋友对企业级的负载均衡高可用实例非常感兴趣,此篇文章根据成熟的线上环境而写,旨在帮助大家迅速架构一个企业级的负载均衡高可用的web环境。

此系统架构仅映射内网VIP的80及443端口于外网的Juniper防火墙下,其它端口均关闭,内网所有机器均关闭iptables及ipfw防火墙;外网DNS指向即通过Juniper映射出来的外网地址,而此映射的地址对映的其实是内网VIP地址。这里说下端口的问题,有的朋友可能会很疑惑,这样映射端口行不?通过项目实践得知,这样完全是可行的,php-cgi需要的9000端口及MySQL的3306端口均可走内网,完全不影响业务系统的运行。

另外,我维护的电子商务网站并发大约在1000左右,此时,Nginx+Apache集群运行得非常稳定,尤其是apache,并没有想象中那般弱;其实,在内存足够(>=8G)的情况,测试时不连数据库的话,单台apache+php5能顶得住6000并发,而且相当稳定。在网站升级架构方面,我不赞成全面淘汰生级,锦上添花式的升级会更好。

揭秘企业级web负载均衡完美架构(图)

第一部分:Nginx+Keepalived的说明及环境说明

喜欢看我博客或文章的朋友都知道,我一直主力推崇Nginx+Keepalived作web的负载均衡高可用架构,并积极将其用于项目方案中;Nginx负载均衡作服务器遇到的故障一般有①服务器网线松动等网络故障;②服务器硬件故障从而crash;③nginx服务死掉;遇到前二者情况,keeaplived是能起到HA的作用的;然而遇到③种情况就没有办法了,但可以通过shell监控解决这问题,从而实现真正意义上的负载均衡高可用。此篇的最新更新时间为2010年6月25号,下面将其安装步骤详细说明下:

环境:

centos5.3(64位)、nginx-0.7.51、keepalived-1.1.15 
主nginx负载均衡器:192.168.0.154 
辅nginx负载均衡器:192.168.9.155 
vip:192.168.0.188

#p#

第二部分:分别安装Nginx负载均衡器及相关配置脚本

先安装Nginx负载均衡器,nginx负载的配置就用一般的模板来配置了

#添加运行nginx的用户和组www 
groupaddwww 
useradd-gwwwwww 
wgetftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.8.tar.gz 
tarzxvfpcre-7.8.tar.gz 
cdpcre-7.8/ 
./configure 
make&&makeinstall 
wgethttp://sysoev.ru/nginx/nginx-0.7.51.tar.gz 
tarzxvfnginx-0.7.51.tar.gz 
cdnginx-0.7.51/ 
./configure--user=www--group=www--prefix=/usr/local/webserver/nginx--with-http_stub_status_module--with-http_ssl_module 
make&&makeinstall

配置nginx负载均衡器的配置文件vim /usr/local/nginx/conf/nginx.conf,此篇文章仅仅只是我的某项目的配置文档,纯80转发;如果对nginx配置有https要求的可参考张宴的相关文章。

userwwwwww; 
worker_processes8; 

pid/usr/local/nginx/logs/nginx.pid; 
worker_rlimit_nofile65535; 

events 
{ 
useepoll; 
worker_connections65535; 
} 
http{ 
includemime.types; 
default_typeapplication/octet-stream; 
server_names_hash_bucket_size128; 
client_header_buffer_size32k; 
large_client_header_buffers432k; 
client_max_body_size8m; 
sendfileon; 
tcp_nopushon; 
keepalive_timeout60; 
tcp_nodelayon; 
fastcgi_connect_timeout300; 
fastcgi_send_timeout300; 
fastcgi_read_timeout300; 
fastcgi_buffer_size64k; 
fastcgi_buffers464k; 
fastcgi_busy_buffers_size128k; 
fastcgi_temp_file_write_size128k; 
gzipon; 
gzip_min_length1k; 
gzip_buffers416k; 
gzip_http_version1.0; 
gzip_comp_level2; 
gzip_typestext/plainapplication/x-javascripttext/cssapplication/xml; 
gzip_varyon; 

upstreambackend 
{ 
server192.168.1.102:80; 
server192.168.1.103:80; 
server192.168.1.105:80; 
} 
server{ 
listen80; 
server_namewww.yuhongchun027.com; 
location/{ 
root/var/www; 
indexindex.jspindex.htmindex.html; 
proxy_redirectoff; 
proxy_set_headerHost$host; 
proxy_set_headerX-Real-IP$remote_addr; 
proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; 
proxy_passhttp://backend; 
} 

location/nginx{ 
access_logon; 
auth_basic"NginxStatus"; 
auth_basic_user_file/usr/local/nginx/htpasswd; 
} 

log_formataccess'$remote_addr-$remote_user[$time_local]"$request"' 
'$status$body_bytes_sent"$http_referer"' 
'"$http_user_agent"$http_x_forwarded_for'; 
access_log/var/log/access.logaccess; 

} 
}

小节:

第一部分和第二部分讲的是如何通过安装Nginx来达到负载均衡后端web集群的过程,Nginx能实现自动切换后端有故障的web服务器;但Nginx负载均衡器出了问题怎么办呢,它们之间是如何实现无故障转移的呢?#p#

第三部分:安装Keepalived,让其分别作web及Nginx的HA

安装keepalived,并将其做成服务模式,方便以后调试。

wgethttp://www.keepalived.org/software/keepalived-1.1.15.tar.gz 
#tarzxvfkeepalived-1.1.15.tar.gz 
#cdkeepalived-1.1.15 
#./configure--prefix=/usr/local/keepalived 
#make 
#makeinstall 
#cp/usr/local/keepalived/sbin/keepalived/usr/sbin/ 
#cp/usr/local/keepalived/etc/sysconfig/keepalived/etc/sysconfig/ 
#cp/usr/local/keepalived/etc/rc.d/init.d/keepalived/etc/init.d/ 
#mkdir/etc/keepalived 
#cd/etc/keepalived/ 

vimkeepalived.conf 
!ConfigurationFileforkeepalived 
global_defs{ 
notification_email{ 
yuhongchun027@163.com 
} 
notification_email_fromkeepalived@chtopnet.com 
smtp_server127.0.0.1 
smtp_connect_timeout30 
router_idLVS_DEVEL 
} 
vrrp_instanceVI_1{ 
stateMASTER 
interfaceeth0 
virtual_router_id51 
mcast_src_ip192.168.0.154<==主nginx的IP地址 
priority100 
advert_int1 
authentication{ 
auth_typePASS 
auth_passchtopnet 
} 
virtual_ipaddress{ 
192.168.0.188<==vip地址 
} 
} 
#servicekeepalivedstart

我们来看一下日志:

[root@ltos~]#tail/var/log/messages 
Oct603:25:03ltosavahi-daemon[2306]:Registeringnewaddressrecordfor192.168.0.188oneth0. 
Oct603:25:03ltosavahi-daemon[2306]:Registeringnewaddressrecordfor192.168.0.154oneth0. 
Oct603:25:03ltosavahi-daemon[2306]:RegisteringHINFOrecordwithvalues'I686'/'LINUX'. 
Oct603:25:23ltosavahi-daemon[2306]:Withdrawingaddressrecordforfe80::20c:29ff:feb9:eeaboneth0. 
Oct603:25:23ltosavahi-daemon[2306]:Withdrawingaddressrecordfor192.168.0.154oneth0. 
Oct603:25:23ltosavahi-daemon[2306]:Hostnameconflict,retryingwith<ltos-31>

很显然vrrp已经启动,我们还可以通过命令来检查

[root@ltoshtml]#ipaddr 
1:lo:<LOOPBACK,UP,LOWER_UP>mtu16436qdiscnoqueue 
link/loopback00:00:00:00:00:00brd00:00:00:00:00:00 
inet127.0.0.1/8scopehostlo 
inet6::1/128scopehost 
valid_lftforeverpreferred_lftforever 
2:eth0:<BROADCAST,MULTICAST,UP,LOWER_UP>mtu1500qdiscpfifo_fastqlen1000 
link/ether00:0c:29:ba:9b:e7brdff:ff:ff:ff:ff:ff 
inet192.168.0.154/24brd192.168.0.255scopeglobaleth0 
inet192.168.0.188/32scopeglobaleth0 
inet6fe80::20c:29ff:feba:9be7/64scopelink 
valid_lftforeverpreferred_lftforever 
3:sit0:<NOARP>mtu1480qdiscnoop 
link/sit0.0.0.0brd0.0.0.0

说明vip已经启动,这样主服务器就配置好了,辅机的配置大致一样,除了配置文件有少部分的变化,下面贴出辅机的配置文件:

!ConfigurationFileforkeepalived 
global_defs{ 
notification_email{ 
yuhongchun027@163.com 
} 
notification_email_fromkeepalived@chtopnet.com 
smtp_server127.0.0.1 
smtp_connect_timeout30 
router_idLVS_DEVEL 
} 
vrrp_instanceVI_1{ 
stateBACKUP 
interfaceeth0 
virtual_router_id51 
mcast_src_ip192.168.0.155<==辅nginx的IP的地址 
priority100 
advert_int1 
authentication{ 
auth_typePASS 
auth_passchtopnet 
} 
virtual_ipaddress{ 
192.168.0.188 
} 
}

#p#

第四部分:针对Keepalived的不足,用Nginx_pid.sh来监控nginx进程,实现真正意义上的负载均衡高可用。

针对Nginx+Keepalived,编写nginx监控脚本nginx_pid.sh,此脚本思路其实也很简单,即放置在后台一直监控nginx进程;如进程消失,尝试重启nginx,如是失败则立即停掉本机的keepalived服务,让另一台负载均衡器接手,此脚本直接从生产环境下载:

vim/root/nginx_pid.sh 
#!/bin/bash 
while: 
do 
nginxpid=`ps-Cnginx--no-header|wc-l` 
if[$nginxpid-eq0];then 
/usr/local/nginx/sbin/nginx 
sleep5 
  nginxpid=`ps -C nginx --no-header | wc -l`
if[$nginxpid-eq0];then 
/etc/init.d/keepalivedstop 
fi 
fi 
sleep5 
done

然后置于后台运行 sh /root/nginx_pid.sh &,这种写法是错误的,这样你用root用户logout后,此进程会消失;正确写法为nohup/bin/bash /root/nginx_pid.sh &,附带下注释:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出root帐户之后继续运行相应的进程。nohup就是不挂起的意思( no hang up),哈哈,差点老马失蹄了。

后记:

我的线上环境网络非常复杂,这也是LVS+Keepalived失败的原因。目前此套架构在1000并发的电子商务网站非常稳定,带来的直接影响就是nginx_backup一直处于闲置状态。相对于张宴的双机轮询而言,我感觉他的可能更加完美,因为目前我的Nginx仅仅只做了负载均衡器,如果以后有机会我会尝试做负载均衡器/反向代理加速。

继续浏览有关 网络 的文章
发表评论