设为首页 收藏本站
查看: 1889|回复: 0

[经验分享] Web负载均衡高可用之Nginx+Keepalived

[复制链接]

尚未签到

发表于 2015-11-20 07:17:00 | 显示全部楼层 |阅读模式
  说明: 实验环境CentOS_6.5-X86_64,由于前端Director上的操作有重复内容,因此下面的操作选择在管理机上使用ansible以及安装脚本统一部署Director上的nginx&&keepalived,后端两台RealServer上的Nginx在此前的实验中已经安装好,直接可以提供服务,实验过程中所有机器上的iptables&selinux均得关闭。管理机上ansible的配置,nginx详细配置及其SysV init脚本可查阅以前的博文,这里不再赘述。

DSC0000.jpg

DSC0001.jpg

一、配置后端两台RealServer提供web server

1、在管理机上配置好realserver.sh,拷贝到RS1,RS2上并执行,绑定VIP到网络设备lo:0,并修改相关内核参数来设定ARP抵制功能


[iyunv@DQ ~]# ansible realserver -m copy -a 'src=/root/realserver.sh dest=/root/'
[iyunv@DQ ~]# ansible realserver -m shell -a 'sh /root/realserver.sh start'
  realserver.sh

DSC0002.jpg

DSC0003.jpg

可以将脚本启动命令添加至系统自启文件中,防止服务器调试时重启而忘记参数设置

DSC0004.jpg

2、测试web服务是否正常提供

DSC0005.jpg

DSC0006.jpg

DSC0007.jpg

二、在前端两台Director上安装nginx

1、准备好编译环境并安装好依赖的基础库,添加运行nginx的用户和组


[iyunv@DQ ~]# ansible nginx -m yum -a "name=pcre-devel"
[iyunv@DQ ~]# ansible nginx -m yum -a "name=openssl-devel"
[iyunv@DQ ~]# ansible nginx -m group -a "system=yes name=nginx"
[iyunv@DQ ~]# ansible nginx -m user -a "system=yes group=nginx name=nginx"
DSC0008.jpg

2、在管理机上编辑安装脚本

DSC0009.jpg

3、将安装脚本从管理机拷贝到节点机上,使用copy模块传送文件的时候报错,是ansible需要python-selinux包而节点机上没有,于是用yum模块安装

DSC00010.jpg

4、重新拷贝安装脚本到节点机;执行成功后为nginx提供SysV init脚

本,而后赋予此脚本执行权限,将其添加至服务管理列表,并设置开机自动启动


[iyunv@DQ ~]# ansible nginx -m copy -a 'src=/root/installNgx.sh dest=/root/'
[iyunv@DQ ~]# ansible nginx -m shell -a 'sh /root/installNgx.sh'  
[iyunv@DQ ~]# vim nginx  ##SysV init脚本可查看前一篇博文
[iyunv@DQ ~]# ansible nginx -m copy -a 'src=/root/nginx dest=/etc/rc.d/init.d/nginx'
[iyunv@DQ ~]# ansible nginx -m shell -a 'chmod +x /etc/rc.d/init.d/nginx'
[iyunv@DQ ~]# ansible nginx -m shell -a 'chkconfig --add nginx'
[iyunv@DQ ~]# 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,添加下图红框内容

DSC00011.jpg

6、测试启动nginx,访问成功

DSC00012.jpg

三、在前端两台Director上上安装keepalived,让其分别作为Web&Nginx的HA

1、管理机上编辑安装脚本,而后复制脚本到Director并执行脚本进行安装

DSC00013.jpg


[iyunv@DQ ~]# ansible nginx -m copy -a 'src=/root/installKep.sh dest=/root/'
[iyunv@DQ ~]# ansible nginx -m shell -a 'sh /root/installKep.sh'
  2、管理机上编辑脚本将keepalived做成服务模式,方便启动和关闭,安装成功后输出命令到系统PAT路径中,提供服务启动脚本和配置文件

DSC00014.jpg


[iyunv@DQ ~]# ansible nginx -m copy -a 'src=/root/init.sh dest=/root/'
[iyunv@DQ ~]# ansible nginx -m shell -a 'sh /root/init.sh'
  3、安装工具方便监测服务转移情况


[iyunv@DQ ~]# ansible nginx -m yum -a "name=ipvsadm"
  4、在Director配置keepalived,先输出keepalived的man手册至man命令的查找路径,通过命令man keepalived.conf查看配置选项帮助

DSC00015.jpg

5、编辑配置文件


[iyunv@Node1 ~]# 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小

DSC00016.jpg

6、编辑好配置文件后就可以启动keepalived服务测试负载均衡

DSC00017.jpg

DSC00018.jpg

DSC00019.jpg

DSC00020.jpg

不断刷新网页测试负载均衡效果

DSC00021.jpg

说明: 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.  

DSC00022.jpg

下面首先测试Director提供的错误页面是否可以正常访问

DSC00023.jpg

在手动停止RealServer上的web服务,测试访问

DSC00024.jpg

方法2:利用keepalived健康状况监测功能

将error_page指向/usr/html/errro.html, 由于后端RealServer停止服务,nginx转发的请求无法得到响应,nginx会认为服务器错误,会直接返回error_page

DSC00025.jpg

编辑两台Director上keepalived的配置文件/etc/keepalived/keepalived.conf ,在virtual_server中添加下图标记的一行内容

DSC00026.jpg

[iyunv@DQ ~]# ansible nginx -m service -a 'name=keepalived state=restarted'
DSC00027.jpg

3、手动停止RS1&&RS2上的web服务,测试错误提示页面成功显示;之后再手动启动RS1&&RS2上的web服务,又可以正常访问web页面

DSC00028.jpg

Q2、如何自写监测脚本监测Nginx进程,完成维护模式切换,实现真正意义上的负载均衡高可用?

1、编辑两台Director上keepalived的配置文件/etc/keepalived/keepalived.conf ,在实例之外定义vrrp_script,实例中定义track_script来完成Nginx服务的监测

DSC00029.jpg
2、编辑脚本/usr/lib/nginx_pid.sh

DSC00030.jpg

3、手动停止Director1上的nginx,而后重启keepalived,测试keepalived能否实现主备节点切换


[iyunv@Node1 ~]# service nginx stop
[iyunv@DQ ~]# ansible nginx -m service -a 'name=keepalived state=restarted'
  4、查看日志,切换成功

DSC00031.jpg

Q3、如何在vrrp事务(主备节点切换,节点故障)发生时,发送警告邮件给指定的管理员?

1、执行命令man keepalived.conf查看启用notify脚本的定义,当节点状态在主备间切换或失败时,分别执行相对应的脚本

DSC00032.jpg

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: 获取脚本的使用帮助;

DSC00033.jpg

DSC00034.jpg

DSC00035.jpg

DSC00036.jpg

DSC00037.jpg

3、编辑两台Director上keepalived的配置文件/etc/keepalivedkeepalived.conf,在实例中添加下图红色标记部分,调用notify.sh脚本:

DSC00038.jpg

4、测试notify通知功能,在Node1上手动停止nginx服务,查看邮件

DSC00039.jpg

在手动启动nginx,查看邮件,至此notify测试完成,可以看出keepalived是在很大程度上依赖于执行脚本来实现其扩展功能的HA服务

DSC00040.jpg

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-141307-1-1.html 上篇帖子: LVS+KEEPALIVED+MYSQL单点写入读负载均衡主主同步高可用方案 下篇帖子: LVS+Keepalived+nginx-rtmp-module搭建流媒体服务器集群
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表