1.概述
什么是keepalived:
keepalived是一个基于VRRP协议来实现的服务高可用方案。VRRP协议,即虚拟路由冗余协议,其一开始提出来是为了解决局域网中配置静态网关出现单点失效的现象的路由协议。
说人话就是,VRRP协议允许一台机器可以拥有一个或者多个虚拟IP。这个虚拟IP首先会与一个实际IP绑定,对这个虚拟IP的访问会打到这个实际IP上,如果这个实际IP挂了,虚拟IP会重新绑定到另一个可用的IP上(俗称IP漂移)。
用来干什么:
对于请求来说,我只需要访问固定的IP地址(虚拟IP),至于后面到底是谁提供的服务是不关心的,只要能持续的提供服务即可。这样自然而然就实现了高可用。
本文要做什么:
本文会用keepalived来实现两个nginx节点之间的高可用。实现当其中一个nginx挂掉之后,虚拟IP漂移到另一个还活着的nginx上的效果。至于其它类型的应用的主备自动切换,使用上是类似的。
本次示例的IP地址规划如下:
192.168.31.20 |
master |
192.168.31.30 | backup |
nginx的安装这里就不赘述了,可以去看博主另一篇文章:
或者另一位作者的文章:
Linux中安装Nginx,很详细_linux安装nginx详细步骤-CSDN博客
2.配置
安装keepalived的方式多种多样,这里我们用yum installed的方式来安装。
yum install -y keepalived
首先我们要在/etc/keepalived/下编写一个check_nginx.sh脚本用来检查nginx是否活着,要是挂了,直接停止当前节点上的keepalived。
#!/bin/bash counter=$(ps -C nginx --no-headinglwc -1) if["${counter]"= "0"]; then systemctl start nginx sleep 2 counter=$(ps -C nginx --no-heading | wc -l) if["${counter}"="0"]; then systemctl stop keepalived fi fi
接下来我们配置keepalived.conf:
要注意这里有个天坑:这里的配置文件哪些的括号该换行,哪些的括号该有空格,必须严格和下面的格式对其,就是一个括号没有换行,格式的都会报错!
主节点的keepalived的配置:
#全局配置,路由ID不变 global_defs { router_id LVS_DEVEL } vrrp_script chk_nginx { script "/etc/keepalived/check_nginx.sh" #时间间隔,单位默认为秒 interval 2 #权重,当脚本执行成功或失败,对当前节点的优先级是增加还是减少 weight -5 } vrrp_instance VI_1 { #主节点 state MASTER #绑定的网卡 interface enp0s3 #虚拟路由id,保证主从之间一致 virtual_router_id 51 #优先级,高优先级的为主 priority 101 #指定发送VRRP通告的间隔,单位秒 advert_int 2 #安全认证密码 authentication { auth_type PASS auth_pass 1111 } #对外暴露的VIP地址 virtual_ipaddress { 192.168.31.240 } #指定nginx执行状态脚本 track_script { chk_nginx } }
配置好后我们用systemctl start来启动keepalived,并切查看一下keepalived的启动日志,正常启动的日志会如下:
配置备节点的keepalived:
和主节点只有略微不同,就是state切换为BACKUP,priority优先级比主节点低一些即可。
#全局配置,路由ID不变 global_defs { router_id LVS_DEVEL } vrrp_script chk_nginx { script "/etc/keepalived/check_nginx.sh" #时间间隔,单位默认为秒 interval 2 #权重,当脚本执行成功或失败,对当前节点的优先级是增加还是减少 weight -5 } vrrp_instance VI_1 { #备份节点 state BACKUP #绑定的网卡 interface enp0s3 #虚拟路由id,保证主从之间一致 virtual_router_id 51 #优先级,高优先级的为主 priority 100 #指定发送VRRP通告的间隔,单位秒 advert_int 2 #安全认证密码 authentication { auth_type PASS auth_pass 1111 } #对外暴露的VIP地址 virtual_ipaddress { 192.168.31.240 } #指定nginx执行状态脚本 track_script { chk_nginx } }
启动备节点并查看日志:
3.效果
访问虚拟IP,可以看到请求被打到了主节点上去了:
关掉主节点的keepalived,可以看到从节点立马切换为了主节点:
再访问,请求直接打到了备用节点上面去了:
4.keepalived主备切换原理
到这里我相信不少同学有这样一个疑惑:
备份节点是如何感知到master节点挂掉的?
这里大概聊一聊这个问题。在 Keepalived 主备切换的过程中,备份节点(Backup)是通过一种叫做 VRRP(Virtual Router Redundancy Protocol)协议来感知主节点(Master)的状态的。
VRRP 是一种用于提供冗余路由的协议,其基本原理是将多个路由器组成一个虚拟路由器,这个虚拟路由器有一个虚拟 IP 地址和一个虚拟 MAC 地址。在这个虚拟路由器中,有一个节点被选举为 Master,其他节点成为 Backup。
主备节点之间通过 VRRP 协议交互,主要包括以下步骤:
- VRRP 路由器选举: 在一个 VRRP 组中,多个节点参与竞选成为 Master 节点。通过选举算法,其中一个节点成为 Master,负责处理虚拟 IP 地址的数据包。
- VRRP 路由器间的心跳: Master 和 Backup 之间定期发送 VRRP 心跳消息,以确保彼此的存活状态。
- 检测 Master 节点失效: 如果 Backup 节点在一定时间内没有收到来自 Master 的心跳消息,它将认为 Master 节点失效。
- 备份节点接管: 一旦 Backup 节点检测到 Master 节点失效,它会迅速接管虚拟 IP 地址,成为新的 Master。
在 Keepalived 中,VRRP 协议被用于实现高可用性的主备切换。备份节点通过 VRRP 协议感知主节点的状态,当检测到主节点不可用时,备份节点会迅速接管服务,确保服务的可用性。这样,即使主节点出现故障,整个系统仍然能够保持正常运行。