Nginx + keepalived 实现双机热备
Nginx + keepalived
keepalived 简介
Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat、corosync、pacemaker。但是它一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。
VRRP 协议
VRRP全称 Virtual Router Redundancy Protocol,即 虚拟路由冗余协议。可以认为它是实现路由器高可用的容错协议,即将N台提供相同功能的路由器组成一个路由器组(Router Group),这个组里面有一个master和多个backup,但在外界看来就像一台一样,构成虚拟路由器,拥有一个虚拟IP(vip,也就是路由器所在局域网内其他机器的默认路由)。
占有这个IP的master实际负责ARP相应和转发IP数据包,组中的其它路由器作为备份的角色处于待命状态。master会发组播消息,当backup在超时时间内收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,保证路由器的高可用。
Nginx + keepalived
服务器架构
主(master) VIP 备(backup)
192.168.1.17 192.168.1.181 192.168.1.19
-
安装 keepalived
主、备服务器上分别安装、启动 keepalived,并设置开机启动。
$ yum install -y keepalived
$ systemctl start keepalived
$ systemctl enable keepalived -
修改 keepalived 配置文件
主、备服务器分别修改配置文件,注意state要填写对应节点身份,interface要对应真实网卡,priority数值要能反映主备优先级,virtual_router_id 、authentication、virtual_ipaddress配置项要一致。
修改完以后记得重启服务
$ vim /etc/keepalived/keepalived.conf! Configuration File for keepalived vrrp_instance VI_1 { state MASTER #标识为主服务器(BACKUP) interface em1 #对应网卡 virtual_router_id 51 #id 号,主、备要一致 priority 100 #优先级,主要比备小;有多个备时,优先级高的接管 advert_int 1 authentication { auth_type PASS auth_pass 1111 #主、备一致 } virtual_ipaddress { 192.168.1.181 #定义vip } }
-
Nginx 主页
yum 安装 Nginx ,分别修改主、备服务器的 Nginx页面。
$ yum install nginx
$ vim /usr/share/nginx/html/index.html
修改以后主、备页面如下: -
VIP 偏移
主、备服务器均开启 keepalived,查看主网卡信息,发现 vip 在主服务器上:
em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 44:a8:42:2b:08:1f brd ff:ff:ff:ff:ff:ff
inet 192.168.1.17/24 brd 192.168.1.255 scope global noprefixroute em1
valid_lft forever preferred_lft forever
inet 192.168.1.181/32 scope global em1
valid_lft forever preferred_lft forever
inet6 fe80::46a8:42ff:fe2b:81f/64 scope link
打开nginx页面,结果如下:显示的内容是主服务器的网页信息。
关闭主服务器上的 keepalived,查看备服务器日志,发现,vip已经偏移。
Mar 28 10:36:38 compute7 Keepalived_vrrp[143499]: VRRP_Instance(VI_1) Transition to MASTER STATE
Mar 28 10:36:39 compute7 Keepalived_vrrp[143499]: VRRP_Instance(VI_1) Entering MASTER STATE
Mar 28 10:36:39 compute7 Keepalived_vrrp[143499]: VRRP_Instance(VI_1) setting protocol VIPs.
Mar 28 10:36:39 compute7 Keepalived_healthcheckers[143498]: Netlink reflector reports IP 192.168.1.181 added
Mar 28 10:36:39 compute7 Keepalived_vrrp[143499]: VRRP_Instance(VI_1) Sending gratuitous ARPs on em1 for 192.168.1.181
Mar 28 10:36:44 compute7 Keepalived_vrrp[143499]: VRRP_Instance(VI_1) Sending gratuitous ARPs on em1 for 192.168.1.181
查看备网卡信息:181已经偏移到备服务器
em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 18:66:da:f2:44:34 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.19/24 brd 192.168.1.255 scope global em1
valid_lft forever preferred_lft forever
inet 192.168.1.181/32 scope global em1
valid_lft forever preferred_lft forever
inet6 fe80::1a66:daff:fef2:4434/64 scope link
valid_lft forever preferred_lft forever
查看 Nginx 主页:发现显示的信息已经是备服务器 -
Nginx 检查脚本
该脚本检测 nginx 的运行状态,并在 nginx 进程不存在时尝试重启 nginx,如果重启失败则停止 keepalived,准备让其他机器接管。
#!/bin/bash
counter={counter}" = “0” ];then
/usr/sbin/nginx
sleep 2
counter={counter}" = “0” ];then
systemctl stop keepalived
fi
fi
修改主上 keepalived 配置文件,添加监控脚本。注意: interval 要比nginx监控脚本数值要大,不然会报错 exited due to signal 15。
查看 /var/log/messages 发现:
WARNING – default user ‘keepalived_script’ for script execution does not exist – please create
解决办法:在 chk_nginx 脚本下添加执行用户 user root 配置项。
! Configuration File for keepalivedvrrp_script chk_nginx { script "/etc/keepalived/check_nginx.sh" #脚本位置 interval 4 #脚本执行间隔(要大于检测脚本时间间隔) weight -2 #检测失败则优先级-2 fall 2 #检测两次失败才算失败 rise 1 #检测一次成功就成功 user root #脚本执行用户 } vrrp_instance VI_1 { state MASTER interface em1 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.181 } track_script { #实例中添加要执行的脚本 chk_nginx } }
日志文件位置 /var/log/messages
-
检测脚本是否成功
- 主服务器,关闭主 Nginx进程,看能否成功启动。
$ pkill nginx
打开页面发现成功调用健康检查脚本、启动了 Nginx,测试成功。
- 主服务器, Nginx重启失败,看 VIP 是否偏移。(为了测试方便,这里我们可以通过修改健康检查脚本里的参数,故意写错参数)
- 主服务器,关闭主 Nginx进程,看能否成功启动。