共计 20453 个字符,预计需要花费 52 分钟才能阅读完成。
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配置文件样例
! 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.安装软件包
[root@hk01 ~]# yum install nginx -y
[root@hk01 ~]# yum install keepalived -y
2.配置文件
[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.检测脚本
[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.启动服务并测试
[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节点此时日志
# 注意此时备机还未开始安装
[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.安装软件包
[root@hk02 ~]# yum install nginx -y
[root@hk02 ~]# yum install keepalived -y
2.keepalived配置文件
[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.检测脚本
[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.启动服务
[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节点日志
[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通告数据包
[root@hk02 ~]#
tcpdump vrrp -w vrrp.pcap
故障模拟
1.关闭master节点中的nginx
# 关掉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
[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服务
# 恢复了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,此处略,可以自行测试
# 生产中不建议修复故障后又进行一次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
节点一配置
[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
节点二配置
[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
# 节点一
[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
故障模拟测试
# 停止节点一服务
[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
故障恢复测试
[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默认心跳通告是利用组播通告消息,没有必要同一网段下的服务器都会收到该消息,可能会造成网络拥堵,所以改成单播的方式通告可以减少网络拥堵
# 主节点配置
[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数据包