一、实验前准备
时间同步、关闭iptables+selinux、各主机能相互解析
在192.168.0.101和192.168.0.102上安装Keepalived和Nginx,通过Nginx负载均衡至192.168.0.103及192.168.0.104上,node3和node4上分别用httpd提供网页node3及node4
该实验实现的是主从模式
双机高可用方法目前分为两种:
1、双机主从模式:即前端使用两台服务器,一台主服务器和一台热备服务器,正常情况下,主服务器绑定一个公网虚拟IP,提供负载均衡服务,热备服务器处于空闲状态;当主服务器发生故障时,热备服务器接管主服务器的公网虚拟IP,提供负载均衡服务;但是热备服务器在主机器不出现故障的时候,永远处于浪费状态,对于服务器不多的网站,该方案不经济实惠。
2、双机主主模式:即前端使用两台负载均衡服务器,互为主备,且都处于活动状态(使用DNS达到两个外网IP地址的轮询),同时各自绑定一个公网虚拟IP,提供负载均衡服务;当其中一台发生故障时,另一台接管发生故障服务器的公网虚拟IP(这时由非故障机器一台负担所有的请求)。这种方案,经济实惠,非常适合于当前架构环境。
二、安装及配置Keepalived及Nginx
1、配置192.168.0.101上的keepalived,192.168.0.102类似(需调整state为BACKUP,priority为90)
global_defs { notification_email { } notification_email_from root smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_10 } vrrp_script chk_nginx { //chk_nginx后面有空格,实验中没加空格不能导致检测nginx脚本失败 script "killall -0 nginx &>/dev/null" //检测脚本 interval 1 //脚本执行间隔 1s weight -20 //如果脚本检查结果为非0,则priority -20 fall 2 //失败需连续检测2次 rise 1 //成功只需1次,成功不修改优先级 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.0.250/24 dev eth0 label eth0:1 } track_script { //执行监控的服务 chk_nginx //引用VRRP脚本 } }
2、配置nginx
192.168.0.101及102 nginx简单配置了下负载均衡如下
upstream lb { server 192.168.0.103; server 192.168.0.104; } server { listen 80; server_name 192.168.0.250; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { proxy_pass http://lb/; root /usr/share/nginx/html; index index.html index.htm; }3、主备配置差别主要为(建议这么配置):
- 主机:(state MASTER;priority 100)
- 备机:(state BACKUP;priority 99)
- 非抢占:nopreempt
或者:
- 主机:(state BACKUP;priority 100)
- 备机:(state BACKUP;priority 100)
- 默认抢占
4、nginx的检查脚本
最简单的做法是监控NginX进程,更靠谱的做法是检查NginX端口,最靠谱的做法是检查多个url能否获取到页面。
注意:这里要提示一下keepalived.conf中vrrp_script配置区的script一般有2种写法:
1)通过脚本执行的返回结果,改变优先级,keepalived继续发送通告消息,backup比较优先级再决定。这是直接监控Nginx进程的方式。
2)脚本里面检测到异常,直接关闭keepalived进程,backup机器接收不到advertisement会抢占IP。这是检查NginX端口的方式。
第一种方式如上述实验中的"killall -0 nginx"
Killall -0
做进程自检:
如果进程还在使用,通过echo $? 可得返回为0;
如果进程已经死了,返回为1,并伴有error信息。
通过脚本判断,有异常时exit 1,正常退出exit 0,然后keepalived根据动态调整的 vrrp_instance 优先级选举决定是否抢占VIP:
如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加
如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少
其他情况,原本配置的优先级不变,即配置文件中priority对应的值。
第二方式检测nginx后停止keepalived
#!/bin/bash counter=$(ps -C nginx --no-heading|wc -l) if [ "${counter}" = "0" ]; then /usr/local/nginx/sbin/nginx sleep 2 counter=$(ps -C nginx --no-heading|wc -l) if [ "${counter}" = "0" ]; then /etc/init.d/keepalived stop fi fi
三、Keepalive的通知机制
1、实例状态通知
1) notify_master :节点变为master时执行
2) notify_backup : 节点变为backup时执行
3) notify_fault : 节点变为故障时执行
2、虚拟服务器检测通知
1) notify_up : 虚拟服务器up时执行
2) notify_down : 虚拟服务器down时执行
notify_master "/etc/keepalived/notify.sh master
#!/bin/bash # description: An example of notify script vip=192.168.1.205 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 /etc/rc.d/init.d/nginx start exit 0 ;; backup) notify backup /etc/rc.d/init.d/nginx stop exit 0 ;; fault) notify fault /etc/rc.d/init.d/nginx stop exit 0 ;; *) echo 'Usage: `basename $0` {master|backup|fault}' exit 1 ;; esac