Keepalived简介

Keepalived 字如其名,保持存活,即高可用,经常用来防止单点故障。以前接触过一些人对高可用和负载均衡概念出现混淆,在此简单说明下:

  • 高可用:重点关注持续可用,只需要满足slave节点在master节点故障时自动接管master服务即可
  • 负载均衡:重点在于分摊请求至后端多个节点,避免后端请求不均

Keepalived是以VRRP(Virtual Router Redundancy Protocol虚拟路由冗余协议)协议实现基础的,这个协议以前博主在大学时学习网络课程时接触过,简单讲就是用多台路由器组成一个路由器组,这个路由器组中有个master和多个backup,其中master上有vip,局域网内其他机器的默认路由为该vip。期间master会发组播,如果backup收不到vrrp包则认为master宕机,此时根据vrrp优先级从backup中选举master,vip便会漂移到新master上提供路由网关服务。

VRRP主要包含以下几个概念:

  • 虚拟路由器VR(Virtual Router)
  • 虚拟路由器标志VRID(0-255)虚拟路由组器唯一标志,同虚拟路由组则为一致,不同组内则需要不同
  • VIP(Virtual IP)
  • 物理路由器
    • master
    • backup
    • priority:(0-255)优先级越高则为主,可以通过其他字段声明初始时谁为主或备
  • 心跳通告:以组播的形式进行心跳,默认VRRP组播地址224.0.0.18

Keepalived配置文件样例

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
! Configuration File for keepalived
# 全局配置块,邮件,route_id,vrrp配置,多播地址等
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id hk01

# 默认VRRP组播地址为224.0.0.18,可自定义
vrrp_mcast_group4 224.0.0.18
}

# 定义检测脚本配置块
vrrp_script check_web {
script "/server/scripts/check_web.sh"
interval 2
weight 2
}

# 虚拟路由组配置块,多个虚拟路由组则可以定义多个块
# 定义角色,网卡,优先级,认证,vip等
vrrp_instance VI_1 {
state MASTER
interface eth0

# 虚拟路由器的标识,同一虚拟路由器组中的ID要相同
virtual_router_id 51
priority 100
advert_int 1
authentication
auth_type PASS
auth_pass 1111
}
# 配置VIP
virtual_ipaddress {
192.168.11.99/24 dev eth0 label eth0:1
}
# 配置检测脚本
track_script {
check_web
}
}

Keepalived部署

keepalived 主备模式

主节点部署配置

1.安装软件包

1
2
[root@hk01 ~]# yum install nginx -y
[root@hk01 ~]# yum install keepalived -y

2.配置文件

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
27
28
[root@hk01 ~]# cat >/etc/keepalived/keepalived.conf<<'EOF'
! Configuration File for keepalived
global_defs {
router_id hk01
}
vrrp_script check_web {
script "/server/scripts/check_web.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.174.201/24 dev eth0 label eth0:1
}
track_script {
check_web
}
}
EOF

3.检测脚本

1
2
3
4
5
6
7
8
9
[root@hk01 ~]# mkdir -p /server/scripts
[root@hk01 ~]# cat /server/scripts/check_web.sh
#/bin/bash
cnt=`ps -ef grep -c '[n]ginx'`

if [ $cnt -eq 0 ];then
systemctl stop keepalived
fi
[root@hk01 ~]# chmod + x /server/scripts/check_web.sh

4.启动服务并测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@hk01 ~]# sysetmctl start nginx
[root@hk01 ~]# systemctl start keepalived

# 可以看到vip在master节点上
[root@hk01 ~]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:24:49:ed brd ff:ff:ff:ff:ff:ff
inet 192.168.174.137/24 brd 192.168.174.255 scope global noprefixroute dynamic eth0
valid_lft 5523859sec preferred_lft 5523859sec
inet 192.168.174.201/24 scope global secondary eth0:1
valid_lft forever preferred_lft forever
inet6 fe80::8074:c1a5:fa67:cfaa/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::c5f2:37c:a210:ea88/64 scope link noprefixroute
valid_lft forever preferred_lft forever

[root@hk01 ~]# echo node-hk01 >/usr/share/nginx/html/index.html
# 此时访问服务为master在提供
[root@hk01 ~]# curl 192.168.174.201
node-hk01

5.查看master节点此时日志

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
27
28
29
30
31
32
33
34
35
36
37
38
# 注意此时备机还未开始安装
[root@hk01 ~]# less /var/log/messages

....
May 12 23:46:51 localhost systemd: Starting LVS and VRRP High Availability Monitor...
May 12 23:46:51 localhost Keepalived[18849]: Starting Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
May 12 23:46:51 localhost Keepalived[18849]: Opening file '/etc/keepalived/keepalived.conf'.
May 12 23:46:51 localhost Keepalived[18850]: Starting Healthcheck child process, pid=18851
May 12 23:46:51 localhost systemd: Started LVS and VRRP High Availability Monitor.
May 12 23:46:51 localhost Keepalived[18850]: Starting VRRP child process, pid=18852
May 12 23:46:51 localhost Keepalived_healthcheckers[18851]: Opening file '/etc/keepalived/keepalived.conf'.
May 12 23:46:51 localhost Keepalived_vrrp[18852]: Registering Kernel netlink reflector
May 12 23:46:51 localhost Keepalived_vrrp[18852]: Registering Kernel netlink command channel
May 12 23:46:51 localhost Keepalived_vrrp[18852]: Registering gratuitous ARP shared channel
May 12 23:46:51 localhost Keepalived_vrrp[18852]: Opening file '/etc/keepalived/keepalived.conf'.
May 12 23:46:51 localhost Keepalived_vrrp[18852]: WARNING - default user 'keepalived_script' for script execution does not exist - please create.
May 12 23:46:51 localhost Keepalived_vrrp[18852]: SECURITY VIOLATION - scripts are being executed but script_security not enabled.
May 12 23:46:51 localhost Keepalived_vrrp[18852]: VRRP_Instance(VI_1) removing protocol VIPs.
May 12 23:46:51 localhost Keepalived_vrrp[18852]: Using LinkWatch kernel netlink reflector...
May 12 23:46:51 localhost Keepalived_vrrp[18852]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]
May 12 23:46:51 localhost Keepalived_vrrp[18852]: VRRP_Script(check_web) succeeded
May 12 23:46:52 localhost Keepalived_vrrp[18852]: VRRP_Instance(VI_1) Transition to MASTER STATE
May 12 23:46:52 localhost Keepalived_vrrp[18852]: VRRP_Instance(VI_1) Changing effective priority from 100 to 102
May 12 23:46:53 localhost Keepalived_vrrp[18852]: VRRP_Instance(VI_1) Entering MASTER STATE
May 12 23:46:53 localhost Keepalived_vrrp[18852]: VRRP_Instance(VI_1) setting protocol VIPs.
May 12 23:46:53 localhost Keepalived_vrrp[18852]: Sending gratuitous ARP on eth0 for 192.168.174.201
May 12 23:46:53 localhost Keepalived_vrrp[18852]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eth0 for 192.168.174.201
May 12 23:46:53 localhost Keepalived_vrrp[18852]: Sending gratuitous ARP on eth0 for 192.168.174.201
May 12 23:46:53 localhost Keepalived_vrrp[18852]: Sending gratuitous ARP on eth0 for 192.168.174.201
May 12 23:46:53 localhost Keepalived_vrrp[18852]: Sending gratuitous ARP on eth0 for 192.168.174.201
May 12 23:46:53 localhost Keepalived_vrrp[18852]: Sending gratuitous ARP on eth0 for 192.168.174.201
May 12 23:46:58 localhost Keepalived_vrrp[18852]: Sending gratuitous ARP on eth0 for 192.168.174.201
May 12 23:46:58 localhost Keepalived_vrrp[18852]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eth0 for 192.168.174.201
May 12 23:46:58 localhost Keepalived_vrrp[18852]: Sending gratuitous ARP on eth0 for 192.168.174.201
May 12 23:46:58 localhost Keepalived_vrrp[18852]: Sending gratuitous ARP on eth0 for 192.168.174.201
May 12 23:46:58 localhost Keepalived_vrrp[18852]: Sending gratuitous ARP on eth0 for 192.168.174.201
May 12 23:46:58 localhost Keepalived_vrrp[18852]: Sending gratuitous ARP on eth0 for 192.168.174.201
....

备节点部署

1.安装软件包

1
2
[root@hk02 ~]# yum install nginx -y
[root@hk02 ~]# yum install keepalived -y

2.keepalived配置文件

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
27
28
[root@hk02 ~]# cat >/etc/keepalived/keepalived.conf<<'EOF'
! Configuration File for keepalived
global_defs {
router_id hk02
}
vrrp_script check_web {
script "/server/scripts/check_web.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.174.201/24 dev eth0 label eth0:1
}
track_script {
check_web
}
}
EOF

3.检测脚本

1
2
3
4
5
6
7
8
9
[root@hk02 ~]# mkdir -p /server/scripts
[root@hk02 ~]# cat /server/scripts/check_web.sh
#/bin/bash
cnt=`ps -ef grep -c '[n]ginx'`

if [ $cnt -eq 0 ];then
systemctl stop keepalived
fi
[root@hk02 ~]# chmod + x /server/scripts/check_web.sh

4.启动服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@hk02 ~]# sysetmctl start nginx
[root@hk02 ~]# systemctl start keepalived

# vip不在backup上
[root@hk02 ~]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:59:d4:55 brd ff:ff:ff:ff:ff:ff
inet 192.168.174.138/24 brd 192.168.174.255 scope global noprefixroute dynamic eth0
valid_lft 5523144sec preferred_lft 5523144sec
inet6 fe80::c5f2:37c:a210:ea88/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::8074:c1a5:fa67:cfaa/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::772e:38a7:d2af:640a/64 scope link noprefixroute
valid_lft forever preferred_lft forever


[root@hk02 ~]# echo node-hk02 >/usr/share/nginx/html/index.html
# 此时访问服务为master在提供
[root@hk02 ~]# curl 192.168.174.201
node-hk01

5.查看slave节点日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@hk02 ~]# cat /var/log/messages 
May 12 23:54:56 localhost systemd: Starting LVS and VRRP High Availability Monitor...
May 12 23:54:56 localhost Keepalived[23208]: Starting Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
May 12 23:54:56 localhost Keepalived[23208]: Opening file '/etc/keepalived/keepalived.conf'.
May 12 23:54:56 localhost Keepalived[23209]: Starting Healthcheck child process, pid=23210
May 12 23:54:56 localhost systemd: Started LVS and VRRP High Availability Monitor.
May 12 23:54:56 localhost Keepalived[23209]: Starting VRRP child process, pid=23211
May 12 23:54:56 localhost Keepalived_healthcheckers[23210]: Opening file '/etc/keepalived/keepalived.conf'.
May 12 23:54:56 localhost Keepalived_vrrp[23211]: Registering Kernel netlink reflector
May 12 23:54:56 localhost Keepalived_vrrp[23211]: Registering Kernel netlink command channel
May 12 23:54:56 localhost Keepalived_vrrp[23211]: Registering gratuitous ARP shared channel
May 12 23:54:56 localhost Keepalived_vrrp[23211]: Opening file '/etc/keepalived/keepalived.conf'.
May 12 23:54:56 localhost Keepalived_vrrp[23211]: WARNING - default user 'keepalived_script' for script execution does not exist - please create.
May 12 23:54:56 localhost Keepalived_vrrp[23211]: SECURITY VIOLATION - scripts are being executed but script_security not enabled.
May 12 23:54:56 localhost Keepalived_vrrp[23211]: VRRP_Instance(VI_1) removing protocol VIPs.
May 12 23:54:56 localhost Keepalived_vrrp[23211]: Using LinkWatch kernel netlink reflector...
May 12 23:54:56 localhost Keepalived_vrrp[23211]: VRRP_Instance(VI_1) Entering BACKUP STATE
May 12 23:54:56 localhost Keepalived_vrrp[23211]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]
May 12 23:54:56 localhost Keepalived_vrrp[23211]: VRRP_Script(check_web) succeeded
May 12 23:54:57 localhost Keepalived_vrrp[23211]: VRRP_Instance(VI_1) Changing effective priority from 50 to 52

查看此时的VRRP通告数据包

1
2
[root@hk02 ~]#
tcpdump vrrp -w vrrp.pcap

故障模拟

1.关闭master节点中的nginx

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
27
28
29
30
31
32
33
34
# 关掉nginx服务
[root@hk01 ~]# systemctl stop nginx

# 查看vip已移除
[root@hk01 ~]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:24:49:ed brd ff:ff:ff:ff:ff:ff
inet 192.168.174.137/24 brd 192.168.174.255 scope global noprefixroute dynamic eth0
valid_lft 5522870sec preferred_lft 5522870sec
inet6 fe80::8074:c1a5:fa67:cfaa/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::c5f2:37c:a210:ea88/64 scope link noprefixroute
valid_lft forever preferred_lft forever

# 服务依旧可用,以切换到node-hk02
[root@hk01 ~]# curl 192.168.174.201
node-hk02


# 查看日志,vip自动移除
[root@hk01 ~]# less /var/log/messages
....
May 13 00:02:16 localhost systemd: Stopping The nginx HTTP and reverse proxy server...
May 13 00:02:16 localhost systemd: Stopped The nginx HTTP and reverse proxy server.
May 13 00:02:18 localhost Keepalived[18850]: Stopping
May 13 00:02:18 localhost systemd: Stopping LVS and VRRP High Availability Monitor...
May 13 00:02:18 localhost Keepalived_healthcheckers[18851]: Stopped
May 13 00:02:18 localhost Keepalived_vrrp[18852]: VRRP_Instance(VI_1) sent 0 priority
May 13 00:02:18 localhost Keepalived_vrrp[18852]: VRRP_Instance(VI_1) removing protocol VIPs.
May 13 00:02:19 localhost Keepalived_vrrp[18852]: Stopped
May 13 00:02:19 localhost Keepalived[18850]: Stopped Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
May 13 00:02:19 localhost systemd: Stopped LVS and VRRP High Availability Monitor.
....

2.查看vip漂移到slave

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
27
28
29
30
31
32
33
[root@hk02 ~]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:59:d4:55 brd ff:ff:ff:ff:ff:ff
inet 192.168.174.138/24 brd 192.168.174.255 scope global noprefixroute dynamic eth0
valid_lft 5522648sec preferred_lft 5522648sec
inet 192.168.174.201/24 scope global secondary eth0:1
valid_lft forever preferred_lft forever
inet6 fe80::c5f2:37c:a210:ea88/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::8074:c1a5:fa67:cfaa/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::772e:38a7:d2af:640a/64 scope link noprefixroute
valid_lft forever preferred_lft forever

# 查看日志
[root@hk02 ~]# less /var/log/messages
....
May 13 00:02:19 localhost Keepalived_vrrp[23211]: VRRP_Instance(VI_1) Transition to MASTER STATE
May 13 00:02:20 localhost Keepalived_vrrp[23211]: VRRP_Instance(VI_1) Entering MASTER STATE
May 13 00:02:20 localhost Keepalived_vrrp[23211]: VRRP_Instance(VI_1) setting protocol VIPs.
May 13 00:02:20 localhost Keepalived_vrrp[23211]: Sending gratuitous ARP on eth0 for 192.168.174.201
May 13 00:02:20 localhost Keepalived_vrrp[23211]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eth0 for 192.168.174.201
May 13 00:02:20 localhost Keepalived_vrrp[23211]: Sending gratuitous ARP on eth0 for 192.168.174.201
May 13 00:02:20 localhost Keepalived_vrrp[23211]: Sending gratuitous ARP on eth0 for 192.168.174.201
May 13 00:02:20 localhost Keepalived_vrrp[23211]: Sending gratuitous ARP on eth0 for 192.168.174.201
May 13 00:02:20 localhost Keepalived_vrrp[23211]: Sending gratuitous ARP on eth0 for 192.168.174.201
May 13 00:02:25 localhost Keepalived_vrrp[23211]: Sending gratuitous ARP on eth0 for 192.168.174.201
May 13 00:02:25 localhost Keepalived_vrrp[23211]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eth0 for 192.168.174.201
May 13 00:02:25 localhost Keepalived_vrrp[23211]: Sending gratuitous ARP on eth0 for 192.168.174.201
May 13 00:02:25 localhost Keepalived_vrrp[23211]: Sending gratuitous ARP on eth0 for 192.168.174.201
May 13 00:02:25 localhost Keepalived_vrrp[23211]: Sending gratuitous ARP on eth0 for 192.168.174.201
May 13 00:02:25 localhost Keepalived_vrrp[23211]: Sending gratuitous ARP on eth0 for 192.168.174.201
....

3.恢复master nginx和keepalive服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 恢复了master 的nginx,vip会自动切换回到master节点上
[root@hk01 ~]# systemctl start nginx
[root@hk01 ~]# systemctl start keepalived
[root@hk01 ~]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:24:49:ed brd ff:ff:ff:ff:ff:ff
inet 192.168.174.137/24 brd 192.168.174.255 scope global noprefixroute dynamic eth0
valid_lft 5521457sec preferred_lft 5521457sec
inet 192.168.174.201/24 scope global secondary eth0:1
valid_lft forever preferred_lft forever
inet6 fe80::8074:c1a5:fa67:cfaa/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::c5f2:37c:a210:ea88/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@hk01 ~]# curl 192.168.174.201
node-hk01

非抢占模式

默认为抢占模式,即当高优先级的主机恢复在线后,会抢占低先级的主机的master角色,造成网络抖动,建议设置为非抢占模式 nopreempt ,即高优级主机恢复后,并不会抢占低优先级主机的master角色

对于抢占模式,可以使用抢占延迟配置(preempt_delay 60s),就是当故障恢复后,不会立即抢回VIP,而是延迟一段时间再抢回VIP,此处略,可以自行测试

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# 生产中不建议修复故障后又进行一次vip飘逸,所以可以在配置文件中添加nopreempt参数,同时master/slave节点的priority值需要设置成一样,非抢占模式才生效
[root@hk01 ~]# cat >/etc/keepalived/keepalived.conf<<'EOF'
! Configuration File for keepalived
global_defs {
router_id hk01
}
vrrp_script check_web {
script "/server/scripts/check_web.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
# 非抢占模式
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.174.201/24 dev eth0 label eth0:1
}
track_script {
check_web
}
}
EOF

[root@hk02 ~]# cat >/etc/keepalived/keepalived.conf<<'EOF'
! Configuration File for keepalived
global_defs {
router_id hk02
}
vrrp_script check_web {
script "/server/scripts/check_web.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.174.201/24 dev eth0 label eth0:1
}
track_script {
check_web
}
}
EOF

# 自行测试~

Keepalive 双主模式

双主模式(互为主备),相较于主备可以提高服务器的利用率,需要dns来做域名负载到两个vip

节点一配置

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
[root@hk01 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
global_defs {
router_id hk01
}
vrrp_script check_web {
script "/server/scripts/check_web.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.174.201/24 dev eth0 label eth0:1
}
track_script {
check_web
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 52
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.174.202/24 dev eth0 label eth0:2
}
track_script {
check_web
}
}

# 重启keepalived
[root@hk01 ~]# systemctl restart keepalived.service

节点二配置

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
[root@hk02 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
global_defs {
router_id hk02
}
vrrp_script check_web {
script "/server/scripts/check_web.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.174.201/24 dev eth0 label eth0:1
}
track_script {
check_web
}
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.174.202/24 dev eth0 label eth0:2
}
track_script {
check_web
}
}

# 重启keepalive
[root@hk02 ~]# systemctl restart keepalived.service

待两个节点重启完后查看vip

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
27
28
29
30
31
32
33
34
# 节点一
[root@hk01 ~]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:24:49:ed brd ff:ff:ff:ff:ff:ff
inet 192.168.174.137/24 brd 192.168.174.255 scope global noprefixroute dynamic eth0
valid_lft 5517867sec preferred_lft 5517867sec
inet 192.168.174.201/24 scope global secondary eth0:1
valid_lft forever preferred_lft forever
inet6 fe80::8074:c1a5:fa67:cfaa/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::c5f2:37c:a210:ea88/64 scope link noprefixroute
valid_lft forever preferred_lft forever


# 节点二
[root@hk02 ~]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:59:d4:55 brd ff:ff:ff:ff:ff:ff
inet 192.168.174.138/24 brd 192.168.174.255 scope global noprefixroute dynamic eth0
valid_lft 5517908sec preferred_lft 5517908sec
inet 192.168.174.202/24 scope global secondary eth0:2
valid_lft forever preferred_lft forever
inet6 fe80::c5f2:37c:a210:ea88/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::8074:c1a5:fa67:cfaa/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::772e:38a7:d2af:640a/64 scope link noprefixroute
valid_lft forever preferred_lft forever

# 访问测试,自行测试域名做dns负载
[root@hk01 ~]# curl 192.168.174.201
node-hk01
[root@hk01 ~]# curl 192.168.174.202
node-hk02

故障模拟测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 停止节点一服务
[root@hk01 ~]# systemctl stop nginx
[root@hk01 ~]# curl 192.168.174.201
node-hk02
[root@hk01 ~]# curl 192.168.174.201
node-hk02

# vip已漂移到节点二
[root@hk02 ~]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:59:d4:55 brd ff:ff:ff:ff:ff:ff
inet 192.168.174.138/24 brd 192.168.174.255 scope global noprefixroute dynamic eth0
valid_lft 5517680sec preferred_lft 5517680sec
inet 192.168.174.202/24 scope global secondary eth0:2
valid_lft forever preferred_lft forever
inet 192.168.174.201/24 scope global secondary eth0:1
valid_lft forever preferred_lft forever
inet6 fe80::c5f2:37c:a210:ea88/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::8074:c1a5:fa67:cfaa/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::772e:38a7:d2af:640a/64 scope link noprefixroute
valid_lft forever preferred_lft forever

故障恢复测试

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
27
28
29
30
31
32
33
34
[root@hk01 ~]# systemctl start nginx
[root@hk01 ~]# systemctl start keepalived.service

[root@hk01 ~]# curl 192.168.174.201
node-hk01
[root@hk01 ~]# curl 192.168.174.202
node-hk02

# 节点一已抢占回原vip
[root@hk01 ~]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:24:49:ed brd ff:ff:ff:ff:ff:ff
inet 192.168.174.137/24 brd 192.168.174.255 scope global noprefixroute dynamic eth0
valid_lft 5517590sec preferred_lft 5517590sec
inet 192.168.174.201/24 scope global secondary eth0:1
valid_lft forever preferred_lft forever
inet6 fe80::8074:c1a5:fa67:cfaa/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::c5f2:37c:a210:ea88/64 scope link noprefixroute
valid_lft forever preferred_lft forever

[root@hk02 ~]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:59:d4:55 brd ff:ff:ff:ff:ff:ff
inet 192.168.174.138/24 brd 192.168.174.255 scope global noprefixroute dynamic eth0
valid_lft 5517587sec preferred_lft 5517587sec
inet 192.168.174.202/24 scope global secondary eth0:2
valid_lft forever preferred_lft forever
inet6 fe80::c5f2:37c:a210:ea88/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::8074:c1a5:fa67:cfaa/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::772e:38a7:d2af:640a/64 scope link noprefixroute
valid_lft forever preferred_lft forever

Keepalived组播改单播

Keepalived默认心跳通告是利用组播通告消息,没有必要同一网段下的服务器都会收到该消息,可能会造成网络拥堵,所以改成单播的方式通告可以减少网络拥堵

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# 主节点配置
[root@hk01 ~]# cat >/etc/keepalived/keepalived.conf<<'EOF'
! Configuration File for keepalived
global_defs {
router_id hk01
}
vrrp_script check_web {
script "/server/scripts/check_web.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
# 配置单播源地址,即本机地址
nicast_src_ip 192.168.174.137
# 配置单播目的地址,即对端备机地址
unicast_peer {
192.168.174.138
}
virtual_ipaddress {
192.168.174.201/24 dev eth0 label eth0:1
}
track_script {
check_web
}
}
EOF


# 备节点配置
[root@hk02 ~]# cat >/etc/keepalived/keepalived.conf<<'EOF'
! Configuration File for keepalived
global_defs {
router_id hk02
}
vrrp_script check_web {
script "/server/scripts/check_web.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
# 配置单播源地址,即本机地址
nicast_src_ip 192.168.174.138
# 配置单播目的地址,即对端备机地址
unicast_peer {
192.168.174.137
}
virtual_ipaddress {
192.168.174.201/24 dev eth0 label eth0:1
}
track_script {
check_web
}
}
EOF

此时可以查看VRRP数据包