当前位置: 首页 > news >正文

Keepalived 企业应用示例

目录

1 抢占模式和非抢占模式

1.1 非抢占模式 nopreempt

1.2 抢占延迟模式 preempt_delay

 1.3 VIP单播配置

1.4 Keepalived 通知脚本配置 

1.5 实现 master/master 的 Keepalived 双主架构

1.6 实现IPVS的高可用性

1.6.1 IPVS相关配置

1.6.1.1 virtual server (虚拟服务器)的定义格式

1.6.1.2 虚拟服务器配置

1.6.1.3 应用层监测 

 1.6.1.4 TCP监测

1.6.2 案例


环境继承我上一篇文章做完所有配置的环境(上一篇文章的链接:http://t.csdnimg.cn/sj07z)

1 抢占模式和非抢占模式

1.1 非抢占模式 nopreempt

默认为抢占模式 preempt ,即当高优先级的主机恢复在线后,会抢占低先级的主机的 master 角色, 这样会使vip 在 KA 主机中来回漂移,造成网络抖动,建议设置为非抢占模式nopreempt ,即高优先级主机恢复后,并不会抢占低优先级主机的 master 角色 ,非抢占模块下, 如果原主机 down 机 , VIP 迁移至的新主机 , 后续也发生 down 时 , 仍会将 VIP 迁移回原主机
注意:要关闭 VIP 抢占,必须将各 keepalived 服务器 state 配置为 BACKUP

ka1:

ka2:

修改完后重启一下服务:

systemctl restart keepalived.service

查看一下:

此时VIP在ka2上,我们停止服务再重启一下:

[root@ka2 ~]# systemctl stop keepalived.service 
[root@ka2 ~]# systemctl restart keepalived.service

再次查看:

可以看出 ,在拥有VIP的服务器宕机后,VIP才会被其他服务器接管

1.2 抢占延迟模式 preempt_delay

抢占延迟模式,即优先级高的主机恢复后,不会立即抢回 VIP ,而是延迟一段时间(默认 300s )再抢回 VIP
preempt_delay # # 指定抢占延迟时间为 #s ,默认延迟 300s
注意:需要各 keepalived 服务器 state 为 BACKUP, 并且不要启用 vrrp_strict

 ka1:

ka2:

修改完后重启一下服务:

systemctl restart keepalived.service

查看一下,此时VIP在ka1上

我们关闭ka1的服务

[root@ka1 ~]# systemctl stop keepalived.service

此时VIP在ka2上:

我们再次打开ka1的服务:

[root@ka1 ~]# systemctl restart keepalived.service

等五秒钟后查看,发现VIP回来了:

 1.3 VIP单播配置

默认 keepalived 主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量

注意:启用 vrrp_strict 时,不能启用单播

 ka1:

ka2:

别忘了两边重启服务

systemctl restart keepalived.service

测试:抓包查看单播效果

[root@ka1 ~]# tcpdump -i eth0 -nn src host 172.25.254.10 and dst 172.25.254.20

有vip的keepalived主机才看得到抓包效果 ,不然会如下图所示:

1.4 Keepalived 通知脚本配置 

当 keepalived 的状态变化时,可以自动触发脚本的执行,比如:发邮件通知用户
默认以用户 keepalived_script 身份执行脚本
如果此用户不存在,以 root 执行脚本可以用下面指令指定脚本执行用户的身份
通知脚本类型

  • 当前节点成为主节点时触发的脚本:notify_master <STRING>|<QUOTED-STRING>
  • 当前节点转为备节点时触发的脚本:notify_backup <STRING>|<QUOTED-STRING>
  • 当前节点转为“失败”状态时触发的脚本 :notify_fault <STRING>|<QUOTED-STRING>
  • 通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知:notify <STRING>|<QUOTED-STRING>
  • 当停止VRRP时触发的脚本 :notify_stop <STRING>|<QUOTED-STRING>

 

# ka1配置
# qq邮箱配置
[root@ka1 ~]# vim /etc/mail.rc 
其他的不要动,在最后添加:
set from=1904650938@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=1904650938@qq.com
set smtp-auth-password=hrlaubtyckxfcggh
set smtp-auth=login
set ssl-verify=ignore# 写脚本
[root@ka1 ~]# vim /etc/keepalived/mail.sh
#!/bin/bash
mail_dest='1904650938@qq.com'
mail_send()
{mail_subj="$HOSTNAME to be $1 vip 转移"mail_mess="`date +%F\ %T`: vrrp 转移,$HOSTNAME 变为 $1"echo "$mail_mess" | mail -s "$mail_subj" $mail_dest
}
case $1 inmaster)mail_send master;;backup)mail_send backup;;fault)mail_send fault;;*);;
esac[root@ka1 ~]# chmod +x /etc/keepalived/mail.sh
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 100priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}unicast_src_ip 172.25.254.10unicast_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"
}
[root@ka1 ~]# systemctl restart keepalived.service# ka2做同样的操作

测试:两边重启服务

systemctl restart keepalived.service

1.5 实现 master/master 的 Keepalived 双主架构

master/slave 的单主架构,同一时间只有一个 Keepalived 对外提供服务,此主机繁忙,而另一台主机却很空闲,利用率低下,可以使用master/master 的双主架构,解决此问题。
master/master 的双主架构:
即将两个或以上 VIP 分别运行在不同的 keepalived 服务器,以实现服务器并行提供 web 访问的目的,提高服务器资源利用率

# ka1配置
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {state MASKTERinterface eth0virtual_router_id 100priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}unicast_src_ip 172.25.254.10unicast_peer {172.25.254.20}
}vrrp_instance VI_2 {state BACKUPinterface eth0virtual_router_id 200priority 80advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.200/24 dev eth0 label eth0:2}unicast_src_ip 172.25.254.10unicast_peer {172.25.254.20}
}# ka2配置
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 100priority 80advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}unicast_src_ip 172.25.254.20unicast_peer {172.25.254.10}
}vrrp_instance VI_2 {state MASTERinterface eth0virtual_router_id 200priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.200/24 dev eth0 label eth0:2}unicast_src_ip 172.25.254.20unicast_peer {172.25.254.10}
}

 查看VIP:

1.6 实现IPVS的高可用性
1.6.1 IPVS相关配置
1.6.1.1 virtual server (虚拟服务器)的定义格式

virtual_server IP port # 定义虚拟主机 IP 地址及其端口
virtual_server fwmark int #ipvs 的防火墙打标,实现基于防火墙的负载均衡集群
virtual_server group string # 使用虚拟服务器组

1.6.1.2 虚拟服务器配置

virtual_server IP port {                         #VIP和PORT
delay_loop <INT>                                 #检查后端服务器的时间间隔
lb_algo rr|wrr|lc|wlc|lblc|sh|dh                 #定义调度方法
lb_kind NAT|DR|TUN                         #集群的类型,注意要大写
persistence_timeout <INT>                 #持久连接时长
protocol TCP|UDP|SCTP                 #指定服务协议, 一般为 TCP
sorry_server <IPADDR> <PORT>         #所有 RS 故障时,备用服务器地址
real_server <IPADDR> <PORT> {         #RS的 IP 和 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_CHECK { ... } # 定义当前主机健康状态检测方法
 }
}
# 注意 : 括号必须分行写 , 两个括号写在同一行 , 如 : }} 会出错

1.6.1.3 应用层监测 

应用层检测:HTTP_GET|SSL_GET

HTTP_GET|SSL_GET {
url {
path <URL_PATH>                 #定义要监控的URL
status_code <INT>                 #判断上述检测机制为健康状态的响应码,一般为 200
}
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>                 #向当前RS 发出健康状态检测请求时使用的源地址
bind_port <PORT>                         #向当前RS发出健康状态检测请求时使用的源端口
}

 1.6.1.4 TCP监测

传输层检测: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
}

1.6.2 案例

实现单主的 LVS-DR 模式

# 准备两台后端webserver主机
# webserver1
[root@webserver1 ~]# yum install httpd -y
[root@webserver1 ~]# echo 172.25.254.110 > /var/www/html/index.html
[root@webserver1 ~]# systemctl enable --now httpd[root@webserver1 ~]# ip addr add 172.25.254.40/32 dev lo
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce# webserver2
[root@webserver2 ~]# yum install httpd -y
[root@webserver2 ~]# echo 172.25.254.120 > /var/www/html/index.html
[root@webserver2 ~]# systemctl enable --now httpd[root@webserver2 ~]# ip addr add 172.25.254.40/32 dev lo
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce# client测试
[root@client ~]# curl 172.25.254.110
172.25.254.110
[root@client ~]# curl 172.25.254.120
172.25.254.120

keepalived配置

# ka1
[root@ka1 ~]# yum install ipvsadm -y
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
........
#include "/etc/keepalived/conf.d/*.conf"virtual_server 172.25.254.40 80 {delay_loop 6lb_algo wrrlb_kind DRprotocol TCPreal_server 172.25.254.110 80 {weight 1 HTTP_GET {url {path /status_code 200}connect_timeout 3nb_get_retry 2delay_before_retry 2}     }real_server 172.25.254.120 80 {weight 1 HTTP_GET {url {path /status_code 200}connect_timeout 3nb_get_retry 2delay_before_retry 2}}
}
[root@ka1 ~]# systemctl restart keepalived.service
# 查看lvs策略
[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.40:80 wrr-> 172.25.254.110:80             Route   1      0          0         -> 172.25.254.120:80             Route   1      0          0         
TCP  10.10.10.2:1358 rr persistent 50-> 192.168.200.2:1358           Masq    1      0          0         -> 192.168.200.3:1358           Masq    1      0          0         
TCP  10.10.10.3:1358 rr persistent 50-> 192.168.200.4:1358           Masq    1      0          0         -> 192.168.200.5:1358           Masq    1      0          0   # ka2
[root@ka2 ~]# yum install ipvsadm -y
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
# 与ka1大差不差
........
virtual_server 172.25.254.40 80 {delay_loop 6lb_algo wrrlb_kind DRprotocol TCPreal_server 172.25.254.110 80 {weight 1 HTTP_GET {url {path /status_code 200}connect_timeout 3nb_get_retry 2delay_before_retry 2}}real_server 172.25.254.120 80 {weight 1HTTP_GET {url {path /status_code 200}connect_timeout 3nb_get_retry 2delay_before_retry 2}}
}
[root@ka2 ~]# systemctl restart keepalived.service

测试:

[root@client ~]# for i in {1..6};do curl 172.25.254.40;done
webserver2 - 172.25.254.120
webserver1 - 172.25.254.110
webserver2 - 172.25.254.120
webserver1 - 172.25.254.110
webserver2 - 172.25.254.120
webserver1 - 172.25.254.110# 模拟第一台webserver1故障,自动切换至webserver2
[root@webserver1 ~]# systemctl stop httpd[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.40:80 wrr-> 172.25.254.120:80             Route   1      0          3         
TCP  10.10.10.2:1358 rr persistent 50-> 192.168.200.200:1358         Masq    1      0          0         
TCP  10.10.10.3:1358 rr persistent 50[root@client ~]# for i in {1..6};do curl 172.25.254.100;done
webserver2 - 172.25.254.120
webserver2 - 172.25.254.120
webserver2 - 172.25.254.120
webserver2 - 172.25.254.120
webserver2 - 172.25.254.120
webserver2 - 172.25.254.120# 模拟ka1故障,自动切换至ka2
[root@ka1 ~]# systemctl stop keepalived.service
[root@ka2 ~]# 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.40:80 wrr-> 172.25.254.120:80             Route   1      0          0         
TCP  10.10.10.2:1358 rr persistent 50-> 192.168.200.200:1358         Masq    1      0          0         
TCP  10.10.10.3:1358 rr persistent 50

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • tcpdump的使用
  • 思二勋:web3.0是打造应对复杂市场敏捷组织的关键
  • SpringBoot依赖之Spring Data Redis 一 Hash类型
  • VirtualBox安装Oracle Linux 7.9全流程
  • 【秋招笔试】8.17京东秋招第二场(后端岗)-三语言题解
  • 什么是OpenTiny?
  • 使用Nexus搭建Maven私服仓库
  • C++之STL容器详解(包含十种常用容器)
  • 给既有exe程序添加一机一码验证
  • 共享内存、消息队列、信号量
  • GPT-SoVITS
  • EPIC Institute of Technology Round August 2024 (Div. 1 + Div. 2)
  • 大模型日报 2024-08-16
  • vim中跳转头文件
  • JS DOM、点击事件
  • classpath对获取配置文件的影响
  • HTTP中GET与POST的区别 99%的错误认识
  • Javascript弹出层-初探
  • LeetCode29.两数相除 JavaScript
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • python docx文档转html页面
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • storm drpc实例
  • SwizzleMethod 黑魔法
  • webgl (原生)基础入门指南【一】
  • 将 Measurements 和 Units 应用到物理学
  • 学习HTTP相关知识笔记
  • 《码出高效》学习笔记与书中错误记录
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (PySpark)RDD实验实战——求商品销量排行
  • (阿里云在线播放)基于SpringBoot+Vue前后端分离的在线教育平台项目
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (九)One-Wire总线-DS18B20
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (算法)Game
  • (算法)求1到1亿间的质数或素数
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (转)树状数组
  • .bat批处理(一):@echo off
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .Net面试题4
  • .NET委托:一个关于C#的睡前故事
  • .NET中 MVC 工厂模式浅析
  • @Autowired自动装配
  • [001-03-007].第07节:Redis中的事务
  • [20170705]diff比较执行结果的内容.txt
  • [2019红帽杯]Snake
  • [acm算法学习] 后缀数组SA
  • [AIGC] Java 和 Kotlin 的区别