keepalived 高可用 nginx
之前我们用 keepalived 高可用了 lvs 的 dr 模型,是通过 keepalived 自带的添加 ipvs 规则的方式实现的高可用。下面我们来对 nginx 实现高可用,并且实现双主高可用。
删除之前配置的 vip,执行下面的脚本即可。
#!/bin/bash # vip="192.168.2.246" vip2="192.168.2.244" eth="lo" host="-host" case $1 in start) echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce ifconfig $eth:1 $vip/32 broadcast $vip up route add $host $vip dev $eth:1 ifconfig $eth:2 $vip2/32 broadcast $vip2 up route add $host $vip2 dev $eth:2 ;; stop) echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce ifconfig $eth:1 down ifconfig $eth:2 down ;; esac
高可用 nginx
在 node1 和 node2 上安装Nginx
# yum install nginx -y
接下来,配置nginx,让 nginx 能够反向代理至 node1 和 node4
upstream webservers { server 192.168.2.11:80 weight=1; server 192.168.2.14:80 weight=1; }
location / { proxy_pass http://webservers; }
node2同样的配置
我们要让keepalived能够探测nginx是否在线,可以手动写一个脚本来实现:
vrrp_script chk_nginx { script "killall -0 nginx" interval 1 weight -10 }
在vrrp_instance中进行检测:
vrrp_instance VI_1 {
track_script {
chk_nginx
}
}
Virtual server的内容可以都删掉,因为用不到 ipvs的规则
Note:node1和node2都要实现
这时候,浏览器中访问:http://192.1682.110; 能够实现负载均衡的效果;如果我们将node1上的nginx服务停止掉,浏览器访问依然能够实现负载均衡的效果。如果我们让node上nginx再启动服务,虚拟地址又流转到node上了。
如果我们要让虚拟地址在哪个节点上,哪个节点就运行nginx;没有虚拟地址的节点就停止nginx。
1、如果出现故障,即nginx没启动时,优先级都减去20:
初始优先级:
MASTER:100 BACKUP:99
MASTER启动nginx时,备节点不启动nginx
MASTER:100 BACKUP:99 --> 79
当MASTER节点出现故障:
MASTER: 100 -->80 BACKUP:79 //备节点因为优先级低于MASTER,所以虚拟地址抢不过来
如果出现故障时,优先级减去不同的值,让一个多减一点,一个少一点,总是会出现优先级的问题而虚拟地址抢不过来。
这时候,我们可以通过让主备节点都一直运行nginx,只要主节点在线就让它来服务,优先级高的不在了就让优先级低的来服务,优先级高的回来了就流转地址让优先级高的来服务。所以我们可以这么做:
在之前的 notify.sh 中加上:
#!/bin/bash # Author: # Description: An example of notify script # vip="192.168.2.18" contact="root@localhost" notify() { mailsubject="$(hostname) to be $1: $vip floating" mailbody="$(date +'%F %H:%M:%S'): vrrp transition,$(hostname) changed to be $1" echo $mailbody | mail -s "$mailsubject" $contact } case $1 in master) notify master service nginx restart //成为主节点,我们让nginx重启 exit 0 ;; backup) notify backup service nginx restart //成为备节点,我们也让nginx重启 exit 0 ;; fault) notify fault exit 0 ;; *) echo "Usage:$(basename $0) {master|backup|fault}" exit 1 ;; esac
这样,我们就能保证 nginx 一直在线。这种是单主模式的,我们要实现双主模式,让 nginx 都能同时接收请求,怎么实现呢?
接下来,我们实现双主模式的应用。
只需要在 keepalived 配置文件中各添加一个实例就可以了。
vrrp_instance VI_2 { state MASTER interface eth0 virtual_router_id 52 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1122 } virtual_ipaddress { 192.168.2.28/32 dev eth0 label eth0:2 } track_script { chk_nginx } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" }
vrrp_instance VI_2 { state BACKUP interface eth0 virtual_router_id 52 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1122 } virtual_ipaddress { 192.168.2.28/32 dev eth0 label eth0:2 } track_script { chk_nginx } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" }
还有要在notify.sh脚本中将重启nginx的命令去掉,我们实际应用中不应该使用脚本去控制 nginx 的开启,而是让其他监控软件来实现这个功能,比如 zabbix 等。
这样,我们就实现双主模式,主备节点上都配有 vip , 浏览器访问这两个 vip 时都能得到响应。主备下线一个,两个 vip 依然能够工作。手动启动下线的 nginx ,vip 又会流转到启动的节点。