下载Keepalive
官网地址:https://www.keepalived.org/download.html
只有linux版本,windows和macOS就不要挣扎了,我之前强行在macOS上搞了一下午,最终还是失败了。我菜。
选择自己需要的版本进行下载
$ wget -c https://www.keepalived.org/software/keepalived-2.2.4.tar.gz
需要编译,所以就地解压
$ tar zxvf keepalived-2.2.4.tar.gz
cd keepalived-2.2.4
安装依赖包/Deepin/Debian/Ubuntu相同
apt-get install pkg-config curl gcc autoconf automake libssl-dev libnl-3-dev \
libnl-genl-3-dev libsnmp-dev libnl-route-3-dev libnfnetlink-dev libipset-dev \
iptables-dev libsnmp-dev
编译与安装keepalive
进入解压目录,找到configure
./configure --prefix=/usr/local/keepalived
–prefix=/usr/local/keepalived 这里是指定安装目录,可以省略
安装后看是否报错,报错可根据错误提示进行依赖安装等。
make && make install
这里建议分开执行,因为多数make install 需要超管权限,
sudo make install
这里基本的编译安装完毕
$ ls /usr/local/keepalived/
bin/ etc/ sbin/ share/
配置keepalive
cat /etc/keepalived/keepalived.conf
机器一:
global_defs {
router_id bird01 #标识信息
}
vrrp_instance VI_1 {
state MASTER
priority 150 #优先级
interface eth0 #绑定的网卡
virtual_router_id 50 #同一个虚拟的路由
advert_int 1 #心跳的间隔时间
authentication {
auth_type PASS #两个主机之间的密语
auth_pass 1234 #心跳密码
}
virtual_ipaddress {
10.110.10.3 #虚拟IP地址(可以绑定多个虚拟IP地址)
}
}
机器二:
global_defs {
router_id bird02
}
vrrp_instance VI_1 {
state BACKUP
priority 100
interface eth0
virtual_router_id 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
10.110.10.3 #虚拟IP地址
}
}
这里设置的是一主一备,两个的优先级主是150,备是100,虚拟VIP为10.110.10.3
启动keepalive
$ systemctl start keepalive
设置启动脚本
ln -s /etc/init.d/keepalived.init /etc/rc2.d/S99keepalived
测试keepalive地址漂移
$ ip a
查看有没有我们设置的虚拟IP,然后可以使用抓包工具查看protocol中会显示VRRP
keepalive高可用抢占式和非抢占式
(1)默认配置为抢占式:
master挂掉,backup上台,master重新启动则讲IP抢占过去。
(2)非抢占式配置:
两台均为backup,在优先级上做区分,如master挂掉,backup上台,则backup变成master,master变为backup。
a.两个节点的state均为backup(官方建议)
b.两个节点都在vrrp_instance中添加nopreempt
c.其中一个节点的优先级要高于另外一个节点
两台服务器角色都启用了nopreempt后,必须修改角色状态统一为backup,唯一的区别就是优先级不同。
主:
vrrp_instance VI_1 {
state BACKUP
priority 150
nopreempt
}
备:
vrrp_instance VI_1 {
state BACKUP
priority 100
nopreempt
}
keepalive脑裂
主要出现脑裂的场景是:两台机器都存活,但是无法检测到对方的心跳信息,各自都认为对方已经宕机。
配合nginx使用的时候,需要编写脚本检测nginx的状态是否正确,如果不正常进行重拉或者其他策略
www$ cat /server/scripts/check_nginx.sh
#!/bin/sh
nginxpid=$(ps -C nginx --no-header|wc -l)
#1.判断Nginx是否存活,如果不存活则尝试启动Nginx
if [ $nginxpid -eq 0 ];then
systemctl start nginx
sleep 3
#2.等待3秒后再次获取一次Nginx状态
nginxpid=$(ps -C nginx --no-header|wc -l)
#3.再次进行判断, 如Nginx还不存活则停止Keepalived,让地址进行漂移,并退出脚本
if [ $nginxpid -eq 0 ];then
systemctl stop keepalived
fi
fi
[root@bird01 ~]# chmod +x /server/scripts/check_nginx.sh
keepalive配置文件:
$ cat /etc/keepalived/keepalived.conf
global_defs {
router_id bird01
}
#定义脚本所在的位置,以及执行时间
vrrp_script check_nginx {
script "/server/scripts/check_nginx.sh"
interval 5
}
vrrp_instance VI_1 {
state BACKUP
priority 150
nopreempt
interface eth0
virtual_router_id 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
10.110.10.3
}
#调用脚本
track_script {
check_nginx
}
}