Keepalived 详解
一、Keepalived 概述
Keepalived 主要用于实现高可用性(High Availability)和负载均衡。它最初是为 LVS (Linux Virtual Server)设计的
二、核心工作原理
Keepalived 的核心是基于 VRRP (Virtual Router Redundancy Protocol) 协议:
- VRRP 协议:VRRP虚拟路由器冗余协议,最开始是给网络设备实现高可用.目前keepalive实现vrrp协议,通过vrrp实现高可用
- 主备选举:一般是2个节点.主备之间通过vrrp协议发送数据包沟通,
- 状态切换:主给备定期发送数据包,备收到数据包表示主还活着,备无法收到数据包,表示主挂了,备胎转正了,接管用户请求流量.
三、快速上手
1,环境准备
| 高可用服务器 | 部署服务 |
|---|---|
| kp01 | nginx+keepalived |
| kp02 | nginx+keepalived |
2. 安装
在基于 RPM(centos)的系统上:
yum install keepalived -y
在基于 Debian(ubuntu) 的系统上:
apt-get install keepalived -y
3. 配置文件结构
主配置文件通常位于 /etc/keepalived/keepalived.conf,包含三个主要部分:
! Configuration File for keepalived
global_defs { ##现在用的主要配置1
# 全局配置
}
vrrp_instance VI_1 { ####现在用的主要配置2
# VRRP 实例配置
}
virtual_server 192.168.200.100 80 {
# 虚拟服务器配置(用于负载均衡)
}
#全局定义部分
global_defs {
router_id kp01 #每一个keepalived的名字,当前网络中唯一.
}
#vrrp实例配置部分 用于配置VIP 设置主备 virtual_ipaddress #vrrp设置名字.
vrrp_instance vip_3 { #vrrp实例名字 在同1对主备之间要一致.
state MASTER #主/备 MASTER主 BACKUP备 大写
interface eth0 #指定网卡网卡
virtual_router_id 51 # 同1对主备之间这个id要一致.
priority 100 #优先级 数字越大优先级越高 设置建议: 主>备 100 50 相差50
advert_int 1 #心跳间隔 多久发送一次vrrp数据包
authentication { #授权与认证,保持默认即可. 对数据包加密.
auth_type PASS #简单认证
auth_pass 1111 #1111
}
virtual_ipaddress { #设置vip※※※※
10.0.0.3 dev eth0 label eth0:0 #label 设置了别名,打标签
}
}
四、配置示例
1. kp01基础主配置
Master 节点配置:
global_defs {
router_id kp01
}
vrrp_instance vip_3 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3 dev eth0 label eth0:0
}
}
2.kp02基础备配置
backup 节点配置:
global_defs {
router_id kp02
}
vrrp_instance vip_3 {
state BACKUP
interface eth0
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3 dev eth0 label eth0:0
}
}
五,案例:keepalived基于主机高可用软件
问题:
keepalived只会在主机挂了,网络断开后,才会进行主备切换,默认情况下keepalived不会监控某个服务
实现目标:
1️⃣某个服务关闭了,keepalived就进行主备切换
情景:kp01和kp02做了web平台的访问入口。假如kp01的nginx挂了则使用kp02的nginx访问
实现方式:通过脚本监控nginx的80端口
脚本:
#!/bin/bash
#vars
port=80
port_count=`ss -lntup |grep -w "$port"|wc -l`
if [$port_count -eq 0 ];then
systemctl stop keepalived
fi
- 脚本执行的配置文件
cat /etc/keepalived/keepalived.conf
global_defs {
router_id kp01
}
#定义监控脚本
vrrp_script keep_lb.sh { ###定义名及字脚本
script /server/scripts/keep_lb.sh #脚本路径
interval 2 #权重
weight 1
user root #执行用户
}
vrrp_instance vip_3 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3 dev eth0 label eth0:0
}
#这个vrrp实例使用 keep_lb.sh 脚本.
track_script { ##引用脚本
keep_lb.sh
}
}
六,脑裂故障处理
现象: 主备都有vip
原因:
- 备认为主挂了,接管资源生成VIP.实际上主并没有挂,仍有VIP
- 有很多原因可以导致脑裂,开火墙 ,selinux,keepalived ,物理线路(网络介质)
解决方法:
- 1,监控(备节点监控),只要备节点有vip就告警
- 2.监控备节点只要有vip,远程控制主节点,只要备节点认为主挂了,那就让他真的挂了
七,非抢占模式
- keepalived 主备默认是抢占式,主挂了,备接管.主恢复,不希望主重新抢回资源
- 配置非抢占式模式即可
1、2个节点状态是备
2、配置nopreempt选项
配置方法:两台都配成bacup,以及配置上nopreempt

八、双主模式
1.基本架构:
- 服务器A:作为VIP1的主节点,VIP2的备份节点
- 服务器B:作为VIP2的主节点,VIP1的备份节点

2.环境准备
假设有两台服务器:
- 服务器A:192.168.1.101(优先级100)
- 服务器B:192.168.1.102(优先级90)
- 虚拟IP1(VIP1):192.168.1.100(用于Web服务)
- 虚拟IP2(VIP2):192.168.1.200(用于数据库服务)
3.服务器A配置 (/etc/keepalived/keepalived.conf)
global_defs {
router_id LVS_DEVEL_A
}
vrrp_instance VI_1 { # 第一个VRRP实例 - VIP1
state MASTER
interface eth0
virtual_router_id 51 # 必须与服务器B的VIP1配置相同
priority 100 # 比服务器B高
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100/24
}
}
vrrp_instance VI_2 { # 第二个VRRP实例 - VIP2
state BACKUP
interface eth0
virtual_router_id 52 # 必须与服务器B的VIP2配置相同
priority 90 # 比服务器B低
advert_int 1
authentication {
auth_type PASS
auth_pass 2222 # 可以与第一个实例不同
}
virtual_ipaddress {
192.168.1.200/24
}
}
4.服务器B配置 (/etc/keepalived/keepalived.conf)
“`bash
global_defs {
router_id LVS_DEVEL_B
}
vrrp_instance VI_1 { # 第一个VRRP实例 – VIP1
state BACKUP
interface eth0
virtual_router_id 51 # 必须与服务器A的VIP1配置相同
priority 90 # 比服务器A低
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100/24
}
}
vrrp_instance VI_2 { # 第二个VRRP实例 – VIP2
state MASTER
interface eth0
virtual_router_id 52 # 必须与服务器A的VIP2配置相同
priority 100 # 比服务器A高
advert_int 1
authentication {
auth_type PASS
auth_pass 2222
}
virtual_ipaddress {
192.168.1.200/24
}
}

