1. Keepalived 概念
- 解决单点故障
- 组件免费
- 可以实现高可用HA机制
- 基于VRRP协议
虚拟路由冗余协议 VRRP
Virtual Router Redundancy Protocol
解决内网单机故障的路由协议
构建有多个路由器 MASTER BACKUP
虚拟IP - VIP(Virtual IP Address)
2. Keepalived 双机主备原理
Keepalived实现高可用服务之间故障转移、故障切换的本质就是通过VRRP协议实现
主节点向备用节点定期发送心跳检测,如备用机未收到心跳信息,判断主节点停机,则接管主节点
3. 安装 Keepalived
- 首先去官网下载安装包
Keepalived官网 - 上传安装包至服务器并解压
tar -zxvf keepalived-2.0.20.tar.gz - 使用
configure命令配置安装目录与核心配置文件所在位置./configure --prefix=/usr/local/keepalived --sysconf/etc配置过程中可能会出现警告信息,如下所示
PVS with IPv6. Please install libnl/libnl-3 dev libraries to support...
安装 libnl/libnl-3依赖yum -y install libnl libnl-devel
重新configure一下 - 安装keepalived
make && make install - 查看keepalived目录
whereis keepalived配置文件 /etc/keepalived/keepalived.conf
4. 配置 keepalived
假设当前内网ip地址:192.168.1.171
global_defs {
# 路由id:当前安装keepalived节点主机的标识符,全局唯一
router_id keep_171
}
# 计算机节点
vrrp_instance VI_1 {
# 表示的状态,当前为主节点,MASTER/BACKUP
state MASTER
# 当前实例绑定的网卡(需要根据实际网卡名配置)
interface eth0
# 保证主备节点一致
virtual_router_id 51
# 优化级/权重,谁的优先级高,在MASTER挂掉以后,就能成为MATER
priority 100
# 主备之间同步检查的时间间隔,默认1s
avert_int 1
# 认证授权的密码,防止非法节点的进入
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟ip地址
virtual_ipaddress {
192.168.1.161
}
}
5. 启动 keepalived
cd /usr/local/keepalived/sbin/
./keepalived
ip addr,查看当前网络信息
此时会多一个虚拟ip:192.168.1.161(上方配置)
6. 把 keepalived 注册为系统服务
在此操作之前,应停用已启动的 keepalived 进程
把相应配置文件拷贝至系统目录
- 在 keepalived 软件包解压后的根目录,进入keepalived/etc/目录
cd keepalived/etc
# 拷贝文件
cp init.d/keepalived /etc/init.d/
cp sysconfig/keepalived /etc/sysconfig/
# 刷新系统配置
systemctl daemon-reload
# 启动
systemctl start keepalived.service
# 重启
systemctl restart keepalived.service
# 停止
systemctl stop keepalived.service
至此,已成功注册为系统服务
7. Keepalived 实现双机主备高可用
上面我们已经配置了主节点MASTER,接下来配置备用节点BACKUP
在另一台服务器上安装 keepalived,步骤和上方主节点一致,就不再赘述
- 配置备节点 keepalived
vim /etc/keepalived/keepalived.conf假设当前内网ip地址:192.168.1.172
global_defs {
# 路由id:当前安装keepalived节点主机的标识符,全局唯一
router_id keep_172
}
# 计算机节点
vrrp_instance VI_1 {
# 表示的状态,当前为主节点,MASTER/BACKUP
state BACKUP
# 当前实例绑定的网卡(需要根据实际网卡名配置)
interface eth0
# 保证主备节点一致
virtual_router_id 51
# 优化级/权重,谁的优先级高,在MASTER挂掉以后,就能成为MATER
priority 80
# 主备之间同步检查的时间间隔,默认1s
avert_int 1
# 认证授权的密码,防止非法节点的进入
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟ip地址
virtual_ipaddress {
192.168.1.161
}
}
- 启动 keepalived
cd /usr/local/keepalived/sbin/
./keepalived
7.1 测试 keepalived 双机主备高可用
上面我们已经配置了两台 keepalived, 主备节点
主:192.168.1.171
备:192.168.1.172
虚拟ip:192.168.1.161测试方法:
停用主节点,观察主备节点ip addr,是否有虚拟ip:192.168.161,
再启动主节点,观察主备节点ip addr,是否有虚拟ip:192.168.161,
有虚拟ip的一方,为正常绑定运行方
8. Keepavlied 配置Nginx自动重启
当前主备双机可用仅能作为 keepalived 节点服务,当Nginx发生故障,并不能保证服务的可用
所以接下来让 keepalived 保证 nginx 的运行,实现7x24不间断服务
- 增加 Nginx 重启检测脚本
cd /etc/keepalived
vim check_nginx_alive_or_not.sh
#!/bin/bash
A=`ps -C nginx --no-header | wc,-1`
# 判断nginx是否宕机,如果宕机了,尝试重启
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
# 等待一小会儿再次检查nginx, 如果没有启动成功,则停止keepalived, 使其启动备用机
sleep 3
if[ `ps -C nginx --no--header | wc -1` -eq 0 ];then
killall keepalived
fi
fi
- 增加运行权限
chmod +x /etc/keepavlied/check_nginx_alive_or_not.sh
- 配置 keepalived 监听 nginx 脚本
vrrp_script check_nginx_alive {
script "/etc/keepalived/check_nginx_alive_or_not.sh"
interval 2 # 每隔2秒运行上一行脚本
weight 10 # 如果脚本运行成功,则升级权重+10
# weight -10 # 如果脚本运行失败,则升级权重-10
}
# 计算机节点
vrrp_instance VI_1 {
# 省略其它内容
track_script {
check_nginx_alive # 追踪 nginx 脚本
}
}
- 重启 keepalived 使配置文件生效
systemctl restart keepalived
9. Keepalived 实现双主热备高可用
前面我们实现了双机主备,这种架构从成本上来说,是不太经济的
因为,主、备机硬件配置上一致,都是生产级,如果主机一致很稳定,那么会造成备用机的资源浪费
解决:Keepalived 实现双主热备高可用
如下图,以DNS作负载均衡,保证双机互为主备,一方面保证了服务的高可用,另一方面提高资源的利用率
9.1. 配置 Keepalived 双主热备
规则:以一个虚拟ip分组归为同一个路由
- 主节点配置
global_defs {
# 路由id:当前安装keepalived节点主机的标识符,全局唯一
router_id keep_171
}
# 计算机节点
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
avert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.161
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 52
priority 80
avert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.162
}
}
- 备用节点配置
global_defs {
router_id keep_172
}
# 计算机节点
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 80
avert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.161
}
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 52
priority 100
avert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.162
}
}
10. 总结
以上,我们利用 keepalived,分别实现了双机主备、双主热备,应对大环境的高可用架构

