高可用集群教程:KEEPALIVED
一. 高可用集群概述
1.1 集群类型
-
LB(Load Balance)负载均衡
- LVS/HAProxy/nginx:用于HTTP和流处理的上游配置。
-
HA(High Availability)高可用集群
- 数据库、Redis:保证数据库和Redis的高可用性。
- SPoF(Single Point of Failure):解决单点故障的问题。
-
HPC(High Performance Computing)高性能集群
- 提供高性能计算能力。
1.2 系统可用性
- SLA(Service-Level Agreement)服务等级协议:
- 服务提供商和客户之间关于服务质量、水平和性能的协议。
- 系统可用性公式:A = MTBF / (MTBF + MTTR)
- MTBF(Mean Time Between Failures):平均故障间隔时间
- MTTR(Mean Time To Repair):平均修复时间
- 可用性指标:99.9%, 99.99%, 99.999%, 99.9999%
1.3 系统故障
- 硬件故障:设计缺陷、损耗、非人为不可抗拒因素。
- 软件故障:设计缺陷、bug。
1.4 实现高可用
- 提升系统高可用性的解决方案:降低MTTR。
- 冗余机制:
- active/passive:主/备
- active/active:双主
- HEARTBEAT:心跳检测机制
- active → HEARTBEAT → passive
- active ↔ HEARTBEAT ↔ active
1.5 VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议
- 目的:解决静态网关单点风险
- 层级:
- 物理层:路由器、三层交换机
- 软件层:keepalived
- 可用性:99.95% -> 一个月停机时间约21.6分钟
1.5.1 VRRP 相关术语
- 虚拟路由器:Virtual Router
- 虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器
- VIP:Virtual IP
- VMAC:Virtual MAC(00-00-5e-00-01-VRID)
- 物理路由器:
- master:主设备
- backup:备用设备
- priority:优先级
1.5.2 VRRP 相关技术
- 通告:心跳、优先级等;周期性
- 工作方式:抢占式,非抢占式
- 安全认证:
- 无认证
- 简单字符认证:预共享密钥
- MD5
- 工作模式:
- 主/备:单虚拟路由器
- 主/主:主/备(虚拟路由器1),备/主(虚拟路由器2)
二. Keepalived 部署
2.1 Keepalived 简介
- vrrp 协议的软件实现,原生设计目的为了高可用ipvs服务。
- 官网:http://keepalived.org/
- 功能:
- 基于vrrp协议完成地址流动
- 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
- 为ipvs集群的各RS做健康状态检测
- 基于脚本调用接口完成脚本中定义的功能,进而支持nginx、haproxy等服务。
2.2 Keepalived 架构
- 官方文档:
- 用户空间核心组件:
- vrrp stack:VIP消息通告
- checkers:监测real server
- system call:实现vrrp协议状态转换时调用脚本的功能
- SMTP:邮件组件
- IPVS wrapper:生成IPVS规则
- Netlink Reflector:网络接口
- WatchDog:监控进程
- 控制组件:提供keepalived.conf的解析器,完成Keepalived配置
- IO复用器:针对网络目的而优化的线程抽象
- 内存管理组件:为某些通用的内存管理功能(如分配、重新分配、发布等)提供访问权限。
2.3 Keepalived 环境准备
- 各节点时间必须同步:ntp, chrony
- 关闭防火墙及SELinux
- 各节点之间可通过主机名互相通信:非必须
- 建议使用/etc/hosts文件实现:非必须
- 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信:非必须
2.4 Keepalived 相关文件
- 软件包名:keepalived
- 主程序文件:/usr/sbin/keepalived
- 主配置文件:/etc/keepalived/keepalived.conf
- 配置文件示例:/usr/share/doc/keepalived/
- Unit File:/lib/systemd/system/keepalived.service
- Unit File的环境配置文件:/etc/sysconfig/keepalived
- 注意事项:RHEL7中可能会遇到一些bug
2.5 Keepalived 安装
[root@ka1 ~]# yum install keepalived -y
[root@ka2 ~]# yum install keepalived -y
2.6 KeepAlived 配置说明
2.6.1 配置文件组成部分
- 配置文件:/etc/keepalived/keepalived.conf
- 配置文件组成:
- GLOBAL CONFIGURATION
- Global definitions:定义邮件配置,route_id,vrrp配置,多播地址等
- VRRP CONFIGURATION
- VRRP instance(s):定义每个vrrp虚拟路由器
- LVS CONFIGURATION
- Virtual server group(s)
- Virtual server(s):LVS集群的VS和RS
- GLOBAL CONFIGURATION
三. 实例部署
以下是Keepalived的配置步骤,以便设置高可用性环境:
实验1 keepalived-实验环境配置
1. 配置虚拟机的网络接口
两个真实服务器 realserver1
和 realserver2
,IP地址分别是 172.25.254.110
和 172.25.254.120
。
[root@localhost ~]# vmset.sh eth0 172.25.254.110 realserver1.timinglee.org
[root@localhost ~]# vmset.sh eth0 172.25.254.120 realserver2.timinglee.org
2. 安装HTTP服务
在两个真实服务器上安装HTTP服务:
[root@realserver1 ~]# yum install httpd -y
[root@realserver2 ~]# yum install httpd -y
3. 配置HTTP服务
在 realserver1
和 realserver2
上创建测试页面:
[root@realserver1 ~]# echo 172.25.254.110 > /var/www/html/index.html
[root@realserver2 ~]# echo 172.25.254.120 > /var/www/html/index.html
启动并启用HTTP服务:
[root@realserver1 ~]# systemctl enable --now httpd
[root@realserver2 ~]# systemctl enable --now httpd
4. 测试HTTP服务
在任意一台机器上测试HTTP服务:
[root@ka1 ~]# curl 172.25.254.110
172.25.254.110
[root@ka1 ~]# curl 172.25.254.120
172.25.254.120
实验2 配置 Keepalived 虚拟路由通讯
1. 安装 Keepalived
在两台服务器上安装 Keepalived:
[root@ka1 ~]# yum install keepalived -y
[root@ka2 ~]# yum install keepalived -y
2. 配置 Keepalived
在两台服务器上编辑 Keepalived 配置文件 /etc/keepalived/keepalived.conf
。
在 ka1 上的配置:
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
配置内容如下:
global_defs {
notification_email {
947798764@qq.com
}
notification_email_from keepalived@timinglee.org
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id kal.timinglee.org
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_gna_interval 0
vrrp_mcast_group4 224.0.0.18
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 100
priority 100
preempt_delay 20
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
}
在 ka2 上的配置:
将 ka1
的配置文件复制到 ka2
上,并进行编辑:
[root@ka1 ~]# scp /etc/keepalived/keepalived.conf root@172.25.254.20:/etc/keepalived/keepalived.conf
在 ka2
上编辑配置文件:
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
修改 priority
为 80:
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 100
priority 80
preempt_delay 20
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
}
3. 启动 Keepalived
在两台服务器上启用并启动 Keepalived 服务:
[root@ka1 ~]# systemctl enable --now keepalived.service
[root@ka2 ~]# systemctl enable --now keepalived.service
4.测试 验证配置
使用 tcpdump
检查 VRRP 报文:
[root@ka1 ~]# tcpdump -i eth0 -nn host 224.0.0.18
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
00:05:14.142823 IP 172.25.254.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
00:05:15.144164 IP 172.25.254.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
00:05:16.145465 IP 172.25.254.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
00:05:17.146616 IP 172.25.254.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
00:05:18.147011 IP 172.25.254.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
00:05:19.148189 IP 172.25.254.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
00:05:20.149642 IP 172.25.25
h
5. 验证 VIP
检查虚拟 IP 地址是否正确配置:
[root@ka1 ~]# ifconfig
确保 eth0:1
接口配置了虚拟 IP 172.25.254.100
。
6. 测试切换
停止 ka1
上的 Keepalived 服务,查看 ka2
是否接管虚拟 IP:
[root@ka1 ~]# systemctl stop keepalived.service
在 ka2
上检查是否接管虚拟 IP:
[root@ka2 ~]# ifconfig
7. 重新启动 Keepalived
在 ka1
上重新启动 Keepalived 服务,确保其重新接管虚拟 IP:
[root@ka1 ~]# systemctl start keepalived.service
8. 验证 IP 通讯
在 ka1
和 ka2
上分别 ping 虚拟 IP 地址:
[root@ka1 ~]# ping 172.25.254.100
[root@ka2 ~]# ping 172.25.254.100
实验三 Keepalived日志功能
-
编辑 Keepalived 配置文件以启用调试模式
编辑
/etc/sysconfig/keepalived
文件,添加-D
选项以启用调试模式,并设置日志级别:[root@ka1 ~]# vim /etc/sysconfig/keepalived
在文件中设置如下内容:
KEEPALIVED_OPTIONS="-D -S 8"
-D
选项启用调试模式。-S 8
选项设置日志级别。
-
重新启动 Keepalived 服务
应用配置更改:
[root@ka1 ~]# systemctl restart keepalived.service
-
配置 rsyslog 以将 Keepalived 日志分离到特定文件
编辑 rsyslog 配置文件
/etc/rsyslog.conf
,将 Keepalived 日志分离到专用的日志文件:[root@ka1 ~]# vim /etc/rsyslog.conf
添加以下行以将 Keepalived 日志输出到
/var/log/keepalived.log
文件:local7.* /var/log/boot.log local8.* /var/log/keepalived.log
local7.*
用于保存引导消息到/var/log/boot.log
。local8.*
用于将 Keepalived 日志记录到/var/log/keepalived.log
。
-
重新启动 rsyslog 服务
应用 rsyslog 配置更改:
[root@ka1 ~]# systemctl restart rsyslog.service
-
再次重新启动 Keepalived 服务
确保所有服务都重新启动,以应用新的日志设置:
[root@ka1 ~]# systemctl restart keepalived.service
-
验证日志文件
检查 Keepalived 日志文件
/var/log/keepalived.log
以确认日志记录是否正常:[root@ka1 ~]# ll /var/log/keepalived.log
Keepalived 的日志被正确记录,并且能够独立于其他日志文件进行监控和分析。
实验 四Keepalived 独立子配置文件
将 Keepalived 配置拆分为主配置文件和独立的子配置文件可以使配置更加清晰和易于管理。
1. 编辑主配置文件
主配置文件 keepalived.conf
设置了包含子配置文件的指令。编辑 /etc/keepalived/keepalived.conf
文件,添加以下内容:
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
内容如下:
include "/etc/keepalived/conf.d/*.conf"
这样,Keepalived 会包含 /etc/keepalived/conf.d/
目录下的所有 .conf
文件作为子配置文件。
2. 创建子配置文件
接下来,创建独立的子配置文件 /etc/keepalived/conf.d/172.25.254.100.conf
:
[root@ka1 ~]# mkdir -p /etc/keepalived/conf.d
[root@ka1 ~]# vim /etc/keepalived/conf.d/172.25.254.100.conf
在文件中添加以下内容:
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 100
priority 100
preempt_delay 20s
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
}
3. 重新启动 Keepalived 服务
重新启动 Keepalived 服务以应用新配置:
[root@ka1 ~]# systemctl restart keepalived.service
4. 验证配置
使用 ifconfig
命令检查虚拟 IP 地址是否配置正确:
[root@ka1 ~]# ifconfig
输出中应显示 eth0:1
接口和虚拟 IP 地址 172.25.254.100
。输出如下:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.25.254.10 netmask 255.255.255.0 broadcast 172.25.254.255
inet6 fe80::20c:29ff:fec3:197 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:c3:01:97 txqueuelen 1000 (Ethernet)
RX packets 24419 bytes 1865001 (1.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 17346 bytes 1484975 (1.4 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.25.254.100 netmask 255.255.255.0 broadcast 0.0.0.0
ether 00:0c:29:c3:01:97 txqueuelen 1000 (Ethernet)
实验五 keepalived-非抢占模式和延迟抢占
在 Keepalived 中,抢占模式(preempt)可以配置为启用或禁用,以控制主节点是否在恢复后重新成为主节点。非抢占模式(nopreempt
)意味着即使当前主节点恢复,它也不会重新成为主节点,除非当前主节点主动将其角色交给它。
1. 配置文件
以下是配置文件 /etc/keepalived/keepalived.conf
的设置示例:
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 100
priority 100
# 延迟抢占
preempt_delay 20s
# 禁用抢占
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
}
2. 配置步骤
-
在
ka1
和ka2
上配置 Keepalived:在两个节点上配置相同的 Keepalived 文件。
# 在 ka1 和 ka2 上编辑配置文件 [root@ka1 ~]# vim /etc/keepalived/keepalived.conf
添加如下配置:
vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 100 priority 100 # 延迟抢占 preempt_delay 20s # 禁用抢占 nopreempt advert_int 1 authentication { auth_type PASS auth_pass 1111 } }
-
重启 Keepalived 服务:
在
ka1
和ka2
上分别重启 Keepalived 服务以应用新的配置:[root@ka1 ~]# systemctl restart keepalived.service [root@ka2 ~]# systemctl restart keepalived.service
-
检查网络接口:
确认虚拟 IP 地址是否出现在指定的接口上。通过
ifconfig
命令检查网络接口配置:[root@ka2 ~]# ifconfig
结果应显示虚拟 IP 地址
172.25.254.100
配置在eth0:1
上:eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.25.254.100 netmask 255.255.255.0 broadcast 0.0.0.0 ether 00:0c:29:02:1d:df txqueuelen 1000 (Ethernet)
3. 验证和测试
-
模拟主节点故障:
假设
ka1
是主节点,关闭ka1
上的 Keepalived 服务:[root@ka1 ~]# systemctl stop keepalived.service
在
ka2
上检查虚拟 IP 地址是否接管:[root@ka2 ~]# ifconfig
结果显示
172.25.254.100
仍然配置在ka2
上的eth0:1
接口上。 -
重新启动
ka1
上的 Keepalived 服务:启动
ka1
上的 Keepalived 服务:[root@ka1 ~]# systemctl start keepalived.service
由于非抢占模式的配置,
ka1
不会重新抢占虚拟 IP 地址,除非ka2
的 Keepalived 服务关闭或失败,才会将虚拟 IP 地址切换回ka1
。
实验六 Keepalived 抢占延迟模式配置
在 Keepalived 中,preempt_delay
选项用于配置主节点恢复后延迟抢占的时间。通过设置此选项,可以在主节点恢复后,保持备份节点在一段时间内为主,以避免频繁的切换。
1. 配置文件
编辑 keepalived
配置文件 /etc/keepalived/keepalived.conf
,去除 nopreempt
,并设置 preempt_delay
:
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 100
priority 100
# 配置抢占延迟
preempt_delay 5s
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
}
preempt_delay
设置为 5s
,这意味着当主节点恢复后,它将等待 5 秒钟才会抢占虚拟 IP 地址。
2. 重启服务
在 ka1
和 ka2
上重启 Keepalived 服务以应用新的配置:
[root@ka1 ~]# systemctl restart keepalived.service
[root@ka2 ~]# systemctl restart keepalived.service
3. 模拟主节点故障
停止 ka1
上的 Keepalived 服务,模拟主节点故障:
[root@ka1 ~]# systemctl stop keepalived.service
在 ka2
上检查虚拟 IP 地址是否接管:
[root@ka2 ~]# ifconfig
eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.25.254.100 netmask 255.255.255.0 broadcast 0.0.0.0
ether 00:0c:29:c3:01:97 txqueuelen 1000 (Ethernet)
4. 验证虚拟 IP 配置
在 ka1
上,检查虚拟 IP 地址是否仍然配置在 eth0:1
接口上:
[root@ka1 ~]# ifconfig
如果一切配置正确,ka2
应该接管虚拟 IP 172.25.254.100
。在 ka1
恢复后,由于配置了 preempt_delay 5s
,ka1
在恢复后会等待 5 秒才会重新抢占虚拟 IP 地址。这有助于避免频繁的切换。
preempt_delay
设置了主节点恢复后延迟抢占的时间。nopreempt
被去除,允许主节点在恢复后进行抢占。- 配置
preempt_delay
后,主节点在恢复后会等待指定的时间(如 5 秒)才会重新抢占虚拟 IP 地址。
实验七 Keepalived 单播模式配置
Keepalived 默认使用组播来发送 VRRP 广告,但是在某些网络环境下,组播可能不被支持或希望使用单播来减少网络流量。这时可以通过配置单播模式来解决。
配置步骤
-
编辑 Keepalived 配置文件
在
ka1
和ka2
上分别编辑 Keepalived 配置文件/etc/keepalived/keepalived.conf
。在 ka1 上配置:
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 100 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.25.254.100/24 dev eth0 label eth0:1 } unicast_src_ip 172.25.254.10 unicast_peer { 172.25.254.20 } }
在 ka2 上配置:
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 100 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.25.254.100/24 dev eth0 label eth0:1 } unicast_src_ip 172.25.254.20 unicast_peer { 172.25.254.10 } }
-
重启 Keepalived 服务
在
ka1
和ka2
上分别重启 Keepalived 服务以应用新的配置:[root@ka1 ~]# systemctl restart keepalived.service [root@ka2 ~]# systemctl restart keepalived.service
-
验证配置
使用
tcpdump
工具在ka1
和ka2
上抓包,确认 VRRP 广告是通过单播发送的。在 ka1 上运行:
[root@ka1 ~]# tcpdump -i eth0 -nn src host 172.25.254.10 and dst 172.25.254.20 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 01:44:31.139294 IP 172.25.254.10 > 172.25.254.20: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20 01:44:32.139587 IP 172.25.254.10
在 ka2 上运行:
[root@ka2 ~]# tcpdump -i eth0 -nn src host 172.25.254.20 and dst 172.25.254.10 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes ^Z
注意事项
- 注释
vrrp_strict
:如果配置文件中启用了vrrp_strict
,需要将其注释掉或移除,因为该选项在单播模式下可能会导致问题。
通过以上配置,可以将 Keepalived 的 VRRP 广告从组播模式切换到单播模式,从而适应特定网络环境的需求。
实验8 配置 Keepalived 邮件通知
为确保在 Keepalived 发生主备切换或故障时可以收到邮件通知,需要进行以下配置:
1. 安装 mailx
在 ka1
和 ka2
上安装 mailx
:
[root@ka1 ~]# yum install mailx -y
[root@ka2 ~]# yum install mailx -y
2. 配置邮件发送设置
编辑 /etc/mail.rc
文件,配置邮箱信息:
[root@ka1 ~]# vim /etc/mail.rc
[root@ka2 ~]# vim /etc/mail.rc
添加以下内容:
set from=947798764@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=947798764@qq.com
set smtp-auth-password=osxvybhawggjbbfi
set smtp-auth=login
set ssl-verify=ignore
测试邮件发送功能:
[root@ka1 ~]# echo "test message" | mail -s "test" 947798764@qq.com
[root@ka2 ~]# echo "test message" | mail -s "test" 947798764@qq.com
3. 编写通知脚本
在 ka1
和 ka2
上创建并编辑 /etc/keepalived/mail.sh
脚本:
[root@ka1 ~]# vim /etc/keepalived/mail.sh
[root@ka2 ~]# vim /etc/keepalived/mail.sh
添加以下内容:
#!/bin/bash
mail_dst="947798764@qq.com"
send_message() {
mail_sub="$HOSTNAME to be $1 vip move"
mail_msg="`date +%F\ %T`: vrrp move $HOSTNAME change $1"
echo $mail_msg | mail -s "$mail_sub" $mail_dst
}
case $1 in
master)
send_message master
;;
backup)
send_message backup
;;
fault)
send_message fault
;;
*)
;;
esac
给脚本添加执行权限:
[root@ka1 ~]# chmod +x /etc/keepalived/mail.sh
[root@ka2 ~]# chmod +x /etc/keepalived/mail.sh
4. 修改 Keepalived 配置文件
在 ka1
和 ka2
上编辑 /etc/keepalived/keepalived.conf
文件:
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
在 vrrp_instance VI_1
语句块中添加通知脚本的调用:
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
unicast_src_ip 172.25.254.10
unicast_peer {
172.25.254.20
}
notify_master "/etc/keepalived/mail.sh master"
notify_backup "/etc/keepalived/mail.sh backup"
notify_fault "/etc/keepalived/mail.sh fault"
}
注意:ka2
的配置中 unicast_src_ip
和 unicast_peer
的 IP 地址需要对应修改:
unicast_src_ip 172.25.254.20
unicast_peer {
172.25.254.10
}
5. 重启 Keepalived 服务
在 ka1
和 ka2
上分别重启 Keepalived 服务:
[root@ka1 ~]# systemctl restart keepalived.service
[root@ka2 ~]# systemctl restart keepalived.service
6. 测试邮件通知功能
手动触发通知脚本进行测试:
[root@ka2 ~]# /etc/keepalived/mail.sh fault
测试主备切换通知:
[root@ka1 ~]# systemctl stop keepalived.service
通过以上步骤,可以在 Keepalived 发生主备切换或故障时,接收到相应的邮件通知,从而及时了解集群状态。
实验九 配置 Keepalived 双主模式
在双主模式下,每个节点会同时担任不同虚拟 IP 的 MASTER 和 BACKUP 角色。这种配置可以提高高可用性和负载均衡。
1. 配置 ka1
的 Keepalived
编辑 ka1
的 keepalived.conf
文件:
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
添加以下内容:
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
unicast_src_ip 172.25.254.10
unicast_peer {
172.25.254.20
}
notify_master "/etc/keepalived/mail.sh master"
notify_backup "/etc/keepalived/mail.sh backup"
notify_fault "/etc/keepalived/mail.sh fault"
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 200
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.200/24 dev eth0 label eth0:2
}
unicast_src_ip 172.25.254.10
unicast_peer {
172.25.254.20
}
notify_master "/etc/keepalived/mail.sh master"
notify_backup "/etc/keepalived/mail.sh backup"
notify_fault "/etc/keepalived/mail.sh fault"
}
2. 配置 ka2
的 Keepalived
编辑 ka2
的 keepalived.conf
文件:
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
添加以下内容:
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 100
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
unicast_src_ip 172.25.254.20
unicast_peer {
172.25.254.10
}
notify_master "/etc/keepalived/mail.sh master"
notify_backup "/etc/keepalived/mail.sh backup"
notify_fault "/etc/keepalived/mail.sh fault"
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 200
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.200/24 dev eth0 label eth0:2
}
unicast_src_ip 172.25.254.20
unicast_peer {
172.25.254.10
}
notify_master "/etc/keepalived/mail.sh master"
notify_backup "/etc/keepalived/mail.sh backup"
notify_fault "/etc/keepalived/mail.sh fault"
}
3. 重启 Keepalived 服务
在 ka1
和 ka2
上分别重启 Keepalived 服务:
[root@ka1 ~]# systemctl restart keepalived.service
[root@ka2 ~]# systemctl restart keepalived.service
4. 测试配置
在 ka1
和 ka2
上检查网络接口配置:
[root@ka1 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.25.254.10 netmask 255.255.255.0 broadcast 172.25.254.255
inet6 fe80::20c:29ff:fec3:197 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:c3:01:97 txqueuelen 1000 (Ethernet)
RX packets 2733 bytes 206335 (201.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3152 bytes 253723 (247.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.25.254.100 netmask 255.255.255.0 broadcast 0.0.0.0
ether 00:0c:29:c3:01:97 txqueuelen 1000 (Ethernet)
[root@ka2 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.25.254.20 netmask 255.255.255.0 broadcast 172.25.254.255
inet6 fe80::20c:29ff:fe02:1ddf prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:02:1d:df txqueuelen 1000 (Ethernet)
RX packets 2467 bytes 183336 (179.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2983 bytes 230760 (225.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0:2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.25.254.200 netmask 255.255.255.0 broadcast 0.0.0.0
ether 00:0c:29:02:1d:df txqueuelen 1000 (Ethernet)
你应该能够看到以下输出:
ka1
上eth0:1
接口拥有172.25.254.100
的 IP 地址。ka2
上eth0:2
接口拥有172.25.254.200
的 IP 地址。
验证主备切换:
- 停止
ka1
上的 Keepalived 服务,看是否172.25.254.100
的 IP 地址会转移到ka2
上。 - 停止
ka2
上的 Keepalived 服务,看是否172.25.254.200
的 IP 地址会转移到ka1
上。
[root@ka1 ~]# systemctl stop keepalived.service
[root@ka2 ~]# systemctl stop keepalived.service
这样,双主模式的 Keepalived 配置就完成了,你应该能够在 ka1
和 ka2
之间实现虚拟 IP 的高可用性和负载均衡。
实验十 keepalived-ipvs
配置
配置真实服务器的回环接口
首先,在真实服务器上配置回环接口的 IP 地址:
[root@realserver1 ~]# ip addr add 172.25.254.100/32 dev lo
然后,编辑 ifcfg-lo
配置文件:
[root@realserver1 ~]# cd /etc/sysconfig/network-scripts/
[root@realserver1 network-scripts]# vim ifcfg-lo
在 ifcfg-lo
文件中添加以下内容:
DEVICE=lo
IPADDR0=127.0.0.1
NETMASK0=255.0.0.0
IPADDR1=172.25.254.100
NETMASK1=255.255.255.255
NETWORK=127.0.0.0
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
重载网络连接并重启网络服务:
[root@realserver1 network-scripts]# nmcli connection reload
[root@realserver1 network-scripts]# systemctl restart network
配置路由转发
在真实服务器上配置 ARP 相关参数:
[root@realserver2 ~]# vim /etc/sysctl.d/arp.conf
在 arp.conf
文件中添加以下内容:
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
应用配置并复制到其他服务器:
[root@realserver2 ~]# sysctl --system
[root@realserver2 ~]# scp /etc/sysctl.d/arp.conf root@172.25.254.110:/etc/sysctl.d/arp.conf
[root@realserver1 ~]# sysctl --system
安装和配置 Keepalived
安装 ipvsadm
:
[root@ka1 ~]# yum install ipvsadm -y
编辑 keepalived
配置文件:
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
在 keepalived.conf
文件中添加以下内容:
#include "/etc/keepalived/conf.d/*.conf"
virtual_server 172.25.254.100 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 172.25.254.110 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 2
delay_before_retry 2
}
}
real_server 172.25.254.120 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 2
delay_before_retry 2
}
}
}
重启 keepalived
服务:
[root@ka1 ~]# systemctl restart keepalived.service
对另一台服务器重复安装和配置步骤:
[root@ka2 ~]# yum install ipvsadm -y
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
virtual_server 172.25.254.10 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
protocol TCP
real_server 172.25.254.110 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 2
delay_before_retry 2
}
}
}
[root@ka2 ~]# systemctl restart keepalived.service
测试配置
使用 ipvsadm
查看虚拟服务器配置:
[root@ka1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.254.100:80 wrr
-> 172.25.254.110:80 Route 1 0 0
-> 172.25.254.120:80 Route 1 0 0
测试负载均衡功能:
C:\Users\94779>curl 172.25.254.100
RS1 - 172.25.254.110
C:\Users\94779>curl 172.25.254.100
RS1 - 172.25.254.120
实验11 实战案例:利用脚本实现主从角色切换
通过以下步骤,我们可以使用Keepalived和自定义脚本实现主从角色切换,并动态调整虚拟IP的主备状态。
步骤1:编写检测脚本
在主服务器 ka1
上创建检测脚本 test.sh
。
[root@ka1 ~]# vim /etc/keepalived/test.sh
脚本内容如下:
#!/bin/bash
[ ! -f /mnt/lee ]
保存后,给脚本添加执行权限:
[root@ka1 ~]# chmod +x /etc/keepalived/test.sh
步骤2:测试脚本
测试脚本是否能正常工作:
[root@ka1 keepalived]# sh /etc/keepalived/test.sh
[root@ka1 keepalived]# echo $?
0
当文件 /mnt/lee
不存在时,脚本返回 0。
创建文件 /mnt/lee
,再测试一次:
[root@ka1 keepalived]# touch /mnt/lee
[root@ka1 keepalived]# sh /etc/keepalived/test.sh
[root@ka1 keepalived]# echo $?
1
当文件 /mnt/lee
存在时,脚本返回 1。
步骤3:配置Keepalived
编辑Keepalived配置文件:
[root@ka1 keepalived]# vim /etc/keepalived/keepalived.conf
在配置文件中加入检测脚本配置:
vrrp_script check_file {
script "/etc/keepalived/test.sh"
interval 1
weight -30
fall 2
rise 2
timeout 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
172.25.254.10
}
track_script {
check_file
}
}
步骤4:重启Keepalived服务
重启Keepalived服务以应用配置:
[root@ka1 keepalived]# systemctl restart keepalived.service
步骤5:验证配置
删除文件 /mnt/lee
并重启Keepalived服务,检查虚拟IP配置:
[root@ka1 keepalived]# rm -rf /mnt/lee
[root@ka1 keepalived]# systemctl restart keepalived.service
[root@ka1 keepalived]# ifconfig
输出应显示 eth0:1
接口和虚拟IP 172.25.254.10
。
创建文件 /mnt/lee
再次检查:
[root@ka1 keepalived]# touch /mnt/lee
[root@ka1 keepalived]# ifconfig
此时应不再显示 eth0:1
接口,说明主从角色切换成功,虚拟IP已转移到备服务器。
步骤6:验证主从切换
执行以下命令以查看IPVSADM状态:
[root@ka1 keepalived]# ipvsadm -Ln
实验12 实现 HAProxy 高可用
实现一个高可用的负载均衡系统,使用 Keepalived
和 HAProxy
。用于确保在某个节点出现故障时,系统仍能正常运行。下
1. 配置 Web 服务器
在 realserver1 上:
-
修改 IP 地址:
nmcli connection modify eth0 ipv4.address 172.25.254.110/24 nmcli connection up eth0
-
安装和启动 HTTP 服务:
yum install -y httpd systemctl restart httpd
-
重定向 Web 服务内容:
echo realserver1 -172.25.254.110 > /var/www/html/index.html
-
重启 HTTP 服务:
systemctl restart httpd
在 realserver2 上:
-
修改 IP 地址:
nmcli connection modify eth0 ipv4.address 172.25.254.120/24 nmcli connection up eth0
-
安装和启动 HTTP 服务:
yum install -y httpd systemctl restart httpd
-
重定向 Web 服务内容:
echo realserver2 -172.25.254.120 > /var/www/html/index.html
-
重启 HTTP 服务:
systemctl restart httpd
2. 配置 Keepalived 和 HAProxy
在 ka1 上:
-
安装 Keepalived:
yum install -y keepalived
-
启动 Keepalived:
systemctl restart keepalived.service
-
修改配置文件:
编辑
/etc/sysctl.conf
文件,添加:net.ipv4.ip_nonlocal_bind=1
使配置生效:
sysctl -p
-
编写判断 HAProxy 是否运行的脚本:
编辑
/etc/keepalived/test.sh
文件:#!/bin/bash killall -0 haproxy
-
添加脚本执行权限:
chmod +x /etc/keepalived/test.sh
-
配置 Keepalived 主配置文件:
编辑
/etc/keepalived/keepalived.conf
文件:global_defs { notification_email { 11111111@qq.com } notification_email_from keepalived@lm.org smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id ka1.lm.org vrrp_skip_check_adv_addr vrrp_garp_interval 0 vrrp_gna_interval 0 vrrp_mcast_group4 224.0.0.18 } vrrp_script check_haproxy { script "/etc/keepalived/test.sh" interval 1 weight -30 fall 2 rise 2 timeout 2 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 100 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.25.254.100/24 dev eth0 label eth0:1 } unicast_src_ip 172.25.254.10 unicast_peer { 172.25.254.20 } track_script { check_haproxy } }
-
重启 Keepalived 服务:
systemctl restart keepalived
-
安装 HAProxy:
yum install -y haproxy
-
配置 HAProxy 主配置文件:
编辑
/etc/haproxy/haproxy.cfg
文件,添加:listen webcluster bind 172.25.254.100:80 mode http balance roundrobin server web1 172.25.254.110:80 check inter 2 fall 3 rise 5 server web2 172.25.254.120:80 check inter 2 fall 3 rise 5
-
重启 HAProxy 服务:
systemctl restart haproxy
在 ka2 上:
-
安装 Keepalived:
yum install -y keepalived
-
启动 Keepalived:
systemctl restart keepalived.service
-
修改配置文件:
编辑
/etc/sysctl.conf
文件,添加:net.ipv4.ip_nonlocal_bind=1
使配置生效:
sysctl -p
-
编写判断 HAProxy 是否运行的脚本:
编辑
/etc/keepalived/test.sh
文件:#!/bin/bash killall -0 haproxy
-
添加脚本执行权限:
chmod +x /etc/keepalived/test.sh
-
配置 Keepalived 主配置文件:
编辑
/etc/keepalived/keepalived.conf
文件:global_defs { notification_email { 13579@qq.com } notification_email_from keepalived@lm.org smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id ka2.lm.org vrrp_skip_check_adv_addr vrrp_garp_interval 0 vrrp_gna_interval 0 vrrp_mcast_group4 224.0.0.18 } vrrp_script check_haproxy { script "/etc/keepalived/test.sh" interval 1 weight -30 fall 2 rise 2 timeout 2 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 100 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.25.254.100/24 dev eth0 label eth0:1 } unicast_src_ip 172.25.254.20 unicast_peer { 172.25.254.10 } track_script { check_haproxy } }
-
重启 Keepalived 服务:
systemctl restart keepalived
-
安装 HAProxy:
yum install -y haproxy
-
配置 HAProxy 主配置文件:
编辑
/etc/haproxy/haproxy.cfg
文件,添加:listen webcluster bind 172.25.254.100:80 mode http balance roundrobin server web1 172.25.254.110:80 check inter 2 fall 3 rise 5 server web2 172.25.254.120:80 check inter 2 fall 3 rise 5
-
重启 HAProxy 服务:
systemctl restart haproxy
测试
-
在 ka1 上停止 HAProxy 服务,检查 VIP 的漂移情况:
systemctl stop haproxy
-
在 ka1 和 ka2 上查看
ifconfig
,确认 VIP 是否漂移到 ka2 上。 -
重新启动 ka1 上的 HAProxy 服务,确保它重新接管 VIP:
systemctl restart haproxy