nginx的安装参考:nginx
keepalived的安装参考:keepalived
背景:很多企业都在使用nginx做反向代理,负载均衡,一旦nginx挂了,任何请求都转发不到应用服务器,网站就GG了,所以nginx要实现高可用的,怎么实现呢,一般用keepalived。
keepalived的介绍:
Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat、corosync、pacemaker。但是它一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。
keepalived可以认为是VRRP协议在Linux上的实现,主要有三个模块,分别是core、check和vrrp。
core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。
check负责健康检查,包括常见的各种检查方式。
vrrp模块是来实现VRRP协议的。
一、环境说明:
操作系统:centos7,64位
master机器(master-node):192.168.116.128
slave机器(slave-node):192.168.116.129
公用的虚拟IP(VIP):192.168.116.120 //负载均衡器上配置的域名都解析到这个VIP上
二、配置服务
先查看防火墙状态:
/bin/systemctl status firewalld.service (centOS 7)
/bin/systemctl status iptables.service (centOS 6)
如果是开启的话,关闭:
/bin/systemctl stop firewalld.service (centOS 7)
/bin/systemctl stop iptables.service(centOS 6)
1、mater-node负载机上的keepalived配置
修改配置文件:
vi /etc/keepalived/keepalived.conf
#MASTER节点
global_defs {
}
vrrp_instance VI_1 {
state MASTER #指定A节点为主节点 备用节点上设置为 BACKUP 即可
interface eth0 #绑定虚拟IP的网络接口
virtual_router_id 51 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
priority 100 #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
advert_int 1 #组播信息发送间隔,两个节点设置必须一样
authentication { #设置验证信息,两个节点设置必须一样
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #指定虚拟IP,两个节点设置必须一样
192.168.116.120/32 #如果两个nignx的ip分别是192.168.116.128,.......129,则此处的虚拟ip跟他俩同一个网段即可
# 192.168.200.16
# 192.168.200.17
# 192.168.200.18
}
}
#BACKUP节点
global_defs {
}
vrrp_instance VI_1 {
state BACKUP #指定A节点为主节点 备用节点上设置为 BACKUP 即可
interface eth0 #绑定虚拟IP的网络接口
virtual_router_id 51 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
priority 99 #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
advert_int 1 #组播信息发送间隔,两个节点设置必须一样
authentication { #设置验证信息,两个节点设置必须一样
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #指定虚拟IP,两个节点设置必须一样
192.168.116.120/32 #如果两个nignx的ip分别是192.168.116.128,.......129,则此处的虚拟ip跟他俩同一个网段即可
# 192.168.200.16
# 192.168.200.17
# 192.168.200.18
}
}
#分别启动两台机器上的keepalived
service keepalived start
两个机器上分别查看 ip addr
主:由下图可见,主拿到了虚拟ip 192.168.116.120
从:由下图可见,从在eth0这个网卡上只有一个自己的ip
如果我们把主这台服务器的keepalived进程杀掉的话,会出现什么情况呢?
主:由下图可见,主这台服务器挂了,上面只有自己的ip,那我们去看从
从:由下图可见,从已经拿到 虚拟ip 192.168.116.120,主已经挂了,那请求都会落在从这台机器上。
我们再让主的keepalived进程恢复,看会发生什么情况?
主:又下图可见,主又重新接管虚拟ip了(VIP)
从:
总结:
经过前面的配置,如果master主服务器的keepalived停止服务,slave从服务器会自动接管VIP对外服务;一旦主服务器的keepalived恢复,会重新接管VIP。
但这并不是我们需要的,我们需要的是当NginX停止服务的时候能够自动切换。
原理:
keepalived支持配置监控脚本,我们可以通过脚本监控NginX的状态,如果状态不正常则进行一系列的操作,最终仍不能恢复NginX则杀掉keepalived,使得从服务器能够接管服务。
思路:
由于keepalived并不跟nginx耦合,他俩完全不是一家人,但是keepalived提供了一个机制:让用户自定义一个shell脚本去检测用户自己的程序,返回状态给keepalived就可以了
#MASTER节点
global_defs {
}
vrrp_script chk_health {
script "[[`ps -ef | grep nginx | grep -v grep | wc -l` -ge 2 ]] && exit 0 || exit1"
interval 1 #每隔1秒执行上述的脚本,去检查用户的程序ngnix
weight -2
}
vrrp_instance VI_1{
state MASTER
interface eth0
virtual_router_id 1
priority 100
advert_int 2
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_health
}
virtual_ipaddress {
192.168.116.120/32
# 192.168.200.16
# 192.168.200.17
# 192.168.200.18
}
notify_master"/usr/local/keepalived/sbin/notify.sh master"
notify_backup"/usr/local/keepalived/sbin/notify.sh backup"
notify_fault"/usr/local/keepalived/sbin/notify.sh fault"
}
#添加切换通知脚本
vi /usr/local/keepalived/sbin/notify.sh
#!/bin/bash
case "$1" in
master)
/usr/local/nginx/sbin/nginx
exit 0
;;
backup)
/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx
exit 0
;;
fault)
/usr/local/nginx/sbin/nginx -s stop
exit 0
;;
*)
echo 'Usage: notify.sh {master|backup|fault}'
exit 1
;;
esac
#添加执行权限
chmod +x/usr/local/keepalived/sbin/notify.sh
#BACKUP节点
global_defs {
}
vrrp_scriptchk_health {
script "[[ `ps -ef | grep nginx | grep-v grep | wc -l` -ge 2 ]] && exit 0 || exit 1"
interval 1
weight -2
}
vrrp_instance VI_1{
state BACKUP
interface eth0
virtual_router_id 1
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_health
}
virtual_ipaddress {
192.168.116.120/32
# 192.168.200.16
# 192.168.200.17
# 192.168.200.18
}
notify_master"/usr/local/keepalived/sbin/notify.sh master"
notify_backup "/usr/local/keepalived/sbin/notify.shbackup"
notify_fault"/usr/local/keepalived/sbin/notify.sh fault"
}
#在第二台机器上添加notify.sh脚本
#分别在两台机器上启动keepalived
service keepalived start
chkconfig keepalived on
即可