文章目录
keepalived简介
keepalived基于VRRP协议的软件实现,原生设计目的为了高可用 ipvs服务
ipvs,IP虚拟服务器(IP Virtual Server,简写为IPVS)。是运行在LVS下的提供负载均衡功能的一种技术。
keepalived的功能:
-
基于vrrp协议完成地址流动
-
为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
-
为ipvs集群的各RS(后端的Real Server)做健康状态检测
-
基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务
keepalived部署
以上述拓扑为例进行部署和后续知识点执行
角色 | ip | vip |
---|---|---|
KA1 | 192.168.84.10 | 192.168.84.100 |
KA2 | 192.168.84.20 | 192.168.84.100 |
RS1 | 192.168.84.110 | - |
RS2 | 192.168.84.120 | - |
1、关闭防火墙、selinux
2、RS1和RS2配置web服务方便后续成果展示
3、KA1和KA2配置keepalived
1、下载keepalived
yum install -y keepalived
2、启动
systemctl enable keepalived --now
systemctl start keepalived
keepalived基础设置
主配置文件修改
[root@la1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
XXXXXXXXXX@qq.com #keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区分写多个
}
notification_email_from keepalived@KA1.abc.org #发邮件的地址
smtp_server 127.0.0.1 #邮件服务器地址
smtp_connect_timeout 30 #邮件服务器连接timeout
router_id KA1.XXXX.org #每个keepalived主机唯一标识
#建议使用当前主机名,但多节点重名不影响
vrrp_skip_check_adv_addr #对所有通告报文都检查,会比较消耗性能
#启用此配置后,如果收到的通告报文和上一个报文是同一 个路由器,则跳过检查,默认值为全检查
vrrp_strict #严格遵循vrrp协议
#启用此项后以下状况将无法启动服务:
#1.无VIP地址
#2.配置了单播邻居
#3.在VRRP版本2中有IPv6地址
#建议不加此项配置
vrrp_garp_interval 0 #报文发送延迟,0表示不延迟
vrrp_gna_interval 0 #消息发送延迟
vrrp_mcast_group4 224.0.0.18 #指定组播IP地址范围:
}
vrrp_instance VI_1 {
state MASTER
interface eth0 #绑定为当前虚拟路由器使用的物理接口,如:eth0,可以和VIP不在一个网卡
virtual_router_id 51 #每个虚拟路由器惟一标识,范围:0-255,每个虚拟路由器此值必须唯一否则服务无法启动,同属一个虚拟路由器的多个keepalived节点必须相同,务必要确认在同一网络中此值必须唯一
priority 100 #当前物理节点在此虚拟路由器的优先级,范围:1-254
#值越大优先级越高,每个keepalived主机节点此值不同
advert_int 1 #vrrp通告的时间间隔,默认1s
authentication { #认证机制
auth_type AH|PASS #AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)示例:
uth_pass 1111 #预共享密钥,仅前8位有效
#同一个虚拟路由器的多个keepalived节点必须一样
}
virtual_ipaddress { #虚拟IP,生产环境可能指定上百个IP地址
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
192.168.84.128.100 #指定VIP,不指定网卡,默认为eth0,注意:不指定/prefix,默认32
172.25.254.102/24 dev eth2 label eth2:1
}
}
KA1设置:
! Configuration File for keepalived
global_defs {
#vrrp_strict
vrrp_mcast_group4 224.0.0.18 #指定组播IP地址范围:
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 100
priority 100
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
}
KA2设置
! Configuration File for keepalived
global_defs {
#vrrp_strict
vrrp_mcast_group4 224.0.0.18 #指定组播IP地址范围:
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 100
priority 60 #降低优先级
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
}
测试:
[root@la1 ~]# 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
18:18:10.661295 IP 192.168.84.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
18:18:11.662912 IP 192.168.84.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
独立子配置文件实现
注:实现独立子配置文件,需将上述vrrp_instance VI_1 内容注释或删除
命令格式:
include /path/file
具体操作:
1、主配置文件
include /etc/keepalived/conf.d/*.conf
2、设立子配置文件目录和内容
[root@la1 ~]# mkdir -p /etc/keepalived/conf.d
[root@la1 ~]# touch /etc/keepalived/conf.d/192.168.84.100.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 {
192.168.84.100/24 dev eth0 label eth0:1
}
}
3、重启服务测试
[root@la1 ~]# systemctl restart keepalived.service
实现日志分离
1、keepalived配置文件中设置日志类型
[root@la1 ~]# vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 6"
2、日志配置文件中添加
[root@la1 ~]# vim /etc/rsyslog.conf
local6.* /var/log/keepalived.log
3、重启服务
[root@la1 ~]# systemctl restart keepalived.service
[root@la1 ~]# systemctl restart rsyslog.service
[root@la1 ~]# ls -l /var/log/keepalived.log
-rw------- 1 root root 3906 8月 12 18:28 /var/log/keepalived.log
企业应用实例
抢占式与非抢占式
系统默认为抢占式
抢占式:例如LA1为主,但LA1突然down掉,此时LA2作为备份代替主,当LA1好了之后,VIP又回到LA1上
非抢占式:同上述,LA1活了之后,IPV还在LA2上,LA1变相的成为了LA2的备份
nopreempt #非抢占模式
注:若为非抢占模式则LA1、LA2都需为BACKUP
preempt_delay # #指定抢占延迟时间为#s,默认延迟300s
抢占式
将LA1关掉
[root@la1 ~]# systemctl stop keepalived.service
打开LA1
[root@la1 ~]# systemctl start keepalived.service
非抢占式
LA1配置文件
vrrp_instance VI_1 {
state BACKUP #更改模式
nopreempt #非抢占模式
LA2配置文件
vrrp_instance VI_1 {
state BACKUP
nopreempt
VIP单波配置
#在所有节点vrrp_instance语句块中设置对方主机的IP,建议设置为专用于对应心跳线网络的地址,而非使用业务网络
unicast_src_ip <IPADDR> #指定发送单播的源IP
unicast_peer {
<IPADDR> #指定接收单播的对方目标主机IP
......
}
LA1、LA2操作相同,只需调换源IP和备份机IP地址位置
消息通知脚本配置
1、节点配置脚本
[root@la1 ~]# vim /etc/keepalived/mail.sh
#!/bin/bash
mail_dest='自身qq号'
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 in
master)
mail_send master
;;
backup)
mail_send backup
;;
fault)
mail_send fault
;;
*)
exit 1
;;
esac
2、给脚本执行权限
chmod +x /etc/keepalived/mail.sh
3、配置主文件(脚本调用)
notify_master "/etc/keepalived/mail.sh master"
notify_backup "/etc/keepalived/mail.sh backup"
notify_fault "/etc/keepalived/mail.sh fault"
3、邮件配置
[root@la2 ~]# dnf install mailx -y
[root@la1 ~]# vim /etc/mail.rc
set from=XXXXXXXX@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=XXXXXXX@qq.com
set smtp-auth-password=QQ的smtp授权码
set smtp-auth=login
set ssl-verify=ignore
实现IPVS高可用
keepalived+lvs实现
原理:
Keepalived 主要用于监控服务器的状态,并通过虚拟 IP 地址(VIP)实现故障转移。LVS 负责进行负载均衡。当主 LVS 服务器出现故障时,Keepalived 会检测到并将 VIP 切换到备用的 LVS 服务器上,从而实现高可用性。
步骤:
1. 安装和配置 LVS :
- 安装 LVS 相关软件包。
- 配置 LVS 的负载均衡策略,例如选择 NAT、DR 或 TUN 模式,并设置后端服务器列表。
2. 安装 Keepalived :
- 在主、备 LVS 服务器上安装 Keepalived 软件包。
3. 配置 Keepalived :
- 配置主、备服务器的优先级,通常主服务器的优先级高于备用服务器。
- 定义虚拟 IP 地址(VIP),这是客户端实际访问的 IP 地址。
- 设置健康检查机制,例如通过 Ping 或者检测特定端口来确定 LVS 服务是否正常。
4. 启动服务 :
- 启动 LVS 和 Keepalived 服务。
通过这样的组合配置,可以有效地提高 LVS 负载均衡服务的可用性和可靠性,保障业务的连续性。
KA1配置keepalived
[root@ka1 ~]# vim /etc/keepalived/conf.d/192.168.84.100.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 {
192.168.84.100/24 dev eth0 label eth0:1
}
}
virtual_server 192.168.84.100 80 {
delay_loop 6
lb_algo wrr #加权轮询模式
lb_kind DR #DR模式(直连)
persistence_timeout 0
protocol TCP
real_server 192.168.84.110 80 {
weight 1
HTTP_GET { #指定服务协议为HTTP
url {
path /
status_code 200 #判断健康状态
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.84.120 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
KA2配置
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 {
192.168.84.100/24 dev eth0 label eth0:1
}
}
virtual_server 192.168.84.100 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
persistence_timeout 0
protocol TCP
real_server 192.168.84.110 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.84.120 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
keepalived可以动态检测后端真实服务器的状态,当主服务器不可用时会将VIP转到备用服务器上
keepalives+haproxy实现
1、安装haproxy
2、开启内核参数(使得IP不在本主机也能监听)
[root@ka1 ~]# vim /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1
[root@ka1 ~]# sysctl --system
3、编辑haproxy配置文件
listen webserver
bind 192.168.84.200:80
mode http
balance roundrobin
server web1 192.168.84.110:80 check inter 3 fall 2 rise 4
server web2 192.168.84.120:80 check inter 3 fall 2 rise 4
4、编写检测haproxy状态shell脚本
#!/bin/bash
[ ! -f killall -0 haproxy ]
5、编辑keepalived配置文件
vrrp_script check_haproxy {
script "/etc/keepalived/scripts/haproxy.sh" #脚本位置
interval 1
weight -30
fall 2
rise 2
timeout 2
}
vrrp_instance web {
track_script {
check_haproxy
}
}
.