keepalived安装配置
1.yum/apt安装
# yum install keepalived (CentOS)
# apt-get install keepalived (Ubuntu)
2. 源码安装
1)安装依赖
yum -y install gcc openssl-devel libnfnetlink-devel
2)下载源码
wget https://www.keepalived.org/software/keepalived-2.2.7.tar.gz
3)解压
tar -zxvf keepalived-2.2.7.tar.gz -C /usr/src
4)编译安装
cd /usr/src/keepalived-2.2.7/
./configure && make -j 4 && make install
3. 程序环境:
主配置文件:/etc/keepalived/keepalived.conf
主程序文件:/usr/sbin/keepalived
Unit File:
• /usr/lib/systemd/system/keepalived.service (CentOS)
• /lib/systemd/system/keepalived.service (Ubuntu)
Unit File的环境配置文件:
• /etc/sysconfig/keepalived
4.配置文件组件部分:
Global definitions
VRRP instance(s):即一个个的vrrp虚拟路由器
Virtual server(s):ipvs集群的vs和rs
配置虚拟路由器:
vrrp_instance <STRING> {
....
}
配置参数:
state MASTER|BACKUP: #当前节点在此虚拟路由器上的初始状态,状态为MASTER或者BACKUP
interface IFACE_NAME: #绑定为当前虚拟路由器使用的物理接口 ens32,eth0,bond0,br0
virtual_router_id VRID: #当前虚拟路由器惟一标识,范围是0-255
priority 100: #当前物理节点在此虚拟路由器中的优先级;范围1-254
advert_int 1: #vrrp通告的时间间隔,默认1s
authentication { #认证机制
auth_type AH|PASS
auth_pass <PASSWORD> #仅前8位有效
}
virtual_ipaddress { #虚拟IP
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2:1
}
track_interface { #配置监控网络接口,一旦出现故障,则转为FAULT状态实现地址转移
eth0
eth1
…
}
5.组播配置示例
global_defs { notification_email { root@localhost #keepalived 发生故障切换时邮件发送的对象,可以按行区分写多个 } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id ha1.example.com vrrp_skip_check_adv_addr #所有报文都检查比较消耗性能,此配置为如果收到的报文和上一个报文是同一个路由器则跳过检查报文中的源地址 vrrp_strict #严格遵守VRRP协议,不允许状况:1,没有VIP地址,2.配置了单播邻居,3.在VRRP版本2中有IPv6地址. vrrp_garp_interval 0 #ARP报文发送延迟 vrrp_gna_interval 0 #消息发送延迟 vrrp_mcast_group4 224.0.0.18 #默认组播IP地址,224.0.0.0到239.255.255.255 #vrrp_iptables #建议添加,禁止生成iptables }
# iptables -D INPUT -s 0.0.0.0/0 -d 192.168.7.248 -j DROP #yum安装会自动生成防火墙策略,可以删除或禁止生成
vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 80 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111qwer } virtual_ipaddress { 192.168.7.248 dev eth0 label eth0:0 } }
总结非抢占与抢占延迟
-
- 两个keepalived服务器必须同时工作在BACKUP模式下
- 关闭vrrp_strict
- nopreempt #直接不抢占
- preempt_delay 60s #延迟多少秒后抢占
6. 单播配置及示例
unicast_src_ip #指定单播的源IP
unicast_peer { #指定单播的对方IP
目标主机IP
}
[root@s2 ~]# tcpdump -i eth0 host -nn 172.18.200.101 and host 172.18.200.102 #观察vrrp通告信息
Keepalivde 双主配置
两个或以上VIP分别运行在不同的keepalived服务器,以实现服务器并行提供web访问的目的,提高服务器资源利用率。高可用负载均衡
实现方式:两个maste互为主备,即增加一个虚拟路由器,注意优先级

7. Keepalived通知配置
notify_master <STRING>|<QUOTED-STRING>: 当前节点成为主节点时触发的脚本 notify_backup <STRING>|<QUOTED-STRING>: 当前节点转为备节点时触发的脚本 notify_fault <STRING>|<QUOTED-STRING>: 当前节点转为“失败”状态时触发的脚本 notify <STRING>|<QUOTED-STRING>: 通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知
定义通知脚本:
[root@localhost keepalived]# cat /etc/keepalived/notify.sh #!/bin/bash contact='xxxxxx@qq.com' notify() { mailsubject="$(hostname) to be $1, vip 转移" 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
脚本的调用方法:

3)通知验证
停止keepalived服务,验证IP 切换后是否收到通知邮件
8. KeepAlived与IPVS
virtual server (虚拟服务)的定义:
virtual_server IP port #定义虚拟主机IP地址及其端口 【常用此方式】
virtual_server fwmark int #ipvs的防火墙打标,实现基于防火墙的负载均衡集群
virtual_server group string #将多个虚拟服务器定义成组,将组定义成虚拟服务
delay_loop <INT>:检查后端服务器的时间间隔 lb_algo rr|wrr|lc|wlc|lblc|sh|dh:定义调度方法 lb_kind NAT|DR|TUN:集群的类型 persistence_timeout <INT>:持久连接时长 protocol TCP|UDP|SCTP:指定服务协议 sorry_server <IPADDR> <PORT>:所有RS故障时,备用服务器地址 real_server <IPADDR> <PORT> { weight <INT> RS权重 notify_up <STRING>|<QUOTED-STRING> RS上线通知脚本 notify_down <STRING>|<QUOTED-STRING> RS下线通知脚本 HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHEC K { ... }:定义当前主机的健康状态检测方法 }
HTTP_GET|SSL_GET:应用层检测 HTTP_GET|SSL_GET { url { path <URL_PATH>:定义要监控的URL status_code <INT>:判断上述检测机制为健康状态的响应码 } connect_timeout <INTEGER>:客户端请求的超时时长, 等于haproxy的timeout server nb_get_retry <INT>:重试次数 delay_before_retry <INT>:重试之前的延迟时长 connect_ip <IP ADDRESS>:向当前RS哪个IP地址发起健康状态检测请求 connect_port <PORT>:向当前RS的哪个PORT发起健康状态检测请求 bindto <IP ADDRESS>:发出健康状态检测请求时使用的源地址 bind_port <PORT>:发出健康状态检测请求时使用的源端口 }
传输层检测 TCP_CHECK TCP_CHECK { connect_ip <IP ADDRESS>:向当前RS的哪个IP地址发起健康状态检测请求 connect_port <PORT>:向当前RS的哪个PORT发起健康状态检测请求 bindto <IP ADDRESS>:发出健康状态检测请求时使用的源地址 bind_port <PORT>:发出健康状态检测请求时使用的源端口 connect_timeout <INTEGER>:客户端请求的超时时长, 等于haproxy的timeout server }
实现LVS-DR模式
virtual_server 172.18.200.248 80 { #VIP地址 delay_loop 6 lb_algo wrr lb_kind DR #persistence_timeout 120 #会话保持时间 protocol TCP sorry_server 172.18.200.105 80 real_server 172.18.200.103 80 { weight 1 TCP_CHECK { connect_timeout 5 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 172.18.200.104 80 { weight 1 TCP_CHECK { connect_timeout 5 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
在后端服务器上
1)准备web服务器并使用脚本绑定VIP至web服务器lo网卡,并配置arp忽略
2)执行脚本,查看VIP地址已配置好
3)测试web访问
#while true;do curl http://172.31.7.188 && sleep 1;done
#yum install -y ipvsadm
#ipvsadm -Ln #查看ipvs规则
real_server http监测
real_server 192.168.7.103 80 { weight 1 HTTP_GET { url { path /index.html status_code 200 } } connect_timeout 5 nb_get_retry 3 delay_before_retry 3 }
实现keepalived+lvs高可用思路
#在节点1上
vim /etc/keepalived/keepalived.conf
include /etc/keepalived/conf/*.conf #最后一行加上此内容
cp /etc/keepalived/conf/n46.conf /etc/keepalived/conf/n46_1.conf #增加一台虚拟主机
vim /etc/keepalived/conf/n46_1.conf
virtual_server 172.31.7.189 80 { #修改lvs的VIP地址即可
#拷贝节点1的配置目录到节点2上
9. VRRP Script
1)配置参数
keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整
vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值进行下一步操作,脚本可被多个实例调用。
track_script:调用vrrp_script定义的脚本去监控资源,定义在实例之内,调用事先定义的vrrp_script
分两步:(1) 先定义一个脚本;(2) 调用此脚本 vrrp_script <SCRIPT_NAME> { script <STRING>|<QUOTED-STRING> OPTIONS } track_script { SCRIPT_NAME_1 SCRIPT_NAME_2 }
vrrp_script <SCRIPT_NAME> { #定义一个检测脚本,在global_defs 之外配置 script <STRING>|<QUOTED-STRING> # shell命令或脚本路径 interval <INTEGER> # 间隔时间,单位为秒,默认1秒 timeout <INTEGER> # 超时时间 weight <INTEGER:-254..254> # 权重,监测失败后会执行权重相加,权重可以为负数即相加后降低本机权重 fall <INTEGER> #脚本几次失败转换为失败 rise <INTEGER> # 脚本连续监测成功后,把服务器从失败标记为成功的次数 user USERNAME [GROUPNAME] # 执行监测的用户或组 init_fail # 设置默认标记为失败状态,监测成功之后再转换为成功状态 }
2)基于第三方仲裁设备,配置示例:
vrrp_script chk_down { #基于第三方仲裁设备 script "/bin/bash -c '[[ -f /etc/keepalived/down ]]' && exit 7 || exit 0" interval 1 weight -80 fall 3 rise 5 timeout 2 } vrrp_instance VI_1 { #引用配置在要管理的虚拟路由上 … track_script { chk_down } }
# touch /etc/keepalived/down #当存在此仲裁设备时发生故障迁移,
适用场景:在backup服务器探测文件是否存在,当master运行正常的时候没有此文件,当master异常的时候生成此文件,然后将backup服务器的优先级设置高于master,从而将VIP接管到backup服务器。
vrrp_script chk_down { script “/bin/bash -c ‘[[ -f /etc/keepalived/device/down ]]’ && exit 0 || exit 7“ #成功退出为0 interval 1 weight +80 fall 3 rise 5 timeout 2 }
3)高可用HAProxy
vrrp_script chk_haproxy { script "/etc/keepalived/chk_haproxy.sh" interval 1 weight -80 fall 3 rise 5 timeout 2 } track_script { chk_haproxy } [root@s1 ~]# yum install psmisc -y [root@s1 ~]# cat /etc/keepalived/chk_haproxy.sh #!/bin/bash /usr/bin/killall -0 haproxy [root@s1 ~]# chmod a+x /etc/keepalived/chk_haproxy.sh
4)高可用Nginx
vrrp_script chk_nginx { script "/etc/keepalived/chk_nginx.sh" interval 1 weight -80 fall 3 rise 5 timeout 2 } track_script { chk_haproxy } [root@s1 ~]# yum install psmisc -y [root@s1 ~]# cat /etc/keepalived/chk_nginx.sh #!/bin/bash /usr/bin/killall -0 nginx [root@s1 ~]# chmod a+x /etc/keepalived/chk_nginx.sh
负载均衡监测脚本思路:
1)可使用curl http://
2)可使用mysql sql 语句探测
3)0 信号,不发送实际信号,只是用来错误检查
killall -0 bc #检查bc是否运行正常
echo $? #是否为0判断上面程序是否正常
10. 思考练习
• keepalived 高可用性IPVS集群,IPVS集群提供php,如phpwind
• Keepalived 双主Nginx或者HAProxy
• vrrp_script 高可用性Nginx
• 1、编译安装keepalived。
• 2、实现keepalived(20+ vip)+nginx 双主高可用。
• 3、实现keepalived(60+ vip)+haproxy 三服务器高可用。
• 4、实现keepalived(100+ vip)+LVS高可用、real server状态监测及规则管理。
HAProxy+keepalived
• 1.编译安装HAProxy较新 LTS版本.,选择编译安装keepalived。
• 2.开启HAProxy多进程,进程数与CPU核心数保持一致并实现HAProxy进程绑定。
• 3.因业务较多避免配置文件误操作,需要按每业务一个配置文件并统一保存至/etc/haproxy/conf 目录中。 -f /etc/haproxy/conf
• 4.实现keepalived include导入配置文件功能,使用LVS-DR模型代理后端Nginxweb服务器。
• 5.基于ACL实现单IP多域名负载功能(适用于企业较少公网IP多域名场景)。
• 6.实现MySQL主从复制,并通过HAProxy对MySQL进行反向代理。
• 7.最终完成HAProxy+Nginx+Tomcat+ Redis,并实现session会话保持统一保存到Redis。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix