#本文欢迎转载,转载请注明出处和作者。
理论部分,在之前的文章已经说明过了,详见:
繁星亮与鲍包包:【理论研究】业务系统高可用及负载均衡zhuanlan.zhihu.com
上一篇已经讲述通过单台Nginx服务器对2/多台Apache服务器做负载均衡,但是Nginx本身却存在单点故障隐患。
繁星亮与鲍包包:【实战演练】Linux操作系统13-Nginx实现WEB服务器负载均衡zhuanlan.zhihu.com
如前面理论所述,解决上述问题,本篇介绍通过安装keepalive,对Nginx服务器做高可用HA。
1、Keepalived简介
Linux有很多开源的HA软件,keepalived是其中的一款,用keepalived可以用来解决很多应用程序的高可用问题。(如本篇的Nginx,以后后面对LVS、Mysql都可以用Keepalived来做高可用配置)
2、LVS、Keepalived、Nginx区别
LVS是用来做4层的负载均衡的,只能通过IP五元组进行流量分发。
Keepalived是用来做HA的,可以对任意的程序(需要写脚本)进行检测,然后对该软件做HA,例如可以对LVS、Nginx、Mysql等来做HA。
Keepalived内嵌LVS模块的,提供VIP的功能。所以如果用了Keepalived,就不需要额外做LVS的Director配置了,但是Realserver的配置还是需要。
Nginx,是可以做7层的负载均衡。LVS只能对IP五元组进行流量分发,而Nginx可以做到应用级别,例如动静分离(图片、视频)等。
3、安装Keepalived
3.1 安装
yum install keepalived -y
3.2 修改配置文件
cd /etc/keepalived
rm keepalived.conf
#原有的配置文件
vi keepalived.conf
#创建新的配置文件
注意配置文件只有一些关键参数必须修改,其他都是默认的。
Master(主)服务器配置
global_defs {notification_email {xxx@xxx.com}notification_email_from sns-lvs@gmail.comsmtp_server xxx.xxx.xxx.xxxsmtp_connection_timeout 30router_id LVS_MASTER # 设置lvs的id,在一个网络应该是唯一的
}vrrp_script chk_http_port {script "/usr/local/src/check_nginx_pid.sh" #最后手动执行下此脚本,以确保此脚本能够正常执行interval 2 #(检测脚本执行的间隔,单位是秒)weight 2
}vrrp_instance VI_1 {state MASTER # 指定keepalived的角色,MASTER为主,BACKUP为备interface eth1 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡),注意如果网卡是eth1,要对应修改。virtual_router_id 66 # 虚拟路由编号,主从要一直priority 100 # 优先级,数值越大,获取处理请求的优先级越高advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)authentication {auth_type PASSauth_pass 1111}track_script {chk_http_port #(调用检测脚本)}virtual_ipaddress {10.1.30.31 # 定义虚拟ip(VIP),可多设,每行一个}
}
注意上面配置中vrrp_script后面定义了一个叫chk_http_port的脚本,而真正脚本实际的路径是/usr/local/src/下面的check_nginx_pid.sh。这个是要后面实际添加的,也就是需要写一个脚本检测nginx服务运行状况。
下面的tracks_cript设置检测脚本为上面定义的chk_http_port,keepalived启动后会自动按照设置好的时间间隔,周期性调用检测脚本。
Slave(从)服务器配置
global_defs {notification_email {xxx@xxx.com}notification_email_from sns-lvs@gmail.comsmtp_server xxx.xxx.xxx.xxxsmtp_connection_timeout 30router_id LVS_BACKUP # 设置lvs的id,在一个网络应该是唯一的
}vrrp_script chk_http_port {script "/usr/local/src/check_nginx_pid.sh" #最后手动执行下此脚本,以确保此脚本能够正常执行interval 2 #(检测脚本执行的间隔,单位是秒)weight 2
}vrrp_instance VI_1 {state BACKUP # 指定keepalived的角色,MASTER为主,BACKUP为备
interface eth1 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡),注意如果网卡是eth1,要对应修改。
virtual_router_id 66 # 虚拟路由编号,主从要一致priority 99 # 优先级,数值越大,获取处理请求的优先级越高advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)authentication {auth_type PASSauth_pass 1111}track_script {chk_http_port #(调用检测脚本)}virtual_ipaddress {10.1.30.31 # 定义虚拟ip(VIP),可多设,每行一个}
}
3.3 编写检测脚本
编写nginx检测脚本,注意路径与名称要和上面keepalivce.conf中的保持一致。
vi /usr/local/src/check_nginx_pid.sh
# vi /usr/local/src/check_nginx_pid.sh
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then/usr/local/nginx/sbin/nginx #重启nginxif [ `ps -C nginx --no-header |wc -l` -eq 0 ];then #nginx重启失败,则停掉keepalived服务,进行VIP转移killall keepalivedfi
fi
增加脚本执行权限
chmod +x /usr/local/src/check_nginx_pid.sh
3.4 启动keepalived服务
3.4 测试
3.4.1 手动停止Nginx
启动进程后,在30.40输入ip a s查看虚拟IP是否成功挂载。
ping 虚拟IP测试
连续通过VIP(10.1.30.31)访问网站,不断刷新测试,发现访问流量已经在两个Apache01与Apache02之间分发。
然后对Nginx主机手动停止Nginx服务。
然后继续通过VIP(10.1.30.31)访问网站,发现网站依然能够正常访问。
通过ip a s查看,发现30.31还是在nginx01上面。
原因是这样的:我们设置了一个脚本(check_nginx_pid.sh),利用keepalived周期性自动运行,脚本检测nginx进程是否存活,如果进程异常退出/没有运行,脚本会重新启动nginx进程。
因此,上面手动停止nginx服务,keepalived并不会将VIP从主Nginx服务器切换到备Nginx服务器,而是通过脚本重启将nginx启动,。因此通过VIP访问网站,由于3秒内nginx已经重启启动了,业务仍然能够正常访问。
3.4.2 手动停止keepalived
主Nginx服务器手动停止Keepalived
通过ip a s发现VIP已经自动切换到备Nginx服务器了。
通过VIP访问网站,发现业务正常访问。
当前,2台Nginx服务器通过keepalived以及nginx检测脚本,实现了HA。但是用户通过VIP访问业务的时候,正常情况下只有1台Nginx负载用户的访问。
为了让2台Nginx服务器都能承载业务负载,下一篇通过keeaplived自带的LVS模块功能,实现2台Nginx服务器的负载均衡。