1. 介绍
keepalived属于高可用性集群。
其工作原理是通过VRRP协议实现主备节点之间的状态同步,当主节点出现故障时,备节点会接管主节点的VIP地址,从而实现服务的高可用性。
VRRP是虚拟路由器冗余协议(Virtual Router Redundancy Protocol)的缩写,是一种实现路由器冗余的协议。VRRP协议可以将多台路由器组成一个虚拟路由器,这个虚拟路由器有一个虚拟IP地址,可以提供给客户端使用。在这个虚拟路由器中,只有一台路由器是活动的,其他路由器都是备份的。当活动路由器出现故障时,备份路由器会接管虚拟IP地址,从而实现路由器的高可用性。
keepalived实现的功能:
实现高可用性:keepalived 可以监控集群中的各个节点,当某个节点出现故障时,keepalived 可以自动将该节点从集群中剔除,从而保证整个集群的高可用性。
实现负载均衡:keepalived 可以根据一定的负载均衡算法,将客户端请求分发到集群中的各个节点上,从而实现负载均衡
实现健康检查:keepalived 可以定期对集群中的各个节点进行健康检查,当某个节点出现故障时,keepalived 可以自动将该节点从集群中剔除,从而保证整个集群的高可用性。
实现虚拟 IP:keepalived 可以为集群提供虚拟 IP,客户端请求都发送到虚拟 IP 上,然后由 keepalived 将请求分发到集群中的各个节点上,从而实现负载均衡和高可用性。
实现故障转移:当集群中的某个节点出现故障时,keepalived 可以自动将该节点从集群中剔除,并将虚拟 IP 转移到其他正常节点上,从而实现故障转移。
实现状态同步:当集群中的某个节点出现故障时,keepalived 可以将该节点的状态同步到其他正常节点上,从而保证整个集群的状态一致性。
2. 部署keepalived
准备两台安装web软件的机器
2.1 安装
下载网址在上面,请根据需求下载自己所需版本
2.2 修改配置文件
web1修改
[root@web1 ~]# vim /etc/keepalived/keepalived.conf
router_id web1 # 设置本机在集群中的唯一识别
vrrp_iptables # 自动配置iptables放行规则
... ...
vrrp_instance VI_1 {
state MASTER # 状态,主为MASTER,备为BACKUP
interface eth0 # 网卡
virtual_router_id 51 # 虚拟路由器地址
priority 100 # 优先级
advert_int 1 # 发送心跳消息的间隔
authentication {
auth_type PASS # 认证类型为共享密码
auth_pass 1111 # 集群中的机器密码相同,才能成为集群
}
virtual_ipaddress {
192.168.88.80/24 # VIP地址
}
}
# 删除下面所有行
[root@web1 ~]# systemctl start keepalived
# 等几秒服务完全启动后,可以查看到vip
[root@web1 ~]# ip a s eth0 | grep '88'
inet 192.168.88.100/24 brd 192.168.88.255 scope global noprefixroute eth0
inet 192.168.88.80/24 scope global secondary eth0
web2修改
# 配置web2
[root@web1 ~]# scp /etc/keepalived/keepalived.conf 192.168.88.200:/etc/keepalived/
[root@web2 ~]# vim /etc/keepalived/keepalived.conf
router_id web2 # 改id
vrrp_iptables
... ...
vrrp_instance VI_1 {
state BACKUP # 改状态
interface eth0
virtual_router_id 51
priority 80 # 改优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress
192.168.88.80/24
}
}
# 启动服务
[root@web2 ~]# systemctl start keepalived
# 查看地址,eth0不会出现vip
[root@web2 ~]# ip a s | grep '88'
inet 192.168.88.200/24 brd 192.168.88.255 scope global noprefixroute eth0
测试
# 测试,现在访问88.80,看到是web1上的内容
[root@client1 ~]# curl http://192.168.88.80
Welcome from web1
# 模拟web1出现故障
[root@web1 ~]# systemctl stop keepalived.service
# 测试,现在访问88.80,看到是web2上的内容
[root@client1 ~]# curl http://192.168.88.80
Welcome from web2
# 在web2上查看vip,可以查看到vip 192.168.88.80
[root@web2 ~]# ip a s | grep '88'
inet 192.168.88.200/24 brd 192.168.88.255 scope global noprefixroute eth0
inet 192.168.88.80/24 scope global secondary eth0
3. 高级应用(监控本机80端口,实现主备切换)
实现原理
- 配置高可用的web集群时,Keepalived只为服务器提供了VIP
- Keepalived不知道服务器上运行了哪些服务
- MASTER服务器可以通过跟踪脚本监视本机的80端口,一旦本机80端口失效,则将VIP切换至BACKUP服务器
- Keepalived对脚本的要求是,退出码为0表示访问成功;退出码为1表示失败。
3.1 创建脚本
# 1. 在MASTER上创建监视脚本
[root@web1 ~]# vim /etc/keepalived/check_http.sh
#!/bin/bash
ss -tlnp | grep :80 &> /dev/null && exit 0 || exit 1
[root@web1 ~]# chmod +x /etc/keepalived/check_http.sh
3.2 修改MASTER配置文件,使用脚本
在keepalived配置文件中,track_script用于检查一个脚本的返回值,如果返回值为0,则认为当前主机处于正常状态,如果返回值为1,则认为当前主机处于异常状态,需要将VIP地址切换到另一台备用机器上。
track_script配置项可以放在vrrp_instance或vrrp_script块中,其中vrrp_instance是用于定义一个VRRP实例配置,vrrp_script是定义一个脚本名称和执行脚本的配置项。
通过配置track_script来检测应用程序或服务是否正常,可以增加VIP地址更准确、可靠的自动切换功能,提高系统的可用性和可靠性。
[root@web1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
...略...
}
vrrp_script chk_http_port { # 定义监视脚本
script "/etc/keepalived/check_http.sh"
interval 2 # 脚本每隔2秒运行一次
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.88.80/24
}
track_script { # 引用脚本
chk_http_port
}
}
# 3. 重起服务
[root@web1 ~]# systemctl restart keepalived.service
3.3 测试
# 4. 测试,关闭web1的nginx后,VIP将会切换至web2
[root@web1 ~]# systemctl stop nginx.service
[root@web1 ~]# ip a s | grep 88
inet 192.168.88.100/24 brd 192.168.88.255 scope global noprefixroute eth0
[root@web2 ~]# ip a s | grep 88
inet 192.168.88.200/24 brd 192.168.88.255 scope global noprefixroute eth0
inet 192.168.88.80/24 scope global secondary eth0
# 5. 当MASTER的nginx修复后,VIP将会切换回至web1
[root@web1 ~]# systemctl start nginx.service
[root@web1 ~]# ip a s | grep 88
inet 192.168.88.100/24 brd 192.168.88.255 scope global noprefixroute eth0
inet 192.168.88.80/24 scope global secondary eth0
[root@web2 ~]# ip a s | grep 88
inet 192.168.88.200/24 brd 192.168.88.255 scope global noprefixroute eth0