【全网最详细教程keepalived集群】

一、keepalived简介

vrrp 协议的软件实现,原生设计目的为了高可用 ipvs服务
官网:https://keepalived.org/
功能:

  • 基于vrrp协议完成地址流动
  • 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
  • 为ipvs集群的各RS做健康状态检测
  • 基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务

二、keepalived的环境准备

1、拓扑图
在这里插入图片描述
按照上面,搭建好环境

安装软件:yum install keepalived

配置文件:/etc/keepalived/keepalived.conf
VRRP instance(s): 定义每个vrrp虚拟路由器
Virtual server(s): LVS集群的VS和RS

查看帮助手册:man keepalived.conf
在这里插入图片描述

三、keepalived的配置

1、配置虚拟路由器

在keepalive1主机上:
在这里插入图片描述
keepalived2配置:
在这里插入图片描述
用ifconfig命令,在主服务器上:
在这里插入图片描述

可以抓包测试以下他们之间的通信

[root@keepalived1 ~]# yum install tcpdump
[root@keepalived1 ~]# tcpdump -i ens33 -nn host 224.0.0.18
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
20:58:45.323341 IP 172.25.254.20 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20

2、启用keepalived的日志功能

[root@keepalived1 ~]# grep -v ^# /etc/sysconfig/keepalived 
KEEPALIVED_OPTIONS="-D -S 6"
[root@keepalived1 ~]# grep local6 /etc/rsyslog.conf 
local6.*						/var/log/keepalived.log
#重启两个服务
[root@keepalived1 ~]# systemctl restart keepalived.service rsyslog.service
#出现日志文件,说明打开了日志文件,另一台主机也同样可以开启
[root@keepalived1 ~]# ll /var/log/keepalived.log 
-rw-------. 1 root root 3452 Aug 14 21:05 /var/log/keepalived.log

2、实现独立的子配置文件

如果keepalived的配置文件内容过多,vip的配置多的话,就可以搞个子配置文件
在这里插入图片描述

[root@keepalived1 ~]# mkdir /etc/keepalived/conf.d
[root@keepalived1 ~]# vim /etc/keepalived/conf.d/172.25.254.100.conf
[root@keepalived1 ~]# cat /etc/keepalived/conf.d/172.25.254.100.conf
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 100
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev ens33 label ens33:1
    }
}

重启keepalived,发现vip还在,服务也正常启动

在这里插入图片描述

ping这个vip发现不通,怎么办?
在这里插入图片描述
在这里插入图片描述

ping 通了撒!

四、抢占模式和非抢占模式

1、非抢占模式 nopreempt

默认为抢占模式preempt,即当高优先级的主机恢复在线后,会抢占低先级的主机的master角色,
这样会使vip在KA主机中来回漂移,造成网络抖动。
==建议设置为非抢占模式 nopreempt ==,即高优先级主机恢复后,并不会抢占低优先级主机的master角色非抢占模块下,如果原主机down机, VIP迁移至的新主机, 后续也发生down时,仍会将VIP迁移回原主机。

要关闭 VIP抢占,必须将各 keepalived 服务器state配置为BACKUP

在这里插入图片描述

注意:两台机器都要做相应的配置

这个时候,哪台机器先启动就拥有vip。

3、抢占延迟模式 preempt_delay

抢占延迟模式,即优先级高的主机恢复后,不会立即抢回VIP,而是延迟一段时间(默认300s)再抢回VIP。
配置文件的参数:

preempt_delay # #指定抢占延迟时间为#s,默认延迟300s

注意:需要各keepalived服务器state为BACKUP,并且不要启用 vrrp_strict
在这里插入图片描述

4、VIP单播配置

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

unicast_src_ip <IPADDR> #指定发送单播的源IP
unicast_peer {
<IPADDR> #指定接收单播的对方目标主机IP
}

#启用 vrrp_strict 时,不能启用单播,否则服务无法启动,并在messages文件中记录下面信息

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

keepalived1的配置:
在这里插入图片描述
keepalived2的配置:
在这里插入图片描述

转包查看效果:

[root@keepalived1 ~]# tcpdump -i ens33 -nn src host 172.25.254.20 and dst 172.25.254.30

5、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>

1、创建通知脚本

[root@KA1 ~]# vim /etc/keepalived/mail.sh
#!/bin/bash
mail_dest='123456@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 in
master)
mail_send master
;;
backup)
mail_send backup
;;
fault)
mail_send fault
;;
*)
exit 1
;;
esac

并给/etc/keepalived/mail.sh一个可执行的权限
2、邮件配置

 [root@keepalived1 ~]# yum install mailx -y
 [root@keepalived1 ~]# vim /etc/mail.rc 
[root@keepalived1 ~]# tail -7 /etc/mail.rc 
set bsdcompat
set from=123@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=123@qq.com   #qq邮箱
set smtp-auth-password=isjatjwmcxtxbefj  #qq邮箱的授权码
set smtp-auth=login
set ssl-verify=ignore

在这里插入图片描述

测试:

[root@keepalived1 ~]# echo test message |mail -s test 59412333@qq.com  

在这里插入图片描述
注意:两台keepalived的服务器都要做相应的配置

6、实现 master/master 的 Keepalived 双主架构

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

五、keepalived实现IPVS的高可用性

编辑配置文件:/etc/keepalived/keepalived.conf的虚拟主机

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

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

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 { ... } #定义当前主机健康状
态检测方法
}
}
#注意:括号必须分行写,两个括号写在同一行,如: }} 会出错

3、应用层监测

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发出健康状态检测请求时使用的源端口
}

4、TCP监测

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、实战案例1:实现单主的 LVS-DR 模式

准备两台服务器当作webserver,安装好httpd服务,关闭arp,和添加vip。

[root@web1 ~]# yum install httpd
[root@web1 ~]# cat /var/www/html/index.html 
web1
[root@web1 ~]# systemctl enable httpd.service --now
#临时添加vip到回环网卡,也可以永久
[root@web1 ~]# ip addr add 172.25.254.100/32 dev lo
#关闭arp
[root@web1 ~]# sysctl -a | grep arp
#永久关掉arp
[root@web1 ~]# cat /etc/sysctl.d/arp.conf 
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
#加载配置文件
[root@web1 ~]# sysctl --system
#临时关闭arp
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #差不多这种

记住,上面的两台服务器都要配置
1、配置keepalived配置
keepalived1的配置:

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.40 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.50 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 2
            delay_before_retry 2
        }
    }
}

keepalived2的配置:

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.40 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.50 80 {
        weight 1
        HTTP_GET {
            url {
              path /
	      status_code 200
            }
            connect_timeout 3
            nb_get_retry 2
            delay_before_retry 2
        }
    }
}

两台keepalived服务器:

[root@keepalived1 ~]# yum install ipvsadm -y
[root@keepalived2 ~]# yum install ipvsadm -y

重启两台服务器的keepalived服务,发现ipvs已经加载了调度规则:
在这里插入图片描述
如果测试的时候发现,怎么调度都是同一个
在这里插入图片描述
在这里插入图片描述
注释掉后,重启服务就可以了。
在这里插入图片描述

六、实现其它应用的高可用性 VRRP Script

keepalived利用 VRRP Script 技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先动态调整,从而实现其它应用的高可用性功能。

1、 VRRP Script 配置

1、定义脚本
vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定义在vrrp实例之外的独立配置块,一般放在global_defs设置块之后。
通常此脚本用于监控指定应用的状态。一旦发现应用的状态异常,则触发对MASTER节点的权重减至低于SLAVE节点,从而实现 VIP 切换到 SLAVE 节点。

vrrp_script <SCRIPT_NAME> {
script <STRING>|<QUOTED-STRING> #此脚本返回值为非0时,会触发下面OPTIONS执行
OPTIONS
}

2、调用脚本
track_script:调用vrrp_script定义的脚本去监控资源,定义在VRRP实例之内,调用事先定义的vrrp_script。

track_script {
SCRIPT_NAME_1
SCRIPT_NAME_2
}

2、 实战案例:实现HAProxy高可用

在负载均衡的两台服务器上安装haproxy,并配置。
keepalive1的配置。

#启用内核参数,因为vip在漂移,这个内核可以让haproxy可以监听不存在的ip
[root@keepalived1 ~]# vim /etc/sysctl.conf
[root@keepalived1 ~]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1

[root@keepalived1 ~]# yum install haproxy
#编写配置文件
[root@keepalived1 ~]# grep -A 5  "webserver"  /etc/haproxy/haproxy.cfg 
listen webserver
    bind 172.25。254.200:80
    mode   http
    balance static-rr
    server web1 172.25.254.40:80 check
    server web2 172.25.254.50:80 check

keepalived2的配置:

#启用内核参数,因为vip在漂移,这个内核可以让haproxy可以监听不存在的ip
[root@keepalived2 ~]# vim /etc/sysctl.conf
[root@keepalived2 ~]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1

[root@keepalived2 ~]# yum install haproxy.x86_64 
[root@keepalived2 ~]# vim /etc/haproxy/haproxy.cfg 
[root@keepalived2 ~]# systemctl restart haproxy.service 
[root@keepalived2 ~]# grep -A 5 "webserver" /etc/haproxy/haproxy.cfg 
listen webserver
    bind  172.25.254.200:80
    mode   http
    balance static-rr
    server web1 172.25.254.40:80 check
    server web2 172.25.254.50:80 check

在keepalived1和keepalived2的都编写监控脚本,为什么要写这个呀,如果haproxy服务挂了,keepalive服务咋知道呢,所以要写脚本监控它,自己家的服务挂了,要把vip给别人。

keepalived1的配置:

[root@keepalived1 ~]# cat /etc/keepalived/haproxy.sh 
killall -0 haproxy
[root@keepalived1 ~]# chmod +x /etc/keepalived/haproxy.sh 
#脚本中用上了killall,没有killall就安装它。
[root@keepalived1 ~]# yum provides */killall
[root@keepalived1 ~]# yum install psmisc-22.20-17.el7.x86_64

#编写keepalive的配置文件,创建一个vrrp_script的脚本,当脚本的返回值为非0的时候,就与调用该脚本的vip组的优先级相加,导致优先级不如组而放弃vip。
vrrp_script check_haproxy {
   script "/etc/keepalived/haproxy.sh"
   interval 1
   weight -30
   fall 2
   rise 2
   timeout 2
}
vrrp_instance haproxy {
    state MASTER
    interface ens33
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.200/24 dev ens33 label ens33:2
    }
     track_script {
        check_haproxy
    }
}

keepalived2的配置:

#编写脚本,给上可执行权限
[root@keepalived2 ~]# vim /etc/keepalived/haproxy.sh
[root@keepalived2 ~]# cat /etc/keepalived/haproxy.sh 
killall -0 haproxy
[root@keepalived2 ~]# chmod +x /etc/keepalived/haproxy.sh
#脚本中用上了killall,没有killall就安装它。
[root@keepalived2 ~]# yum install psmisc-22.20-17.el7.x86_64

#编写keepalive的配置文件,创建一个vrrp_script的脚本,当脚本的返回值为非0的时候,就与调用该脚本的vip组的优先级相加,导致优先级不如组而放弃vip。
vrrp_script check_haproxy {
   script "/etc/keepalived/haproxy.sh"
   interval 1
   weight -30
   fall 2
   rise 2
   timeout 2
}
vrrp_instance haproxy {
    state BACKUP
    interface ens33
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.200/24 dev ens33 label ens33:2
    }
     track_script {
        check_haproxy
    }
}

全部重启keepalived的服务,测试:
在这里插入图片描述
没问题的啦!

关闭keepalived1服务器的haproxy的服务,测试:
发现vip飘到了keepalived2服务器上。
在这里插入图片描述
发现也没问题,还可以访问。
在这里插入图片描述

  • 17
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值