1.1keepalived介绍
1.1.1keepalived 简介
Keepalived利用 VRRP 协议实现 Linux 系统的高可用性。它能在主服务器故障时自动将网络服务切换到备用服务器,保证服务连续性。其特点有高可用性、负载均衡、健康检查、配置灵活、易于集成且开源,常用于保障网络服务如 DNS、HTTP 等的高可用及实现负载均衡和故障转移。
1.1.2VRRP工作模式
-
三种状态
- Initialize状态:
- 这是节点启动VRRP时的初始状态。在Initialize状态下,节点会读取配置信息,并准备加入VRRP组。之后,节点会根据配置的优先级和其他因素,决定自己是成为Master还是Backup
- Master状态:
- 在VRRP组中,只有一个节点处于Master状态,负责处理所有的网络流量。Master节点定期发送VRRP通告消息,以通知其他节点其状态,并保持其作为主节点的地位。
- Backup状态:
- Backup节点是处于待命状态的节点,它们不处理网络流量,除非Master节点发生故障。Backup节点监听Master节点的VRRP通告消息,如果超过设定的时间没有收到通告,它们会认为Master节点可能已经故障,并开始选举过程以选择新的Master节点。
- Initialize状态:
-
选举机制
- 抢占模式
- 在抢占模式下,如果一个优先级更高的节点加入VRRP组,即使当前已经有Master节点,它也会立即抢占Master状态。
- 这种模式适用于动态环境,其中节点的优先级可能会根据系统负载或其他因素变化,需要灵活地调整Master节点。
- 抢占模式可能会导致更频繁的状态切换,但可以确保始终由优先级最高的节点处理网络流量
- 非抢占模式
- 在非抢占模式下,一旦一个节点被选举为Master,它会保持Master状态,直到它自己主动放弃或发生故障。
- 即使有另一个优先级更高的节点加入VRRP组,也不会自动抢占Master状态。这可以防止频繁的切换,提高系统的稳定性。
- 通常在非抢占模式下,优先级高的节点会在配置上被设置为Master节点,以避免不必要的选举。
- 抢占模式
1.1.3Keepalived 架构
将整个体系结构分层用户层和内核层
- Scheduler I/O Multiplexer
I/O复用分发调用器,负责安排Keepalived所有的内部的任务请求
- Memory Management
内存管理机制,提供了访问内存的一下通用方法Keepalived
- Control Plane
控制面板,实现对配置文件的编译和解析,Keepalived的配置文件解析比较特殊,它并不是一次解析所有模块的配置,而是只有在用到某模块时才解析相应的配置
- Core components
Keepalived的核心组件,包含了一系列功能模块,主要有watch dog、Checkers、VRRP Stack、IPVS wrapper、Netlink Reflector
vrrp stack:VIP消息通告
checkers:监测
real server system call:实现 vrrp 协议状态转换时调用脚本的功能
SMTP:邮件组件
IPVS wrapper:生成IPVS规则
Netlink Reflector:网络接口
WatchDog:监控进程
2.1Keepalived部署
2.1.1实验环境搭建
KA1 | ip:172.25.254.10 vip:172.25.254.100 |
KA2 | ip:172.25.254.20 vip:172.25.254.100 |
realserver | ip:172.25.254.110 |
realserver | ip:172.25.254.120 |
安装Keepalived
[root@ka1 ~]# yum install keepalived -y
[root@ka2 ~]# yum install keepalived -y
2.1.2Keepalived配置
以master/slave的 Keepalived 单主架构为例:
Keepalived帮助:
[root@ka1 ~]# man keepalived.conf
全局配置,如下图:
ka1配置:
虚拟路由配置,如图:
启动 keepalived
[root@ka1 ~]# systemctl enable --now keepalived
可以看到eth0的子接口上vip配置成功
ks2配置:
虚拟路由配置,如图:
因为ka2的优先级比ka1低,所以此时因为抢占模式,vip在ka1上
抓包测试:
2.1.3启用keepalived日志功能
修改/etc/sysconfig/keepalived下的配置:
[root@ka1 ~]# vim /etc/sysconfig/keepalived
修改/etc/rsyslog.conf下的配置:
[root@ka1 ~]# vim /etc/rsyslog.conf
重启服务:
[root@ka1 ~]# systemctl restart keepalived
[root@ka1 ~]# systemctl restart rsyslog
接着查看日志,显示配置成功:
[root@ka1 ~]# tail -f /var/log/keepalived.log
2.1.4实现独立子配置文件
配置 /etc/keepalived/keepalived.conf文件
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
新建配置文件:
[root@ka1 ~]# mkdir -p /etc/keepalived/conf.d
编辑/etc/keepalived/conf.d/172.25.254.100.conf文件:
[root@ka1 ~]# vim /etc/keepalived/conf.d/172.25.254.100.conf
写入配置:
重启服务:
[root@ka1 ~]# systemctl restart keepalived.service
再次查看vip,发现运行正常:
2.1.5非抢占模式和延迟抢占
非抢占模式:
编辑文件/etc/keepalived/keepalived.conf
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
对ka2进行配置:
注意:两台主机都要修改为BACKUP
测试:
对ka1进行重启,会发现vip在ka2上,即便是ka1的优先级比ka2高也没影响,在非抢占模式下,谁先开机谁先拿到vip除,除非拿到vip的机器dowm状态,否则vip一直在同一台机器上。
延迟抢占:
两台主机都是:BACKUP
ka1:
ka2:
测试:
会发现ka1刚开始没有vip,在5s之后会拿到vip
2.1.6VIP单播配置
默认keepalived主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量
ka1:
ka2:
测试:
2.1.7Keepalived 通知脚本配置
2.1.7.1 通知脚本类型
1.当前节点成为主节点时触发的脚本
- notify_master <STRING>|<QUOTED-STRING>
2.当前节点转为备节点时触发的脚本
- notify_backup <STRING>|<QUOTED-STRING>
3.当前节点转为“失败”状态时触发的脚本
- notify_fault <STRING>|<QUOTED-STRING>
4.通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知
- notify <STRING>|<QUOTED-STRING>
5.当停止VRRP时触发的脚本
- notify_stop <STRING>|<QUOTED-STRING>
2.1.7.2 创建通知脚本
[root@ka2 ~]# chmod +x /etc/keepalived/mail.sh
给/etc/keepalived/mail.sh一个可执行的权限
[root@ka2 ~]# chmod +x /etc/keepalived/mail.sh
2.1.7.3邮件配置
安装邮件发送工具:
[root@ka2 ~]# yum install mailx -y
拿到授权码:
对/etc/mail.rc文件进行配置:
[root@ka2 ~]# vim /etc/mail.rc
给予权限:
[root@ka2 ~]# chmod +x /etc/mail.rc
在 vrrp_instance VI_1 语句块的末尾进行配置:
测试:
[root@ka2 ~]# echo test message |mail -s test 邮箱
2.1.8 Keepalived 双主架构
master/slave的单主架构,同一时间只有一个Keepalived对外提供服务,此主机繁忙,而另一台主机却 很空闲,利用率低下,可以使用master/master的双主架构,解决此问题。
ka1:
虚拟路由1,为主
虚拟路由2,为从
修改组为200,优先级为80vip为172.25.254.200,在eth0的子接口2上
ka2:
虚拟路由1,为从
虚拟路由2,为主
优先级改为100,其余与ka1配置相同
测试:
查看ka1/2此时的vip状况:
ka1:
ka2:
当停用ka2的keepalived服务:
[root@ka2 ~]# systemctl stop keepalived
ka2的vip状况如图:
ka1有两个vip
2.1.9实现IPVS的高可用性
2.1.9.1 IPVS相关配置
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
}
2.1.9.2 实战案例1:实现单主的 LVS-DR 模式
realserver:(web1与web2配置相同)
#安装阿帕奇
[root@realserver ~]# yum install httpd -y
#对网站内容进行编辑
[root@realserver ~]# echo 172.25.254.110 - web1 > /var/www/html/index.html
#启动httpd
[root@realserver ~]# systemctl enable httpd --now
#临时添加vip到回环网卡
[root@realserver ~]# ip addr add 172.25.254.100/32 dev lo
查看换回配置:
对/etc/sysctl.d/arp.conf文件进行配置:
加载配置文件:
[root@realserver ~]# sysctl --system
keepalived:(ka1与ka2配置相同)
编辑/etc/keepalived/keepalived.conf 文件
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
vip:172.25.254.100
web1:172.25.254.110
web2:172.25.254.120
重启keepalived:
[root@ka1 ~]# systemctl restart keepalived.service
[root@ka2 ~]# systemctl restart keepalived.service
安装ipvsadm
[root@ka1 ~]# yum install ipvsadm -y
[root@ka2 ~]# yum install ipvsadm -y
测试:
2.2.1 实现其它应用的高可用性 VRRP Script
2.2.1.1 VRRP Script 配置
定义脚本 :
- vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定 义在vrrp实例之外的独立配置块,一般放在global_defs设置块之后。 通常此脚本用于监控指定应用的状态。一旦发现应用的状态异常,则触发对MASTER节点的权重减至 低于SLAVE节点,从而实现 VIP 切换到 SLAVE 节点
vrrp_script <SCRIPT_NAME> {
script <STRING>|<QUOTED-STRING> #此脚本返回值为非0时,会触发下面OPTIONS执行
OPTIONS
}
调用脚本
- track_script:调用vrrp_script定义的脚本去监控资源,定义在VRRP实例之内,调用事先定义的vrrp_script。
track_script {
SCRIPT_NAME_1
SCRIPT_NAME_2
}
2.2.1.2 实战案例:利用脚本实现主从角色切换
创建脚本:
[root@ka1 ~]# vim /mnt/check_rin.sh
编辑/etc/keepalived/keepalived.conf文件
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
提权:
[root@ka1 ~]# chmod +x /mnt/check_rin.sh
测试:
在/mnt/创建文件rin
[root@ka1 ~]# touch /mnt/rin
vip实现漂移
2.2.1.3 实战案例:实现HAProxy高可用
ka1/2:
安装 haproxy :
[root@ka1 ~]# yum install haproxy -y
编辑/etc/haproxy/haproxy.cfg 文件
[root@ka1 ~]# vim /etc/haproxy/haproxy.cfg
在两个ka1和ka2两个节点启用内核参数
[root@ka1 ~]# vim /etc/sysctl.conf
编写脚本:
[root@ka1 ~]# vim /etc/keepalived/scripts/haproxy.sh
提权:
[root@ka1 ~]# chmod +X /etc/keepalived/scripts/haproxy.sh
配置ka:
ka1:
ka2:
停止ka1:
[root@ka1 ~]# systemctl stop keepalived.service