Keepalived:构建高可用性的秘密武器
在IT领域,高可用性(High Availability,
HA)是指系统能够在长时间内持续正常运行而不间断的能力。随着信息化程度的提高,企业的IT系统承担了越来越多的核心业务功能,一旦系统出现故障或不可用,将会给企业带来严重的经济损失甚至声誉损失。因此,保障IT系统的高可用性对企业运营至关重要。Keepalived作为一款基于Linux平台的高可用性解决方案,通过虚拟路由冗余协议(VRRP)来实现负载均衡和故障转移功能,确保在服务器发生故障时,服务能够无缝切换,保持高可用性。本文将详细介绍Keepalived的基本概念、工作原理、配置方法以及实战案例。
一、Keepalived概述
Keepalived主要提供以下功能:
- 高可用性 :通过VRRP协议,Keepalived可以监控服务器的状态,并在主服务器故障时自动将服务切换到备份服务器,确保服务的连续性。
- 负载均衡 :Keepalived支持多种负载均衡算法,如轮询、最小连接等,有助于分散流量,提高服务的可用性和性能。
- 健康检查 :Keepalived能够定期对后端服务器进行健康检查,确保只有健康的服务器参与服务。
Keepalived的工作原理可以分为两部分:VRRP和健康检查。
- VRRP(Virtual Router Redundancy Protocol) :VRRP是一种选择协议,用于在多个路由器或服务器之间共享虚拟IP地址。在Keepalived中,通常有一个主服务器(Master)和一个或多个备份服务器(Backup)。主服务器负责处理所有通过虚拟IP地址的流量,而备份服务器处于待机状态。如果主服务器发生故障,备份服务器中的一个将被选举为新的主服务器,并接管虚拟IP地址,以确保服务的连续性。
- 健康检查 :Keepalived提供了多种健康检查机制,包括Layer3(基于IP地址的有效性)、Layer4(基于TCP端口的状态)和Layer5(基于HTTP GET请求的响应结果)等。通过这些检查机制,Keepalived能够实时评估后端服务器的健康状态,并在发现故障时及时将服务器从服务列表中剔除。
二、Keepalived的安装与配置
Keepalived的安装和配置相对简单,可以通过下载源代码编译安装或使用Linux发行版的包管理器进行安装。配置时,需要编写一个配置文件(通常为/etc/keepalived/keepalived.conf),其中包含了全局设置、VRRP实例定义、虚拟服务器设置等。
安装Keepalived
在基于Debian的系统上,可以使用以下命令安装Keepalived:
bash复制代码
sudo apt-get update
sudo apt-get install keepalived
在基于Red Hat的系统上,可以使用以下命令安装Keepalived:
bash复制代码
yum install -y keepalived
配置Keepalived
Keepalived的配置文件通常位于/etc/keepalived/keepalived.conf。以下是一个简单的配置示例:
bash复制代码
global_defs {
notification_email {
root@localhost
}
notification_email_from keep@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_mcast_group4 224.0.0.1
}
vrrp_instance VI_1 {
state BACKUP
interface eth1
virtual_router_id 1
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass qwe123
}
virtual_ipaddress {
1.1.1.100 dev eth1 label eth1:0
}
}
在配置文件中,需要定义全局设置(如邮件通知、路由器ID等),以及VRRP实例(如状态、网卡、虚拟路由器ID、优先级、认证信息等)。
三、Keepalived实战案例
以下是一个使用Keepalived实现Nginx高可用性的实战案例。
环境准备
准备两台虚拟机Server1和Server2,IP地址分别为192.168.229.11和192.168.229.12。关闭防火墙、SELinux,配置yum源等步骤请参考相关文档。
Server1配置
- 下载并安装Keepalived:
bash复制代码
yum -y install keepalived
- 创建/etc/keepalived目录,并编辑配置文件:
bash复制代码
vim /etc/keepalived/keepalived.conf
配置文件内容如下:
bash复制代码
global_defs {
router_id 1
}
vrrp_instance VI_1 {
state MASTER
interface ens33
mcast_src_ip 192.168.229.11
virtual_router_id 55
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.229.100/24
}
}
- 开机启动Keepalived和Nginx:
bash复制代码
systemctl enable keepalived.service
systemctl start keepalived.service
yum -y install nginx
systemctl enable nginx.service
systemctl start nginx.service
- 修改Nginx默认页面内容,方便测试:
bash复制代码
vim /usr/share/nginx/html/index.html
将内容修改为 web111111
。
Server2配置
- 下载并安装Keepalived:
bash复制代码
yum -y install keepalived
- 创建/etc/keepalived目录,并编辑配置文件:
bash复制代码
vim /etc/keepalived/keepalived.conf
配置文件内容如下:
bash复制代码
global_defs {
router_id 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
mcast_src_ip 192.168.229.12
virtual_router_id 55
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.229.100/24
}
}
- 开机启动Keepalived和Nginx:
bash复制代码
systemctl enable keepalived.service
systemctl start keepalived.service
yum -y install nginx
systemctl enable nginx.service
systemctl start nginx.service
- 修改Nginx默认页面内容,方便测试:
bash复制代码
vim /usr/share/nginx/html/index.html
将内容修改为 web222222
。
测试
- 访问VIP(对外虚拟IP) http://192.168.229.100,应该能够看到Server1的Nginx页面
web111111
。 - 拔掉Server1的网线,模拟主服务器故障。
- 再次访问VIP(对外虚拟IP) http://192.168.229.100,应该能够看到Server2的Nginx页面
web222222
,说明故障转移成功。
四、Keepalived对Nginx状态未知的解决方案
默认情况下,Keepalived监控的是接口IP状态,无法监控Nginx服务状态。因此,需要编辑一个脚本监控Nginx的状态。
- 在Server1和Server2上添加Nginx监控脚本:
bash复制代码
vim /etc/keepalived/ck_ng.sh
脚本内容如下:
bash复制代码
#!/bin/bash
# 检查nginx进程是否存在
counter=$(ps -C nginx --no-heading wc -l)
if [ "${counter}" = "0" ]; then
# 尝试启动一次nginx,停止5秒后再次检测
systemctl start nginx.service
sleep 5
counter=$(ps -C nginx --no-heading wc -l)
if [ "${counter}" = "0" ]; then
exit 1
fi
fi
exit 0
- 赋予脚本权限:
bash复制代码
chmod +x /etc/keepalived/ck_ng.sh
- 修改Keepalived配置文件,引用监控脚本:
在vrrp_instance部分添加 track_script
:
bash复制代码
track_script {
chk_nginx
}
- 重启Keepalived:
bash复制代码
systemctl restart keepalived.service
通过以上步骤,Keepalived将能够监控Nginx的状态,并在Nginx服务故障时进行相应的处理。
五、总结
Keepalived是一个