vincen 发表于 2015-11-20 07:17:00

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]
查看完整版本: Web负载均衡高可用之Nginx+Keepalived