一、安装并启动keepalive

1.官网下载tar包,上传到服务器并解压

官网地址

wget https://www.keepalived.org/software/keepalived-2.2.2.tar.gz
tar -zxvf keepalived-xxx.tar.gz

2.进入keepalive目录,配置安装

./configure --prefix=/usr/local/keepalived --sysconf=/etc
make && make install

即安装成功

3.配置文件路径/etc/keepalive/keepalive.conf

二、配置keepalive

(MASTER 192.168.1.151)

global_defs{
	#路由id: 当前安装keepalived节点主机的标识符,全局唯一
	router_id keep_151
}
vrrp_instance VI_1{
	#表示状态是MASTER主机还是备用机BACKUP
	state MASTER
	#该实例绑定的网卡
	interface ens33
	#保证主备节点一致即可
	virtual_router_id 51
	#权重,master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选
	priority 100
	#主备之间同步检查时间间隔,默认1秒
	advert_int 2
	#认证权限密码,防止非法节点进入		
	authentication {
		auth_type PASS 
		auth_pass 1111
	}
	#虚拟出来的ip,可以有多个(vip)
	virtual_ipaddress {
		192.168.1.151
	}
}

(BACKUP 192.168.1.152)

global_defs{
	#路由id: 当前安装keepalived节点主机的标识符,全局唯一
	router_id keep_152
}
vrrp_instance VI_1{
	#表示状态是MASTER主机还是备用机BACKUP
	state BACKUP
	#该实例绑定的网卡
	interface ens33
	#保证主备节点一致即可
	virtual_router_id 51
	#权重,master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选
	priority 80
	#主备之间同步检查时间间隔,默认1秒
	advert_int 2
	#认证权限密码,防止非法节点进入		
	authentication {
		auth_type PASS 
		auth_pass 1111
	}
	#虚拟出来的ip,可以有多个(vip)
	virtual_ipaddress {
		192.168.1.151
	}
}

附:查看网卡

ip addr

keepalived主备启动后无法访问VIP keepalived主备状态查询_时间间隔

三、启动keepalive

进入sbin启动

./usr/local/keepalive/sbin/keepalive

四、注册keepalive为系统服务

  • 进入keepalive解压目录
cd /home/keepalived-xxxx/keepalived/etc
  • 分别拷贝init.d/keepalived 至 /etc/init.d
    sysconfig/keepalived 至 /etc/sysconfig/
cp init.d/keepalived /etc/init.d/
cp sysconfig/keepalive /etc/sysconfig/
  • 重启系统服务使之生效
systemctl daemon-reload
  • 启动keepalive
systemctl start keepalive.servie
  • 停止keepalive
systemctl stop keepalive.servie
  • 重启keepalive
systemctl restart keepalive.servie

五、keepalive配置nginx自动重启

(如果主keepalive节点没有挂而nginx挂了,此时虚拟ip还是跟主绑定,因此需要keepalive能够自动重启nginx,实在重启不了,切换备用节点)

cd /etc/keepalived/
  • 编写脚本
vim check_nginx_alive.sh
#!/bin/bash

A=`ps -C nginx --no-header |wc -l`
#判断nginx是否宕机,如果宕机了,尝试重启
if [$A -eq 0];then
	/usr/local/nginx/sbin/nginx
	#等待一小会再次检查nginx,如果没有启动成功,则停止keepalvie,使其启动备用机
	sleep 3
	if [$A -eq 0];then
		killall keepalived
	fi
fi
  • 配置keepalive定时监听脚本
vim keepalived.conf
global_defs {
	...
}
vrrp_script check_nginx_alive {
	script "/etc/keepalived/check_nginx_alive.sh"
	interval 2 # 每隔两秒运行上述脚本
	weight 10 #如果脚本运行成功,则升级权重+10
}

vrrp_instance VI_1 {
	...
	#脚本调用
	track_script {
		check_nginx_alive #追踪nginx脚本
	}
}

六、双主热备高可用

上述方案,备用机并没有被很好地利用,因此可以采用双主热备。

keepalived主备启动后无法访问VIP keepalived主备状态查询_时间间隔_02


(MASTER 192.168.1.151)

global_defs{
	#路由id: 当前安装keepalived节点主机的标识符,全局唯一
	router_id keep_151
}
vrrp_instance VI_1{
	#表示状态是MASTER主机还是备用机BACKUP
	state MASTER
	#该实例绑定的网卡
	interface ens33
	#保证主备节点一致即可
	virtual_router_id 51
	#权重,master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选
	priority 100
	#主备之间同步检查时间间隔,默认1秒
	advert_int 2
	#认证权限密码,防止非法节点进入		
	authentication {
		auth_type PASS 
		auth_pass 1111
	}
	#虚拟出来的ip,可以有多个(vip)
	virtual_ipaddress {
		192.168.1.151
	}
}

vrrp_instance VI_2{
	#表示状态是MASTER主机还是备用机BACKUP
	state BACKUP
	#该实例绑定的网卡
	interface ens33
	#保证主备节点一致即可
	virtual_router_id 52
	#权重,master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选
	priority 80
	#主备之间同步检查时间间隔,默认1秒
	advert_int 2
	#认证权限密码,防止非法节点进入		
	authentication {
		auth_type PASS 
		auth_pass 1111
	}
	#虚拟出来的ip,可以有多个(vip)
	virtual_ipaddress {
		192.168.1.152
	}
}

(BACKUP 192.168.1.152)

global_defs{
	#路由id: 当前安装keepalived节点主机的标识符,全局唯一
	router_id keep_152
}
vrrp_instance VI_1{
	#表示状态是MASTER主机还是备用机BACKUP
	state BACKUP
	#该实例绑定的网卡
	interface ens33
	#保证主备节点一致即可
	virtual_router_id 51
	#权重,master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选
	priority 80
	#主备之间同步检查时间间隔,默认1秒
	advert_int 2
	#认证权限密码,防止非法节点进入		
	authentication {
		auth_type PASS 
		auth_pass 1111
	}
	#虚拟出来的ip,可以有多个(vip)
	virtual_ipaddress {
		192.168.1.151
	}
}

vrrp_instance VI_2{
	#表示状态是MASTER主机还是备用机BACKUP
	state MASTER
	#该实例绑定的网卡
	interface ens33
	#保证主备节点一致即可
	virtual_router_id 52
	#权重,master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选
	priority 100
	#主备之间同步检查时间间隔,默认1秒
	advert_int 2
	#认证权限密码,防止非法节点进入		
	authentication {
		auth_type PASS 
		auth_pass 1111
	}
	#虚拟出来的ip,可以有多个(vip)
	virtual_ipaddress {
		192.168.1.152
	}
}