Keepalived简介
Keepalived是一个基于vrrp来实现的服务器高可用解决方案,可以利用其实现避免IP单点故障,类似的工具还有heartbeat、corosync。不过其不会单独出现,而是搭配着 LVS、Nginx、HAproxy,一起协同工作达到高可用的目的。
具体来说,其作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,KeepAlived将会检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后KeepAlived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
VRRP协议
VRRP全称Vritual Router Redundancy Protocol,虚拟路由冗余协议。通过把几台提供路由功能的设备组成一个虚拟路由设备,使用一定的机制保证虚拟路由的高可用,从而达到保持业务的连续性与可靠性。
在配置组成的一个虚拟路由器中,有MASTER和BACKUP之分。MASTER是主节点,在一个虚拟路由器中,只能有一个MASTER,但可以有多个BACKUP,BACKUP是备用节点,也就是当master挂掉之后,BACKUP接管MASTER节点的所有资源,当有多个BACKUP节点时,根据其priority(优先级)的值的大小,来选举谁作为MASTER的替代者。当BACKUP节点的优先级值相同时,根据其IP地址的大小,来决定。
条件
- 节点之间的时间必须同步。
- 确保Firewalld及SELinux不会成为阻碍。
- 各节点用于集群服务的网络接口必须支持MULTICAST(多播)通信。采用D类地址(224-239)。多播地址建议手动定义,因为若有多个集群服务都使用默认的,虽有认证机制,但仍会互发信息,可能会影响性能,更会产生无用日志信息。
时间同步
Firewalld配置
1 | firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eth0 --destination 224.0.0.111 --protocol vrrp -j ACCEPT |
安装keepalived
1 | yum install gcc openssl-devel libnl-devel libnfnetlink-devel ipvsadm -y |
修改keepalived日志路径
1 | ln -sv /etc/sysconfig/keepalived /etc/sysconfig/ |
启动脚本
1 | cat << EOF > /etc/systemd/keepalived.service |
keepalived配置文件讲解
1 | # 全局配置 |
检测脚本1
2
3
4
5
6
7
8
9
10
11
12
13
14
15cat /etc/keepalived/ngx_status.sh
#只有当script的返回状态结果为任意非0数字时,才会执行降权操作。
#当script正常执行时,也就是返回值为0时,不做任何操作。
#脚本示例:可以在script中调用,直接引用脚本路径即可
#该脚本检测ngnix的运行状态,并在nginx进程不存在时尝试重新启动ngnix,如果启动失败则停止keepalived,准备让其它机器接管
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
/usr/local/bin/nginx
sleep 2
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
/etc/init.d/keepalived stop
fi
fi
notify邮件通知脚本1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26cat /etc/keepalived/notify.sh
contact='root@localhost'
notify() {
local mailsubject="$(hostname) to be $1, vip floating"
local mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
master)
notify master
;;
backup)
notify backup
;;
fault)
notify fault
;;
*)
echo "Usage: $(basename $0) {master|backup|fault}"
exit 1
;;
esac
启动服务
1 | systemctl enable keepalived |
单主备实例
架构图1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 +------+ +--------+
|Client| >>> |Internet|
+------+ +--------+
/\
+-----------------------+
| 公网VIP1:192.168.10.91|
+-----------------------+
/ \
+--------------------------+ +--------------------------+
| KA+Lvs/Nginx/HAProxy | | KA+Lvs/Nginx/HAProxy |
| VIP1:Master (eth1) |多播IP | VIP1:BACKUP (eth1) |
| IP1:192.168.10.101(eth1) | | IP1:192.168.10.102(eth1) |
+--------------------------+ +--------------------------+
\ /
+-----------------------+
| 公网VIP1:192.168.10.91 |
+-----------------------+
\/
+------+
| Web |
+------+
环境
MASTER: 192.168.10.101
BACKUP: 192.168.10.102
VIP: 192.168.10.91
OS: CentOS 7.4
Master配置文件1
vim /etc/keepalived/keepalived.conf
1 | global_defs { |
Backup配置文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27global_defs {
notification_email {
root@localhost
}
notification_email_from ka@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id ka102
vrrp_mcast_group4 224.0.0.111
}
vrrp_instance VG_1 {
state BACKUP
interface eth1
virtual_router_id 100
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass sunday
}
virtual_ipaddress {
192.168.10.91
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
notify.sh 邮件通知脚本1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
contact='root@localhost'
notify() {
local mailsubject="$(hostname) to be $1, vip floating"
local mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
master)
notify master
;;
backup)
notify backup
;;
fault)
notify fault
;;
*)
echo "Usage: $(basename $0) {master|backup|fault}"
exit 1
;;
esac
主备测试
未启动keepalived 网卡信息1
2
3[root@ka101 ~]# ip a | grep eth1
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 192.168.10.101/24 brd 192.168.10.255 scope global eth1
启动keepalived1
2[root@ka101 ~]
[root@ka102 ~]
启动keepalived后 网卡信息1
2
3
4[root@ka101 ~]# ip a | grep eth1
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 192.168.10.101/24 brd 192.168.10.255 scope global eth1
inet 192.168.10.91/32 scope global eth1
已成功添加VIP 192.168.10.91
停止Master keepalived1
[root@ka101 ~]
此时VIP已漂移到Backup主机1
2
3
4[root@ka102 ~]# ip a | grep eth1
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 192.168.10.102/24 brd 192.168.10.255 scope global eth1
inet 192.168.10.91/32 scope global eth1
查看日志1
2
3
4
5
6[root@ka102 ~]# cat /var/log/messages
ug 9 18:18:27 ka102 Keepalived_vrrp[3535]: VRRP_Instance(VG_1) Sending/queueing gratuitous ARPs on eth1 for 192.168.10.91
Aug 9 18:18:27 ka102 Keepalived_vrrp[3535]: Sending gratuitous ARP on eth1 for 192.168.10.91
Aug 9 18:18:27 ka102 Keepalived_vrrp[3535]: Sending gratuitous ARP on eth1 for 192.168.10.91
Aug 9 18:18:27 ka102 Keepalived_vrrp[3535]: Sending gratuitous ARP on eth1 for 192.168.10.91
Aug 9 18:18:27 ka102 Keepalived_vrrp[3535]: Sending gratuitous ARP on eth1 for 192.168.10.91
恢复Master1
2
3
4
5[root@ka102 ~]# systemctl start keepalived
[root@ka101 ~]# ip a | grep eth1
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 192.168.10.101/24 brd 192.168.10.255 scope global eth1
inet 192.168.10.91/32 scope global eth1
以上状态表明,当MASTER恢复服务后,BACKUP的Keepalived会自动漂移到MASTER上。因为MASTER的权重值比BACKUP高。以上是BACKUP的漂移到MASTER的状态。
https://renwole.com/archives/1107