Web负载均衡高可用之Nginx+Keepalived
说明: 实验环境CentOS_6.5-X86_64,由于前端Director上的操作有重复内容,因此下面的操作选择在管理机上使用ansible以及安装脚本统一部署Director上的nginx&&keepalived,后端两台RealServer上的Nginx在此前的实验中已经安装好,直接可以提供服务,实验过程中所有机器上的iptables&selinux均得关闭。管理机上ansible的配置,nginx详细配置及其SysV init脚本可查阅以前的博文,这里不再赘述。一、配置后端两台RealServer提供web server
1、在管理机上配置好realserver.sh,拷贝到RS1,RS2上并执行,绑定VIP到网络设备lo:0,并修改相关内核参数来设定ARP抵制功能
# ansible realserver -m copy -a 'src=/root/realserver.sh dest=/root/'
# ansible realserver -m shell -a 'sh /root/realserver.sh start'
realserver.sh
可以将脚本启动命令添加至系统自启文件中,防止服务器调试时重启而忘记参数设置
2、测试web服务是否正常提供
二、在前端两台Director上安装nginx
1、准备好编译环境并安装好依赖的基础库,添加运行nginx的用户和组
# ansible nginx -m yum -a "name=pcre-devel"
# ansible nginx -m yum -a "name=openssl-devel"
# ansible nginx -m group -a "system=yes name=nginx"
# ansible nginx -m user -a "system=yes group=nginx name=nginx"
2、在管理机上编辑安装脚本
3、将安装脚本从管理机拷贝到节点机上,使用copy模块传送文件的时候报错,是ansible需要python-selinux包而节点机上没有,于是用yum模块安装
4、重新拷贝安装脚本到节点机;执行成功后为nginx提供SysV init脚
本,而后赋予此脚本执行权限,将其添加至服务管理列表,并设置开机自动启动
# ansible nginx -m copy -a 'src=/root/installNgx.sh dest=/root/'
# ansible nginx -m shell -a 'sh /root/installNgx.sh'
# vim nginx##SysV init脚本可查看前一篇博文
# ansible nginx -m copy -a 'src=/root/nginx dest=/etc/rc.d/init.d/nginx'
# ansible nginx -m shell -a 'chmod +x /etc/rc.d/init.d/nginx'
# ansible nginx -m shell -a 'chkconfig --add nginx'
# ansible nginx -m shell -a 'chkconfig nginx on'
5、配置Nginx的upstream模块,实现对RealServer访问的负载均衡,详细说明可参考官方文档:
http://nginx.org/en/docs/http/load_balancing.html
http://nginx.org/en/docs/http/ngx_http_upstream_module.html
在前端两台Director上编辑nginx配置文件/etc/nginx/nginx.conf,添加下图红框内容
6、测试启动nginx,访问成功
三、在前端两台Director上上安装keepalived,让其分别作为Web&Nginx的HA
1、管理机上编辑安装脚本,而后复制脚本到Director并执行脚本进行安装
# ansible nginx -m copy -a 'src=/root/installKep.sh dest=/root/'
# ansible nginx -m shell -a 'sh /root/installKep.sh'
2、管理机上编辑脚本将keepalived做成服务模式,方便启动和关闭,安装成功后输出命令到系统PAT路径中,提供服务启动脚本和配置文件
# ansible nginx -m copy -a 'src=/root/init.sh dest=/root/'
# ansible nginx -m shell -a 'sh /root/init.sh'
3、安装工具方便监测服务转移情况
# ansible nginx -m yum -a "name=ipvsadm"
4、在Director配置keepalived,先输出keepalived的man手册至man命令的查找路径,通过命令man keepalived.conf查看配置选项帮助
5、编辑配置文件
# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
admin@localhost ##出现故障向该邮箱发送信息,这里可设为本机
}
notification_email_from keepalived@localhost ##指定发件人
smtp_server 127.0.0.1 ##指定smtp服务器地址
smtp_connect_timeout 30 ##指定smtp连接超时时间
router_id LVS_DEVEL ##运行keepalived的一个标识
}
vrrp_instance VI_1 { ##VIP实例相当于虚拟路由
state MASTER ##当前节点的起始状态,通常在master/slave的双节点模型中,其一个默认为MASTER,而别一个默认为BACKUP
interface eth0 ## 通告信息基于该接口发送以及虚拟路由的工作物理接口
virtual_router_id 51 ## 两台服务器必须一样
priority 99 ##priority为当关节点在当前虚拟路由器中的优先级,MASTER的优先级应该大于SLAVE
advert_int 1 ##检查间隔,1秒
authentication {
auth_type PASS ## 认证方式为加密
auth_pass 1234 ## 加密的密码,两台服务器必须一样(openssl rand -hex 6生成随机字符串)
}
virtual_ipaddress {
10.33.100.11/16 dev eth0 label eth0:0
}
virtual_server 10.33.100.11 80 {
delay_loop 6 ##健康检查时间间隔,单位秒
lb_algo rr ##负载调度算法,支持的算法:rr|wrr|lc|wlc|lblc|sh|dh
lb_kind DR ##LVS的类型:有NAT|DR|TUN
nat_mask 255.255.255.0
persistence_timeout50 ##会话保持时间,单位秒(可以适当延长时间以保持session)
protocol TCP ##转发协议类型,有TCP和UDP两种
real_server 10.33.100.15 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 10.33.100.16 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
Node2上的配置文件只需要做以下两处修改即可,注意优先级设置要做好规划,一旦检测到故障MASTER要降低优先级,要确保降低以后的优先级比BACKUP小
6、编辑好配置文件后就可以启动keepalived服务测试负载均衡
不断刷新网页测试负载均衡效果
说明: RealServer的高可用功能实际上是由前端Director的健康状况监测功能实现的,因此当其中一个RealServer故障时,并不会引起IP地址的漂移,而用ipvsadm -L -n命令查看时会发现故障的RealServer条目已被删除;当前端Director出现故障时则会引起IP地址的漂移。
至此Keepalived+Nginx的高可用集群已部署完毕,接下来阐述测试高可用中的3个问题
Q1、当所有RealServer都故障停止服务,如何给用户返回错误页面?
当所有RealServer都down的时候,由Director本地提供错误页面,而由于无法确定故障时刻真正工作的Director节点是哪一个,所以在前端两台Director上都要做图中红色标记的配置
方法1:利用niginx健康状况监测功能
可以通过设置upstream模块的backup参数实现错误提示页面的显示
backup: 标记此处定义的server为备用机,当主节点不可用时备用机传递请求
marks the server as a backup server. It will be passed requests when the primary servers are unavailable.
下面首先测试Director提供的错误页面是否可以正常访问
在手动停止RealServer上的web服务,测试访问
方法2:利用keepalived健康状况监测功能
将error_page指向/usr/html/errro.html, 由于后端RealServer停止服务,nginx转发的请求无法得到响应,nginx会认为服务器错误,会直接返回error_page
编辑两台Director上keepalived的配置文件/etc/keepalived/keepalived.conf ,在virtual_server中添加下图标记的一行内容
# ansible nginx -m service -a 'name=keepalived state=restarted'
3、手动停止RS1&&RS2上的web服务,测试错误提示页面成功显示;之后再手动启动RS1&&RS2上的web服务,又可以正常访问web页面
Q2、如何自写监测脚本监测Nginx进程,完成维护模式切换,实现真正意义上的负载均衡高可用?
1、编辑两台Director上keepalived的配置文件/etc/keepalived/keepalived.conf ,在实例之外定义vrrp_script,实例中定义track_script来完成Nginx服务的监测
2、编辑脚本/usr/lib/nginx_pid.sh
3、手动停止Director1上的nginx,而后重启keepalived,测试keepalived能否实现主备节点切换
# service nginx stop
# ansible nginx -m service -a 'name=keepalived state=restarted'
4、查看日志,切换成功
Q3、如何在vrrp事务(主备节点切换,节点故障)发生时,发送警告邮件给指定的管理员?
1、执行命令man keepalived.conf查看启用notify脚本的定义,当节点状态在主备间切换或失败时,分别执行相对应的脚本
2、将配置文件中需要3个脚本实现的功能融合到一起,编写notify脚本,让其可以接受选项参数来完成通知管理员事务的功能
-m, –mode {mm|mb}: 指定虚拟路由的模型,mm表示主主,mb表示主备;表示相对于同一种服务而言其VIP的工作类型;
-s, –service SERVICE,…: 指定服务脚本名称,当状态切换时可自动启动、重启或关闭此服务;
-a, –address VIP:指定相关虚拟路由器的VIP地址;
-n, –notify {master|backup|fault}: 指定通知的类型,即vrrp角色切换的目标角色;
-h, –help: 获取脚本的使用帮助;
3、编辑两台Director上keepalived的配置文件/etc/keepalivedkeepalived.conf,在实例中添加下图红色标记部分,调用notify.sh脚本:
4、测试notify通知功能,在Node1上手动停止nginx服务,查看邮件
在手动启动nginx,查看邮件,至此notify测试完成,可以看出keepalived是在很大程度上依赖于执行脚本来实现其扩展功能的HA服务
页:
[1]