网站架构图:
这里只需要两台服务器就行了,实现Keepalived的功能即可。
首先确定自己的Nginx服务两台服务器上都已经配置好了
配置Keepalived
yum install keepalived -y
mv keepalived.conf keepalived.conf.bak
//vim keepalived.conf
!Configuration File for keepalived
global_defs {
router_id node1 //这里是标明不同的节点服务器,需要改
}
vrrp_script chk_nginx { //声明Nginx检查脚本的位置及其执行间隔时间
script "/data/sh/check_nginx.sh"
interval 2
weight 2
}
#VIP
vrrp_instance VI_1 {
state MASTER //这里是标明该服务器的地位,主还是从,需要改
interface ens33 //定义VIP绑定的真实网卡
virtual_router_id 60 //此router_id不同于上面那个,这个一定要一样,不然会造成脑裂
priority 100 //注意上面两个标注可以改,可以不改,只是一个标记而已,未标注的不要改,当前这个参数必须改,而且主>从
advert_int 5 //健康检查的时间间隔
nopreempt //不抢占
authentication { //Keepalived高可用对之间需要做认证
auth_type PASS //认证类型
auth_pass 1111 //认证密码
}
virtual_ipaddress { //定义VIP
192.168.1.1
}
track_script { //调用上面定义的chk_Nginx函数
chk_nginx
}
}
从服务器:
!Configuration File for keepalived
global_defs {
router_id node2
}
vrrp_script chk_nginx {
script "/data/sh/check_nginx.sh"
interval 2
weight 2
fall 3
rise 2
}
#VIP
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 60
priority 99
advert_int 5
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.1
}
track_script {
chk_nginx
}
}
(1)mkdir -pv /data/sh/
(2)vim /data/sh/check_nginx.sh //脚本如下
(3)chmod +x /data/sh/check_nginx.sh
//自己写的:
#!/bin/bash
#auto check nginx state
NUM=`ps -ef|grep nginx|egrep -vc "grep|chk"` //检查当前Nginx进程的个数
ip addr list|grep 192.168.1.1 //查看VIP是否在当前服务器
if [[ $? -eq 0 ]];then
if [[ $NUM -eq 0 ]];then
systemctl stop keepalived
fi
fi
//改进版:
#!/bin/bash
#auto check nginx state
killall -0 nginx //killall给指定进程发送0信号,如果返回值为0,则说明该进程存在,否则不存在
if [[ $? -ne 0 ]];then
systemctl stop keepalived
fi
//终极版:
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
exit 1 //退出状态为1,说明执行脚本失败,fall++
fi
exit 0 //退出状态为0,说明脚本执行成功,rise++
此终极版才是最为正确的!
//切记不可用systemctl stop keepalived,如果真的停下来了,如果本地nginx服务好了,你还要启动keepalived服务,这样不符合高可用的初衷。
注意:无论是脚本还是Keepalived配置文件两个服务器都需要配置。
启动时需要查看keepalived日志文件,/var/log/messages
WARNING - default user 'keepalived_script' for script execution does not exist - please create.
我们需要创建user:keepalived_script
useradd -s /sbin/nologin -M keepalived_script
SECURITY VIOLATION - scripts are being executed but script_security not enabled.
这个报错不影响!正常!
Keepalived_vrrp[32284]: /data/sh/check_nginx.sh due to signal 15
错误解决: check_nginx.sh脚本中的sleep时间必须比配置文件中的interval时间少
/data/sh/check_nginx.sh exited with status 1
一直报这个错误,nginx停了,VIP也不漂移,也不显示脚本执行成功字样。
错误解决:先看脚本中的退出状态码的位置是否设置适当,再看看自己的priority是否设置适当,具体方法请见配置要点透析
#全局定义块
global_defs {
notification_email { #指定keepalived在发生切换时需要发送email到的对象,一行一个;
wgkgood@gmail.com
}
notification_email_from root@localhost #指定发件人
smtp_server mail.jfedu.net #指定smtp服务器地址
smtp_connect_timeout 3 #指定smtp连接超时时间
router_id LVS_DEVEL #运行keepalived机器的标识
}
#监控Nginx进程
vrrp_script chk_nginx {
script "/data/script/nginx.sh" #监控服务脚本,脚本x执行权限;
interval 2 #检测时间间隔(执行脚本间隔)
weight 2
}
#VRRP实例定义块
vrrp_sync_group VG_1{ #监控多个网段的实例
group {
VI_1 #实例名
VI_2
}
notify_master /data/sh/nginx.sh #指定当切换到master时,执行的脚本
notify_backup /data/sh/nginx.sh #指定当切换到backup时,执行的脚本
notify /data/sh/nginx.sh #发生任何切换,均执行的脚本
smtp_alert #使用global_defs中提供的邮件地址和smtp服务器发送邮件通知;
}
vrrp_instance VI_1 {
state BACKUP #设置主机状态,MASTER|BACKUP
nopreempt #设置为不抢占
interface eth0 #对外提供服务的网络接口
lvs_sync_daemon_inteface eth0 #负载均衡器之间监控接口;
track_interface { #设置额外的监控,网卡出现问题都会切换;
eth0
eth1
}
mcast_src_ip #发送多播包的地址,如果不设置默认使用绑定网卡的primary ip
garp_master_delay #在切换到master状态后,延迟进行gratuitous ARP请求
virtual_router_id 50 #VRID标记 ,路由ID,可通过#tcpdump vrrp查看
priority 90 #优先级,高优先级竞选为master
advert_int 5 #健康检查间隔,默认5秒
preempt_delay #抢占延时,默认5分钟
debug #debug日志级别
authentication { #设置认证
auth_type PASS #认证方式
auth_pass 1111 #认证密码
}
track_script { #以脚本为监控chk_nginx;
chk_nginx
}
virtual_ipaddress { #设置vip
192.168.111.188
}
}
注意:使用了脚本监控Nginx或者MYSQL,不需要如下虚拟服务器设置块。
#虚拟服务器定义块
virtual_server 192.168.111.188 3306 {
delay_loop 6 #健康检查时间间隔
lb_algo rr #调度算法rr|wrr|lc|wlc|lblc|sh|dh
lb_kind DR #负载均衡转发规则NAT|DR|TUN
persistence_timeout 5 #会话保持时间
protocol TCP #使用的协议
real_server 192.168.1.12 3306 {
weight 1 #默认为1,0为失效
notify_up <string> | <quoted-string> #在检测到server up后执行脚本;
notify_down <string> | <quoted-string> #在检测到server down后执行脚本;
TCP_CHECK {
connect_timeout 3 #连接超时时间;
nb_get_retry 1 #重连次数;
delay_before_retry 1 #重连间隔时间;
connect_port 3306 #健康检查的端口;
}
HTTP_GET {
url {
path /index.html #检测url,可写多个
digest 24326582a86bee478bac72d5af25089e #检测效验码
#digest效验码获取方法:genhash -s IP -p 80 -u http://IP/index.html
status_code 200 #检测返回http状态码
}
}
}
}
主要对keepalived中的VIP漂移作出解释。
实现VIP漂移主要是依靠的vrrp协议。但是具体实现是由配置文件哪几个参数决定的呢?
还有一个最重要参数:
这五个参数不能随便配置。否则可能会造成VIP无法漂移!
interval 2 #间隔两秒执行一次定义的脚本
weight 2 #如果失败,本地priority优先级会降低2,后续再继续失败,不再降低!如果执行成功,本地priority优先级上升2,后续再持续成功,不再上升。
fall 3 #连续三次失败,认为此服务器已废,VIP漂移
rise 2 #至少连续成功两次,认为此服务器可用,VIP可以在此服务器。
停下主nginx,fall三次,VIP漂移:
启动主nginx,成功两次,如果配置了nopreempt,就不会VIP漂移,我没配,表示默认开启抢占,所以会漂移:
成功只显示一次,其实成功了两次。
接下来配置参数的要点:
priority(优先级),master角色必须比slave角色优先级高,且master下降weight之后必须比slave角色优先级低,不然slave不能成为新master角色,也就无法接管VIP等资源。