目录
3.4.3 配置虚拟路由器(实现master/slave的 Keepalived 单主架构)
1 高可用集群简介
1.1 高可用集群的定义
高可用集群(High Availability Cluster,HA集群),简称HACluster,简单的说,集群(cluster)就是一组计算机,它们作为一个整体向用户提供一组网络资源。这些单个的计算机系统 就是集群的节点(node)。 高可用集群的出现是为了使集群的整体服务尽可能可用,从而减少由计算机硬件和软件易错性所带来的损失。如果某个节点失效,它的备援节点将在几秒钟的时间内接管它的职责。当一台服务器出现故障时,可由另一台服务器承担服务任务,从而在不需要人工干预的 情况下,自动保证系统能持续对外提供服务。因此,对于用户而言,集群永远不会停机。
1.2 高可用集群类型
- LB:Load Balance 负载均衡 --- LVS/HAProxy/nginx
- LVS(Linux Virtual Server)是基于 Linux 内核实现的四层负载均衡技术,具有高性能和高可靠性。它通过修改 IP 数据包的目的地址和端口来实现负载分发。
- HAProxy 是一款提供高可用性、负载均衡和基于 TCP 和 HTTP 应用的代理软件。它支持七层负载均衡,可以根据 HTTP 请求的内容进行更精细的流量分发。
- Nginx 不仅是一个优秀的 Web 服务器,也具备强大的负载均衡功能。在 http/upstream 中可以配置基于 HTTP 协议的负载均衡,而 stream/upstream 用于配置基于 TCP 协议的负载均衡。
- HA:High Availability 高可用集群 --- 数据库、Redis
- 数据库:通过主从复制、数据备份与恢复、故障自动切换等技术来保障数据的可用性和业务的连续性。例如 MySQL 的主从架构,当主库出现故障,从库可以迅速切换为主库继续提供服务。
- Redis 也可以通过集群模式、主从复制等方式实现高可用性。比如 Redis Sentinel 可以监控 Redis 主从节点的状态,实现自动故障切换。
- SPoF: Single Point of Failure,解决单点故障
单点故障是指系统中某个组件的故障会导致整个系统无法正常工作。解决单点故障就是通过冗余、备份、故障转移等策略消除这种风险。
- HPC:High Performance Computing 高性能集群
将多个计算机通过高速网络连接起来,协同完成大规模计算任务。
通常用于科学计算、工程模拟、大数据分析等需要强大计算能力的领域。比如气象预测模型的计算、基因序列的分析等。通过并行计算、分布式存储等技术,高性能集群能够大幅提高计算效率,缩短计算时间。
1.3 常见的HA集群
高可用集群包括双机热备、双机互备、多机互备等,这类集群一般都由两个或两个以上节点组成。比较典型的双机热备结构图如下 :
心跳检测
为了实现负载平衡、高可用性和错误恢复,集群系统采用心跳检测技术。心跳检测的基本原理是通过固定频率的信号发送,来确保节点之间的通信链路是畅通的。 如果某个节点在一段时间内没有收到心跳信号,就可以判断该节点可能已经失效,从而采取相应的处理措施。 在心跳汇报时,通常会携带一些附加的状态信息和元数据,例如节点的负载情况、运行状态等,以便管理系统更好地了解整个分布式系统的健康状况。
2 高可用与keepalived
在生产环境中,我们通常要求业务稳定运行,这样才能避免不必要的损失。业务的高可用要求设备的宕机时间比较端、业务影响范围比较小,这样才能够实现业务稳定运行。对于生产环境而言,单台设备即便再怎么维护,也有不小的概率出现故障宕机,针对这种情况,我们希望实现一种方案,使得在生产系统中每一个设备都有备用的设备。当一个设备故障后,备用设备能够立即接替该设备正常工作,从而满足系统的高可用要求。
这种机制应该可以使得主用和备用设备之间进行健康检测,备用设备能够检测主用设备的运作情况,当主用设备正常运行时,备用设备应该继续进行检测;当主用设备发生故障时,备用设备应该立即接替主用设备进行工作。上述过程应该是自动的,无需人为干预,这样才能保证当系统发生宕机后故障恢复的迅速性。
一般而言,高可用方案有以下三种:
1、基于SHELL脚本实现高可用。
2、基于keepalived软件实现高可用。
3、基于Heartbeat软件实现高可用。
2.1 keepalived简介
keepalived时一款高可用软件,可以工作在三层(网络层)、四层(传输层)和五层(应用层)上,进行健康检测功能。
keepalived有两大核心功能:健康检测功能和VRRP冗余功能。keepalived借助了VRRP(Virtual Router Redundant Protocol,虚拟路由冗余协议)协议可以在主用设备和备用设备之间设置一个虚拟的IP地址,被称为VIP。主用设备对VIP进行ARP响应,处理目的IP地址为VIP的报文,当主用设备宕机后,keepalived软件自动对VIP进行切换,使得其中一个备用设备开始对VIP进行响应,处理响应的报文请求。
keepalived可以工作在类似三层、四层和五层的模式上,当keepalived工作在三层模式时,以IP的形式去进行健康检测,当keepalived工作在四层模式时,以IP+端口的形式去进行健康检测,当keepalived工作在五层模式时,以自定义脚本的方式去进行健康检测。
IP地址漂移
在集群系统中,除了每个节点自身的静态 IP 地址外,还有一个浮动 IP 地址(即VIP)。该地址并非固定不变,例如,在双机热备中,正常状态下浮动 IP 地址位于主节点,一旦主节点发生故障,浮动 IP 地址将自动切换至备用节点。因此,为了确保服务的持续性,在集群系统中必须使用浮动 IP 地址作为对外提供的服务 IP 地址。尽管节点自身的 IP 地址也可提供服务,但当节点失效时,服务将转移到另一个节点,而连接服务的 IP 地址仍为故障节点的 IP 地址,导致服务中断。
2.2 keepalived体系结构
用户空间核心组件:
vrrp stack:VIP消息通告
checkers:监测real server
system call:实现 vrrp 协议状态转换时调用脚本的功能
SMTP:邮件组件
IPVS wrapper:生成IPVS规则
Netlink Reflector:网络接口
WatchDog:监控进程
控制组件:提供keepalived.conf 的解析器,完成Keepalived配置
IO复用器:针对网络目的而优化的自己的线程抽象
内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限
2.3 VRRP协议介绍
vrrp协议,英文名称:Virtual Router Redundancy Protocol,中文名称:虚拟路由器冗余协议。vrrp出现就是为了解决静态路由的单点故障,vrrp是通过一种竞选协议机制来将路由任务交给某台vrrp路由器。
MASTER和BACKUP
在一个VRRP虚拟路由器中,有多台物理的VRRP路由器,但是这多台物理的机器并不同时工作,而是由一台称为MASTER的负责路由工作,其他的都是BACKUP,MASTER并非一成不变,VRRP协议让每个VRRP路由器参与竞选,最终获胜的就是MASTER。MASTER有一些特权,比如拥有虚拟路由器的IP地址,我们的主机就是用这个IP地址作为静态路由的。拥有特权的MASTER要负责转发发送给网关地址的包和响应ARP请求。
VRRP通过竞选协议来实现虚拟路由器的功能,所有的协议报文都是通过IP多播(multicast)包(多播地址224.0.0.18)形式发送的。虚拟路由器有VRID(范围0-255)和一组IP地址组成,对外表现为一个周知的MAC地址:00-00-5E-00-01{VRID}。所有,在一个虚拟路由器中,不管谁是MASTER,对外都是相同的MAC和IP(称之为VIP)。客户端主机并不需要因为MASTER的改变而修改自己的路由配置,对他们来说,这周主从的切换时透明的。
在一个虚拟路由器中,只有作为MASTER的VRRP路由器会一直发送VRRP广告包(VRRP Advertisement message),BACKUP不会抢占MASTER,除非它的优先级(priority)更高。当MASTER不可用时(BACKUP收不到广告包),多台BACKUP中优先级最高的这台会被抢占为MASTER。这种抢占式非常快速的(<1s),以保证服务的连续性。
出于安全性考虑,VRRP包使用了加密协议进行加密。
原理总结
VRRP 相关术语
- 虚拟路由器:Virtual Router
- 虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器
- VIP:Virtual IP
- VMAC:Virutal MAC (00-00-5e-00-01-VRID)
- 物理路由器:
- master:主设备
- backup:备用设备
- priority:优先级
VRRP 相关技术
通告:心跳,优先级等;周期性
工作方式:抢占式,非抢占式
安全认证:
- 无认证
- 简单字符认证:预共享密钥
- MD5
工作模式:
- 主/备:单虚拟路由器
- 主/主:主/备(虚拟路由器1),备/主(虚拟路由器2)
vrrp 协议的软件实现,原生设计目的为了高可用 ipvs 服务
官网: http://keepalived.org/
功能:
- 基于vrrp协议完成地址流动
- 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
- 为ipvs集群的各RS做健康状态检测
- 基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务
3 Keepalived部署
3.1 Keepalived 环境准备
角色 | IP(NAT) |
KA1 | 172.25.254.10 |
KA2 | 172.25.254.20 |
webserver1 | 172.25.254.110 |
webserver2 | 172.25.254.120 |
- 各节点时间必须同步:ntp, chrony
- 关闭防火墙及SELinux
- 各节点之间可通过主机名互相通信(非必须)
- 建议使用/etc/hosts文件实现(非必须)
- 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信(非必须)
3.2 Keepalived 相关文件
- 软件包名: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 keepalived安装
# 在ka1和ka2上做
yum install keepalived -y
3.4 KeepAlived 配置说明
3.4.1 配置文件组成
配置文件: /etc/keepalived/keepalived.conf
配置文件组成
- GLOBAL CONFIGURATION
Global definitions: 定义邮件配置, route_id , vrrp 配置,多播地址等- VRRP CONFIGURATION
VRRP instance(s): 定义每个vrrp 虚拟路由器- LVS CONFIGURATION
Virtual server group(s)
Virtual server(s): LVS集群的 VS 和 RS
3.4.2 全局配置说明
这些在KA1和KA2上看到
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
1904650938@qq.com #keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区分写多个
}
notification_email_from keepalived@timinglee.org #发邮件的地址
smtp_server 127.0.0.1 #邮件服务器地址
smtp_connect_timeout 30 #邮件服务器连接timeout
router_id ka1.timinglee.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地址范围:
}
# 编辑完后开启服务(ka2先不用做,后面直接复制过去)
[root@ka1 ~]# systemctl enable --now keepalived.service
3.4.3 配置虚拟路由器(实现master/slave的 Keepalived 单主架构)
# ka1
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface eth0 #绑定为当前虚拟路由器使用的物理接口,如:eth0,可以和VIP不在一个网卡
virtual_router_id 100 #每个虚拟路由器惟一标识,范围:0-255,每个虚拟路由器此值必须唯一
#否则服务无法启动
#同属一个虚拟路由器的多个keepalived节点必须相同
#务必要确认在同一网络中此值必须唯一
priority 100 #当前物理节点在此虚拟路由器的优先级,范围:1-254
#值越大优先级越高,每个keepalived主机节点此值不同
advert_int 1 #vrrp通告的时间间隔,默认1s
authentication { #认证机制
auth_type PASS #AH为IPSEC认证(不推荐,这里没用),PASS为简单密码(建议使用)
uth_pass 1111 #预共享密钥,仅前8位有效
#同一个虚拟路由器的多个keepalived节点必须一样
}
virtual_ipaddress { #虚拟IP,生产环境可能指定上百个IP地址
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
172.25.254.100/24 dev eth0 label eth0:1 #指定VIP,不指定网卡,默认为eth0,注意:不指定/prefix,默认32
}
}
将在ka1做的内容直接复制到ka2上
[root@ka1 ~]# scp /etc/keepalived/keepalived.conf root@172.25.254.20:/etc/keepalived/keepalived.conf
The authenticity of host '172.25.254.20 (172.25.254.20)' can't be established.
ECDSA key fingerprint is SHA256:2Ret2cBhPX82L0+dP7RcH9eaY0A4Wo/vU9+yvs/L7dI.
ECDSA key fingerprint is MD5:9f:a2:a4:e5:5c:cf:d0:eb:ae:ed:f2:d3:20:69:42:14.
Are you sure you want to continue connecting (yes/no)? yes # 输入yes
Warning: Permanently added '172.25.254.20' (ECDSA) to the list of known hosts.
root@172.25.254.20's password: # 输入ka2的用户密码(不显示出来)
keepalived.conf
查看:
在ka2上做点小小的变更
vim /etc/keepalived/keepalived.conf
改下面这三处:
测试:
[root@ka1 ~]# tcpdump -i eth0 -nn host 224.0.0.18
# ka2开启服务
[root@ka2 ~]# systemctl enable --now keepalived.service
在webserver1上做下面这两步:
# 远程连接ka1
[root@webserver1 ~]# ssh -l root 172.25.254.10
# 关闭keepalived服务
[root@ka1 ~]# systemctl stop keepalived.service
查看此时ka1主机的数据,此时172.25.254.20过来了:
在ka2上查看,发现此时VIP过来了:
在webserver1主机上再次打开服务:
[root@ka1 ~]# systemctl start keepalived.service
发现此时172.25.254.10又回来了:
此时VIP又迁回去了
3.4.3.1 虚拟路由的通讯设定
做完上面的东西,此时我们的KA是ping不通自己的VIP的,需要做以下设定
# ka1,ka2都要做
vim /etc/keepalived/keepalived.conf
加上这行
# 重启服务
systemctl restart keepalived.service
此时就能通讯了:
3.4.4 keepalived日志分离
[root@ka1 ~]# vim /etc/sysconfig/keepalived
# 修改里面的最后一行成下面这句
KEEPALIVED_OPTIONS="-D -S 6"
[root@ka1 ~]#vim /etc/rsyslog.conf
local6.* /var/log/keepalived.log
[root@ka1 ~]# systemctl restart keepalived.service
[root@ka1 ~]# systemctl restart rsyslog.service
# 查看独立的日志文件
[root@ka1 ~]# tail -f /var/log/keepalived.log
Aug 18 02:28:58 ka1 Keepalived_healthcheckers[50993]: Adding sorry server [192.168.200.200]:1358 to VS [10.10.10.2]:1358
Aug 18 02:28:58 ka1 Keepalived_healthcheckers[50993]: Removing alive servers from the pool for VS [10.10.10.2]:1358
Aug 18 02:28:58 ka1 Keepalived_healthcheckers[50993]: Remote SMTP server [127.0.0.1]:25 connected.
Aug 18 02:28:58 ka1 Keepalived_healthcheckers[50993]: SMTP alert successfully sent.
Aug 18 02:28:59 ka1 Keepalived_healthcheckers[50993]: Timeout connecting server [192.168.201.100]:443.
Aug 18 02:28:59 ka1 Keepalived_healthcheckers[50993]: Check on service [192.168.201.100]:443 failed after 3 retry.
Aug 18 02:28:59 ka1 Keepalived_healthcheckers[50993]: Removing service [192.168.201.100]:443 from VS [192.168.200.100]:443
· · · · · ·
3.4.5 实现独立子配置文件
[root@ka1 ~]# vim /etc/keepalived/keepalived.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 {
# 172.25.254.100/24 dev eth0 label eth0:1
# }
#}
#
include "/etc/keepalived/conf.d/*.conf" # 相关子配置文件的路径
· · · · · ·
创建子配置文件的存放点
[root@ka1 ~]# mkdir /etc/keepalived/conf.d
[root@ka1 ~]# vim /etc/keepalived/conf.d/172.25.254.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 {
172.25.254.100/24 dev eth0 label eth0:1
}
}
# 重启服务
[root@ka1 ~]# systemctl restart keepalived.service