keepalived03-keepalived示例
- keepalived,原生设计的目的为了高可用ipvs服务。
- 基于vrrp协议完成IP地址飘移。
- 基于ipvs模块生成ipvs规则(在配置文件中预先定义)。
- 检查器根据后端服务器的状态,动态的调整ipvs规则。
- keepalived通过调用接口,可以执行外部脚本,并根据外部脚本的执行状态码,可以动态的调整优先级。(可高可用其他服务,例如nginx等)
1、实现VIP飘移(主备模式)
1、主备模式之主节点(10.1.1.11机器)
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 | ] # vim /apps/keepalived/etc/keepalived/keepalived.conf global_defs { notification_email { root@localhost } notification_email_from keepalived@hengha11 smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id hengha11 vrrp_mcast_group4 224.1.1.1 } vrrp_instance VR_1 { state MASTER priority 100 interface ens33 virtual_router_id 101 advert_int 1 authentication { auth_type PASS auth_pass hh101 } virtual_ipaddress { 10.1.1.99 /24 dev ens33 label ens33:1 } } |
2、主备模式之备节点(10.1.1.12机器)
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 | ] # vim /apps/keepalived/etc/keepalived/keepalived.conf global_defs { notification_email { root@localhost } notification_email_from keepalived@hengha11 smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id hengha12 #节点名称,可以是任意字符串 vrrp_mcast_group4 224.1.1.1 } vrrp_instance VR_1 { state BACKUP #! priority 95 #! interface ens33 virtual_router_id 101 #同一个虚拟路由器的标识要相同 advert_int 1 authentication { auth_type PASS auth_pass hh101 #同一个虚拟路由器的认证密码必须相同 } virtual_ipaddress { 10.1.1.99 /24 dev ens33 label ens33:1 } } |
3、测试VIP飘移
1 2 3 4 5 6 7 8 | #(1)启动备节点,观察VIP(VIP在备节点上) systemctl start keepalived.service #(2)启动主节点,观察VIP(VIP从备节点飘移到了主节点上) systemctl start keepalived.service #(3)停止主节点,观察VIP(VIP从主节点飘移到了备节点上) systemctl stop keepalived.service |
2、双主模型
- 双主模型其实就是在两台机器上同时创建两个虚拟路由器,一个虚拟路由器是主备,一个虚拟路由器是备主。即一个虚拟路由器是A主B备,另一个虚拟路由器是A备B主。
1、第一个节点(10.1.1.11机器)
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 | ] # vim /apps/keepalived/etc/keepalived/keepalived.conf global_defs { notification_email { root@localhost } notification_email_from keepalived@hengha11 smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id hengha11 vrrp_mcast_group4 224.1.1.1 } #对于第一个虚拟路由器,本机是主节点 vrrp_instance VR_1 { state MASTER priority 100 interface ens33 virtual_router_id 101 advert_int 1 authentication { auth_type PASS auth_pass hh101 } virtual_ipaddress { 10.1.1.99 /24 dev ens33 label ens33:1 } } #对于第二个虚拟路由器,本机是备节点 vrrp_instance VR_2 { state BACKUP priority 96 interface ens33 #两个虚拟路由器的VIP可以配置在同一个网络接口上 virtual_router_id 102 #不同的虚拟路由器,virtual_router_id不同 advert_int 1 authentication { auth_type PASS auth_pass hh102 #不同的虚拟路由器,认证的密码不同 } virtual_ipaddress { 10.1.1.100 /24 dev ens33 label ens33:2 #不同的虚拟路由器,VIP不同,别名也不能相同(或者两个VIP都使用辅助IP) } } |
2、第二个节点(10.1.1.12机器)
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 | global_defs { notification_email { root@localhost } notification_email_from keepalived@hengha11 smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id hengha12 vrrp_mcast_group4 224.1.1.1 } #对于第一个虚拟路由器,本机是备节点 vrrp_instance VR_1 { state BACKUP priority 95 interface ens33 virtual_router_id 101 advert_int 1 authentication { auth_type PASS auth_pass hh101 } virtual_ipaddress { 10.1.1.99 /24 dev ens33 label ens33:1 } } #对于第二个虚拟路由器,本机是主节点 vrrp_instance VR_2 { state MASTER priority 100 interface ens33 #两个虚拟路由器的VIP可以配置在同一个网络接口上 virtual_router_id 102 #不同的虚拟路由器,virtual_router_id不同 advert_int 1 authentication { auth_type PASS auth_pass hh102 #不同的虚拟路由器,认证的密码不同 } virtual_ipaddress { 10.1.1.100 /24 dev ens33 label ens33:2 #不同的虚拟路由器,VIP不同,别名也不能相同(或者两个VIP都使用辅助IP) } } |
3、通知脚本
- 通知脚本:在keepalived状态发生变化时要执行的脚本,不但可以进行通知,也可以执行一些其他操作。
- 脚本文件名可以不加引号(如果只有文件名),也可以加引号(如果有参数)。
- 如果指定username,用户组默认为用户所在组。
- 如果未指定username,则默认使用全局的script_user和script_group
1、创建通知脚本
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 | ] # vim /apps/keepalived/notify.sh #!/bin/bash notify(){ if ! [[ -f /apps/keepalived/notify .log ]]; then touch /apps/keepalived/notify .log fi echo "$(date +'%F %T') $(hostname) to be $1" >> /apps/keepalived/notify .log } case $1 in master) notify master ;; backup) notify backup ;; fault) notify fault ;; stop) notify stop ;; *) echo "Usage: $(basename $0) {master | backup | faulty | stop}" exit 1 ;; esac |
- 添加可执行权限
1 | ]# chmod 744 /apps/keepalived/notify.sh |
2、主备模式之主节点(10.1.1.11机器)
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 | ] # vim /apps/keepalived/etc/keepalived/keepalived.conf global_defs { notification_email { root@localhost } notification_email_from keepalived@hengha11 smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id hengha11 vrrp_mcast_group4 224.1.1.1 } vrrp_instance VR_1 { state MASTER priority 100 interface ens33 virtual_router_id 101 advert_int 1 authentication { auth_type PASS auth_pass hh101 } virtual_ipaddress { 10.1.1.99 /24 dev ens33 label ens33:1 } notify_master "/apps/keepalived/notify.sh master" #变为master时,要执行的脚本 notify_backup "/apps/keepalived/notify.sh backup" #变为backup时,要执行的脚本 notify_fault "/apps/keepalived/notify.sh fault" #变为fault(发现网络接口down了就进入fault状态)时,要执行的脚本 notify_stop "/apps/keepalived/notify.sh stop" #VRRP停止(keepalived停止)时,要执行的脚本 } |
3、主备模式之备节点(10.1.1.12机器)
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 | ] # vim /apps/keepalived/etc/keepalived/keepalived.conf global_defs { notification_email { root@localhost } notification_email_from keepalived@hengha11 smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id hengha12 vrrp_mcast_group4 224.1.1.1 } vrrp_instance VR_1 { state BACKUP priority 95 interface ens33 virtual_router_id 101 advert_int 1 authentication { auth_type PASS auth_pass hh101 } virtual_ipaddress { 10.1.1.99 /24 dev ens33 label ens33:1 } notify_master "/apps/keepalived/notify.sh master" #变为master时,要执行的脚本 notify_backup "/apps/keepalived/notify.sh backup" #变为backup时,要执行的脚本 notify_fault "/apps/keepalived/notify.sh fault" #变为fault(发现网络接口down了就进入fault状态)时,要执行的脚本 notify_stop "/apps/keepalived/notify.sh stop" #VRRP停止(keepalived停止)时,要执行的脚本 } |
4、测试
1 2 3 4 5 6 7 8 9 10 11 | #(1)启动10.1.1.12,观察VIP和notify.log文件(tailf /apps/keepalived/notify.log) systemctl start keepalived.service #(2)启动10.1.1.11,观察VIP和notify.log文件 systemctl start keepalived.service #(3)停止10.1.1.11,观察VIP和notify.log文件 systemctl stop keepalived.service #(4)停止10.1.1.12,观察VIP和notify.log文件 systemctl stop keepalived.service |
4、通过ipvs实现负载均衡
- keepalived通过ipvs实现负载均衡:
- 根据后端服务器的健康情况,keepalived可以动态的调整ipvs规则。
- 后端服务可以是任何服务,例如httpd、nginx、FTP等。
4.1、实验架构
- 在10.1.1.11和10.1.1.12上安装LVM_DR模型、keepalived、httpd。
- 在10.1.1.13和10.1.1.14上安装httpd。
4.2、配置RS和DS
4.2.1、配置RS
1、安装httpd,并创建index.html文件
1 2 3 4 5 6 7 8 9 10 | //安装并启动httpd ]# yum install httpd -y ]# systemctl start httpd.service //创建index.html文件,提供后端主机测试页 ]# echo '<h1>RS, 10.1.1.13</h1>' > / var /www/html/index.html ]# echo '<h1>RS, 10.1.1.14</h1>' > / var /www/html/index.html //创建check.html文件,提供后端主机健康状态检查测试页 ]# echo '<h1>check</h1>' > / var /www/html/check.html |
2、限制ARP通告和应答级别
1 2 3 4 5 6 7 | //配置arp的内核参数,抑制arp的通告和应答 ]# cat > /etc/sysctl.conf << EOF net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 EOF //使配置生效 ]# sysctl -p |
3、配置VIP
1 2 3 4 5 6 7 8 9 10 | //将VIP配置到lo:0上 ]# cat > /etc/sysconfig/network-scripts/ifcfg-lo:0 << EOF DEVICE=lo:0 ONBOOT=yes BOOTPROTO= static IPADDR=10.1.1.99 PREFIX=32 EOF //重启网络服务 ]# systemctl restart network.service |
4、在DS上测试两个RS上的httpd服务是否可用
1 2 3 4 | ]# curl 10.1.1.13 <h1>RS, 10.1.1.13</h1> ]# curl 10.1.1.14 <h1>RS, 10.1.1.14</h1> |
4.2.2、配置DS
1、安装httpd,并创建index.html文件
1 2 3 4 5 6 7 | //安装并启动httpd ]# yum install httpd -y ]# systemctl start httpd.service //创建index.html文件,提供sorry测试页 ]# echo '<h1>RS, 10.1.1.13</h1>' > / var /www/html/index.html ]# echo '<h1>RS, 10.1.1.14</h1>' > / var /www/html/index.html |
2、安装keepalivde
- 见前面的安装章节
3、配置keepalived
(1)主节点(10.1.1.11)
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 | ] # vim /apps/keepalived/etc/keepalived/keepalived.conf global_defs { notification_email { root@localhost } notification_email_from keepalived@hengha11 smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id hengha11 vrrp_mcast_group4 224.1.1.1 } vrrp_instance VR_1 { state MASTER priority 100 interface ens33 virtual_router_id 101 advert_int 1 authentication { auth_type PASS auth_pass hh101 } virtual_ipaddress { 10.1.1.99 /24 dev ens33 label ens33:1 } } #定义一个ipvs虚拟服务 virtual_server 10.1.1.99 80 { delay_loop 6 lb_algo rr lb_kind DR #persistence_timeout 50 protocol TCP sorry_server 127.0.0.1 80 real_server 10.1.1.13 80{ #定义第一个后端服务器(RS) weight 1 HTTP_GET { #使用http协议进行健康状态检测 url { path /check .html digest eb77028700d8705cfae778e12fb7d1df } connect_timeout 3 retry 3 delay_before_retry 3 } } real_server 10.1.1.14 80{ #定义第二个后端服务器(RS) weight 1 TCP_CHECK { #使用tcp协议进行健康状态检测 retry 3 delay_before_retry 2 connect_timeout 3 } } } |
(2)备节点(10.1.1.12)
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 | ] # vim /apps/keepalived/etc/keepalived/keepalived.conf global_defs { notification_email { root@localhost } notification_email_from keepalived@hengha11 smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id hengha12 vrrp_mcast_group4 224.1.1.1 } vrrp_instance VR_1 { state BACKUP priority 95 interface ens33 virtual_router_id 101 advert_int 1 authentication { auth_type PASS auth_pass hh101 } virtual_ipaddress { 10.1.1.99 /24 dev ens33 label ens33:1 } } #定义一个ipvs虚拟服务 virtual_server 10.1.1.99 80 { delay_loop 6 lb_algo rr lb_kind DR #persistence_timeout 50 protocol TCP sorry_server 127.0.0.1 80 real_server 10.1.1.13 80{ #定义第一个后端服务器(RS) weight 1 HTTP_GET { #使用http协议进行健康状态检测 url { path /check .html digest eb77028700d8705cfae778e12fb7d1df } connect_timeout 3 retry 3 delay_before_retry 3 } } real_server 10.1.1.14 80{ #定义第二个后端服务器(RS) weight 1 TCP_CHECK { #使用tcp协议进行健康状态检测 retry 3 delay_before_retry 2 connect_timeout 3 } } } |
4、测试
- 启动keepaived后,通过起停后端httpd服务观察ipvs规则。
1 2 3 4 | ]# systemctl stop httpd.service ]# systemctl start httpd.service ]# ipvsadm -l |
5、外部脚本
- keepalived调用外部脚本进行资源监控,并根据监控的结果可以实现优先级的动态调整。进而高可用其他服务,如nginx。
5.1、怎样使用外部脚本
- 要使用外部脚本,有两个步骤:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | //(1)定义外部脚本 vrrp_script <SCRIPT_NAME> { #脚本的路径 script <STRING>|<QUOTED-STRING> #周期性地执行脚本,间隔<interval>秒执行一次。( default : 1 second) interval <INTEGER> #调整优先级的权重(默认:0)。 #负,执行成功不变,执行失败降权。 #正,执行成功加权,执行失败不变。 weight <INTEGER:-253..253> [reverse] #执行脚本连续成功n次,状态从fail转换到ok rise <INTEGER> #执行脚本连续失败n次,状态从ok转换到fail fall <INTEGER> } //(2)调用外部脚本 vrrp_instance <STRING> { track_script { <SCRIPT_NAME> <SCRIPT_NAME> weight <-253..253> [reverse|no_reverse] } } |
5.2、高可用nginx
1、架构图
- keepalived仅提供高可用(即飘移vip)功能。
- 负载均衡(向后端代理)是由nginx实现的。
2、编写脚本
1 2 3 4 5 | ]# vim /apps/keepalived/check_nginx.sh #!/bin/bash killall -0 nginx && exit 0 || exit 1 ]# chmod 645 /apps/keepalived/check_nginx.sh |
3、配置keepalive
- 主节点
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 | ] # vim /apps/keepalived/etc/keepalived/keepalived.conf global_defs { notification_email { root@localhost } notification_email_from keepalived@hengha11 smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id hengha11 vrrp_mcast_group4 224.1.1.1 script_user root enable_script_security } #定义外部脚本 vrrp_script chk { script "/apps/keepalived/check_nginx.sh" interval 2 rise 3 fall 2 weight -6 } vrrp_instance VR_1 { state MASTER priority 100 interface ens33 virtual_router_id 101 advert_int 1 #调用外部脚本 track_script { chk } authentication { auth_type PASS auth_pass hh101 } virtual_ipaddress { 10.1.1.99 /24 dev ens33 label ens33:1 } } |
- 备节点
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 | ] # vim /apps/keepalived/etc/keepalived/keepalived.conf global_defs { notification_email { root@localhost } notification_email_from keepalived@hengha11 smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id hengha12 vrrp_mcast_group4 224.1.1.1 script_user root enable_script_security } #定义外部脚本 vrrp_script chk { script "/apps/keepalived/check_nginx.sh" interval 2 rise 3 fall 2 weight -6 } vrrp_instance VR_1 { state BACKUP priority 95 interface ens33 virtual_router_id 101 advert_int 1 #调用外部脚本 track_script { chk } authentication { auth_type PASS auth_pass hh101 } virtual_ipaddress { 10.1.1.99 /24 dev ens33 label ens33:1 } } |
4、问题
问题1:
- 报错信息:Jul 30 19:55:15 11 Keepalived_vrrp[65006]: WARNING - default user 'keepalived_script' for script execution does not exist - please create.
- 解决,在全局配置块中填写如下两个指令
1 2 | script_user root enable_script_security |
6、使用Keepalived+ipvs实现负载均衡RabbitMQ
- 参见:https://www.cnblogs.com/maiblogs/p/16482831.html
7、使用Keepalived+HAProxy实现负载均衡RabbitMQ
- 参见:https://www.cnblogs.com/maiblogs/p/16482831.html
1 | # # |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?