高可用集群Keepalived
1. 前言
1.1 何为高可用
高可用(High Availability,HA)是指系统、服务或组件在面对故障、故障或其他问题时能够保持持续运行并提供服务的能力。高可用性通常是通过冗余、故障转移和负载均衡等技术实现的。
以下是一些常见的高可用性技术和方法:
-
冗余:使用多个备份组件(如服务器、存储设备或网络路径)来避免单点故障。比如,数据库可以通过主从复制来实现冗余。
-
故障转移:当主系统出现故障时,自动切换到备用系统。这样可以保证服务的连续性。例如,使用负载均衡器来监控服务器状态并在需要时将流量转移到健康的服务器上。
-
负载均衡:通过将请求分配到多个服务器来均衡负载,防止某一台服务器过载,同时也提升系统的可用性。
-
监控和自动恢复:持续监控系统健康状态,并在检测到问题时自动采取恢复措施,如重启服务或调整配置。
-
数据备份和恢复:定期备份数据并确保备份可以快速恢复,以防数据丢失或损坏。
简单来说高可用性设计的目标就是尽可能减少系统的停机时间和服务中断,保证业务的连续性和稳定性。
1.2 如何实现高可用
- 提升系统高用性的解决方案:降低MTTR- Mean Time To Repair(平均故障时间)
解决方案:建立冗余机制
- active/passive 主/备
- active/active 双主
- active --> HEARTBEAT --> passive
- active <–> HEARTBEAT <–> active
2.高可用集群Keepalived的相关介绍
2.1 集群类型
- LB:Load Balance 负载均衡
LVS/HAProxy/nginx(http/upstream, stream/upstream) - HA:High Availability 高可用集群
数据库、Redis - SPoF: Single Point of Failure,解决单点故障
HPC:High Performance Computing 高性能集群
2.2 VRRP
(1)VRRP:Virtual Router Redundancy Protocol 虚拟路由冗余协议,以下为架构图
(2)相关术语
1.通告:心跳,优先级等;周期性
2.工作方式:抢占式,非抢占式
3.安全认证:
- 无认证
- 简单字符认证:预共享密钥
- MD5
4.工作模式:
- 主/备:单虚拟路由器
- 主/主:主/备(虚拟路由器1),备/主(虚拟路由器2)
2.3 Keepalived简介
Keepalived即vrrp 协议的软件实现,原生设计目的为了高可用 ipvs服务
功能:
- 基于vrrp协议完成地址流动
- 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
- 为ipvs集群的各RS做健康状态检测
- 基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务
2.4 Keepalived架构
- 用户空间核心组件:
vrrp stack:VIP消息通告
checkers:监测real server
system call:实现 vrrp 协议状态转换时调用脚本的功能
SMTP:邮件组件
IPVS wrapper:生成IPVS规则
Netlink Reflector:网络接口
WatchDog:监控进程 - 控制组件:提供keepalived.conf 的解析器,完成Keepalived配置
- IO复用器:针对网络目的而优化的自己的线程抽象
- 内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限
3.Keepalived相关部署
3.1 环境搭建
- 各节点时间必须同步:ntp, chrony
- 关闭防火墙及SELinux
- 各节点之间可通过主机名互相通信:非必须
- 建议使用/etc/hosts文件实现:非必须
- 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信:非必须
3.2 相关文件介绍
软件包名:keepalived
主程序文件:/usr/sbin/keepalived
主配置文件:/etc/keepalived/keepalived.conf
配置文件示例:/usr/share/doc/keepalived/
Unit File:/lib/systemd/system/keepalived.service
Unit File的环境配置文件:/etc/sysconfig/keepalived
3.3 基础环境配置
主机名 | IP |
---|---|
KA1 | 172.25.254.10(VIP:172.25.254.100) |
KA2 | 172.25.254.20(VIP:172.25.254.100) |
realserver1 | 172.25.254.110 |
realserver2 | 172.25.254.120 |
test | 172.25.254.7 |
4.Keepalived实战
4.1 实现master/slave的 Keepalived 单主架构
4.1.1 内容配置
(1)给KA1和KA2上均部署Keepalived
#安装keepalived
[root@ka1 ~]# yum install keepalived.x86_64 -y
[root@ka2 ~]# yum install keepalived.x86_64 -y
(2)配置文件
注:每修改一次配置文件,需要生效的话则要重启服务
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
全局配置(注:这里组播地址最后设置为了224.0.0.18)
配置虚拟路由器
#有一点内容没有截到
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:1
}
#启动服务
[root@ka1 ~]# systemctl enable --now keepalived.service
(3)给KA2配置文件内容(和KA1有不同)
接着启动服务
(4)给realserver1和realserver2配置httpd服务
[root@realserver1 ~]# yum install httpd -y
#设置一个网页信息,为了测试用
[root@realserver1 ~]# echo 172.25.254.110 > /var/www/html/index.html
[root@realserver1 ~]# systemctl enable --now httpd
[root@realserver2 ~]# yum install httpd -y
[root@realserver2 ~]# echo 172.25.254.120 > /var/www/html/index.html
[root@realserver2 ~]# systemctl enable --now httpd
(5)配置到这里可以测试httpd服务的正确性和keepalived的正确性
测试httpd服务
我用的windows测试
访问测试的结果正确
测试keepalived服务
查看vip出现在谁的网卡信息上
我这里是在KA1上,将KA1的服务停掉后转到KA2上
然后重启KA1的服务,因为默认是抢占模式,所以vip又会在KA1上
初始状态
KA2
[root@ka1 ~]# systemctl stop keepalived.service
停掉后vip转移
KA2上出现vip
这时重启KA1
KA1上又有了vip
(6)接着做一个注释(KA1和KA2都做),并重启测试
4.1.2 测试
测试(这个命令是在KA1正常工作的时候会持续给KA2发送数据包,表示KA1他自己还能正常工作,一旦KA1不能正常工作,则不会给KA2发消息,那么KA2在接收不到来自KA1的消息时就会默认KA1故障了,那么KA2自己就得接过KA2,保证服务的持续进行。)
[root@ka1 ~]# tcpdump -i eth0 -nn host 224.0.0.18
重启一个KA1的会话,然后关闭keepalived服务,看是否会将VIP漂到KA2上
[root@ka1 ~]# systemctl stop keepalived.service
这里成功切换到了KA2上,接着这里默认是抢占模式,所以重启KA1的服务,看VIP会不会被抢回来
[root@ka1 ~]# systemctl restart keepalived.service
KA1抢了回来了
测试成功,可以实现主备切换
4.2 抢占模式和非抢占模式
默认抢占模式会引起网络抖动,所以一般生产中会设置为非抢占模式或者延迟抢占模式
4.2.1 内容配置
(1)KA1上
(2)KA2上
4.2.2 测试
测试思路:此时VIP在KA1上,那么进行测试时,将KA1的服务停掉,这时VIP会漂到KA2上,再将KA1启动,看看这时VIP在谁身上,如果是KA2上,那么证明测试成功。最后再将KA2上停掉服务,看VIP能否漂到KA2上
测试开始
这时关掉了KA1上的服务,显示KA2在给KA1发送数据包
这里重启KA1的服务,但VIP并没有漂回去,所以测试成功
[root@ka1 ~]# systemctl restart keepalived.service
这里进行了停掉KA2并重启了KA2,也没有进行抢占,所以测试为非抢占模式
测试成功
4.(2.5) 延迟抢占模式
4.(2.5).1 内容配置
(1)KA1上
(2)KA2上
4.(2.5).2 测试
测试思路:同非抢占模式一致,只是这里设置的抢占延迟为5秒,在停掉服务接着重启后的5秒内是不能抢到VIP,等到5秒(抢占延迟时间)后,会将VIP抢占过来。
这里因为是以文本的形式不太容易演示,要是以视频的演示会好演示,所以这里我自己做过测试了,是成功的,感兴趣的话自己可以尝试一下,如果有问题欢迎评论或者私信我
4.3 VIP单播配置
- 默认keepalived主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量
4.3.1 内容配置
(1)KA1上
(2)KA2上
4.3.2 测试
- 测试思路:同时在KA1和KA2上进行单播测试,此时KA1有VIP,在KA1上有数据显示,在KA2上没有,在KA1停掉服务后,在VIP漂到KA2上后KA2的测试语句也有了数据流向
(1)开始同时测试
KA1上
KA2上
(2)关闭KA1的服务后,KA2有了数据流向
此时KA1上显示unreachable
测试成功
4.4 Keepalived 通知脚本配置
- 当keepalived的状态变化时,可以自动触发脚本的执行,比如:发邮件通知用户
默认以用户keepalived_script身份执行脚本
如果此用户不存在,以root执行脚本可以用下面指令指定脚本执行用户的身份
4.4.1 内容配置
(1)下载插件,并在网页打开qq邮箱(这里我用的是我的qq邮箱,也可以使用其他邮箱)
[root@ka1 ~]# yum install mailx -y
[root@ka1 ~]# echo hello world | mail -s test 1879886286@qq.com
生成授权码,会让你发短信,发就是了,最后得到授权码,复制下来
(2)写配置文件,两台KA都做,内容一样
[root@ka1~]# vim /etc/mail.rc
[root@ka2 ~]# vim /etc/mail.rc
先做个小测试
收到信息,接着就可以写脚本配置keepalived的提示信息的功能了
(3)写脚本
[root@ka1 ~]# vim /etc/keepalived/mail.sh
脚本内容
#给脚本文件追加可执行权限
[root@ka1 ~]# chmod +x /etc/keepalived/mail.sh
#编辑keepalived配置文件,加入下边三行内容,并重启mail和keepalived服务
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
保存并重启服务
4.4.2 测试
#关掉keepalived服务
[root@ka1 ~]# killall keepalived
接着重启服务
[root@ka1 ~]# systemctl restart keepalived.service
收到邮件
测试成功
4.5 实现 master/master 的 Keepalived 双主架构
- 注:在进行这个测试时关掉邮件服务
- master/slave的单主架构,同一时间只有一个Keepalived对外提供服务,此主机繁忙,而另一台主机却很空闲,利用率低下,可以使用master/master的双主架构,解决此问题。
- 即进行资源的合理化使用,使用两个VIP对应两个服务
4.5.1 内容配置
(1)KA1上(在第二个服务VIP那里,需要将eth0:1改为eth0:2)
(2)KA2上
4.5.2 测试
测试思路:可以看到VIP:172.25.254.100在KA1上,VIP:172.25.254.200在KA2上。
(1)KA1上
(2)KA2上
测试成功
4.6 实现IPVS的高可用性
- 这里使用LVS-DR和Keepalived结合的模式
- 需要在realserver的lo网卡上配置VIP
4.6.1 内容配置
- 配置思路:先在realserver主机上配置VIP,以及配置arp相关内容,接着在KA主机上配置keepalived文件,以及安装ipvsadm软件及相关配置文件
(1)realserver1上
[root@realserver1~]# ip a a 172.25.254.100/32 dev lo
[root@realserver1 ~]# vim /etc/sysctl.d/arp.conf
(2)realserver2上
[root@realserver2 ~]# ip a a 172.25.254.100/32 dev lo
[root@realserver2 ~]# vim /etc/sysctl.d/arp.conf
(3)KA1上
[root@ka1 ~]# yum install ipvsadm.x86_64 -y
(4)KA2上
[root@ka2 ~]# yum install ipvsadm.x86_64 -y
4.6.2 测试
(1)KA1上
(2)KA2上
(3)在测试机上
测试成功
4.7 实现其它应用的高可用性 VRRP Script
- 实现HAProxy高可用
4.7.1 内容配置
(1)KA1上
#下载haproxy软件
[root@ka1 ~]# yum install haproxy.x86_64 -y
#修改内核参数,避免一台主机没有IP起不来服务
接着配置haproxy文件
[root@ka1 ~]# vim /etc/haproxy/haproxy.cfg
[root@ka1 ~]# systemctl enable --now haproxy.service
(2)KA2上
[root@ka1 ~]# yum install haproxy.x86_64 -y
接着配置haproxy文件
[root@ka2 ~]# vim /etc/haproxy/haproxy.cfg
#修改完后启动服务
[root@ka2 ~]# systemctl enable --now haproxy.service
(3)将上面实验做到realserver主机上的VIP和arp响应关掉
[root@realserver1 ~]# ip a d 172.25.254.100/32 dev lo
[root@realserver1 ~]# vim /etc/sysctl.d/arp.conf
[root@realserver2 ~]# ip a d 172.25.254.100/32 dev lo
[root@realserver2 ~]# vim /etc/sysctl.d/arp.conf
(4)注释掉实验6的LVS-DR模式的内容(KA1和KA2上都注释)
(5)写脚本加权限
KA1
KA2
(6)写配置文件
KA1上(KA2上也配置)
重启服务
4.7.2 测试
- 测试思路:在测试机上一直访问VIP,然后测试停掉KA1上的haproxy服务,看能否把VIP漂到KA2上
测试成功
最后,分享一张黄昏
看到这里的同志,加油!