1. 安装keepalived

yum -y install keepalived yum源直接安装

systemctl enable keepalived 设置keepalived开机自启动

2. 设置时间同步,确保各节点时间一致

dnf -y install chrony 安装服务,已安装忽略

systemctl enable chronyd 开机自启动服务

备节点:

vim /etc/chrony.conf

将第一行替换为:

server 192.168.0.220 iburst 192.168.0.220 为主节点ip

主节点:

vim /etc/chrony.conf

添加

server 192.168.0.220 iburst 设置服务器

allow 192.168.0.0/16 设置允许同步网段

local stratum 10 即使自己未能通过网络时间服务器同步到时间,也允许将本地时间作为标准时间授时给其它客户端

分别重启服务,完成时间同步。

3. 关闭防火墙或添加规则,关闭selinxu。

4. 安装killall。dnf -y install psmisc

5. 配置keepalived 配置文件

vim /etc/keepalived/keepalived.conf
global_defs {
router_id node1 #主机名,主备保持区别
#vrrp_mcast_group4 224.0.0.18 #设置组播地址,默认224.0.0.18
}
vrrp_script nginx_check { #定义脚本
script "killall -0 nginx " #脚本内容,可写脚本位置
interval 1 #1秒钟执行一次
weight -10 #若执行失败,减权,影响当前优先级
rise 2 #正确两次
fall 2 #失败两次,开始减权
}
vrrp_instance VI_1 {

state MASTER #设置主备,备为BACKUP

# preempt #抢占模式,nopreempt非抢占模式,默认为抢占。

# preempt_delay 300 #抢占模式,节点上线后触发新选举操作的延时
interface ens32 #设置虚拟路由器使用的网卡
virtual_router_id 51 #虚拟路由器id,主备需保持一直
priority 100 #优先级,值越大优先级越高。主高备低
advert_int 1 #vrrp通告时间间隔,默认1s
#track_ineterface{
# ens32
# }
track_script {
nginx_check #执行前边定义的脚本
}

notify_master "/etc/keepalived/start_nginx.sh" #设置当前节点成为主节点执行的脚本,一般为启动服务,也可加入邮件提醒等。

notify_backup "/etc/keepalived/start_nginx.sh"
authentication {
auth_type PASS #简单密码认证
auth_pass 1111 #随机字符串,不超过8位,主备节点一致即可
}
virtual_ipaddress {
192.168.0.239 #vip设置
}
}

主:

global_defs {
router_id node1
}
vrrp_script nginx_check {
script "killall -0 nginx"
interval 1
weight -10
rise 2
fall 2
}
vrrp_instance VI_1 {
state MASTER
interface ens32
virtual_router_id 51
priority 100
advert_int 1
track_interface {
ens32
}
notify_master "/etc/keepalived/start_nginx.sh"
notify_backup "/etc/keepalived/start_nginx.sh"
track_script {
nginx_check
}
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.239/24
}
}

备:

global_defs {
router_id node2
}
vrrp_script nginx_check {
script "killall -0 nginx"
interval 1
weight -10
rise 2
fall 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens32
virtual_router_id 51
priority 96
advert_int 1
track_interface {
ens32
}
notify_master "/etc/keepalived/start_nginx.sh"
notify_backup "/etc/keepalived/start_nginx.sh"
track_script {
nginx_check
}
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.239
}
}
start_nginx.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx

6. 测试:

主节点为220,备节点为221。优先级分别为100,96.nginx服务掉会减去10.抢占模式。

keepalived切换脚本改变 keepalived切换时间_vim

keepalived切换脚本改变 keepalived切换时间_vim_02

此时两台节点均无任何服务,

直接启动主节点keepalived

keepalived切换脚本改变 keepalived切换时间_keepalived切换脚本改变_03

keepalived切换脚本改变 keepalived切换时间_vim_04

keepalived切换脚本改变 keepalived切换时间_优先级_05

 

此时keepalived启动,执行脚本,启动nginx,成为主节点,并向组播地址通告优先级等。

备机启动keepalived

keepalived切换脚本改变 keepalived切换时间_优先级_06

keepalived切换脚本改变 keepalived切换时间_vim_07

keepalived切换脚本改变 keepalived切换时间_优先级_08

备节点nginx,keepalived都已启动,并成为备节点。

此时讲主节点nginx停掉

keepalived切换脚本改变 keepalived切换时间_优先级_09

日志显示,主节点执行脚本失败返回值为1,优先级变为90,此时收到通报,221优先级为96,节点变为BACKUP,REMOVING VIPS。

keepalived切换脚本改变 keepalived切换时间_优先级_10

抓包可看到组播地址中优先级的变化。

keepalived切换脚本改变 keepalived切换时间_优先级_11

备节点日志:

keepalived切换脚本改变 keepalived切换时间_vim_12

主节点变为备节点自动执行脚本启动nginx,监测脚本执行成功,优先级变为100,抢占回主节点,变为MASTER.:

keepalived切换脚本改变 keepalived切换时间_nginx_13

7. 隐患

检测脚本检测到nginx进程便不会转移vip,但nginx有多个进程,意味着若某一个或若干个进程挂掉,并保留最少一个进程,检测脚本便检测不出,无法自动转移vip。

心跳脑裂问题。可根据具体情况,写入脚本,周期自身 ping 网关,若不同,则干掉自身keepalived。或在BACKUP节点监测,若备节点变为主节点时,ping 网关,若不通则干掉自己,通,则认定自己没有问题。