1. 前言
这种配置需求比较少见,在网上也很少有相关文章,于是记录在此,供有需要的朋友参考。
本篇重点介绍配置的关键点,基础部分简单提及,不赘述。
2. 需求描述
如上图,即给两个主机配置两对高可用主从配置。
3. 配置步骤
3.1 安装Keepalived
3.1.1 官网下载安装包
https://www.keepalived.org/download.html
之后将安装包上传到服务器上。
如果服务器可直连外网,那么可直接使用wget进行下载。
wget https://www.keepalived.org/software/keepalived-2.3.3.tar.gz
3.1.2 在主机上解压包
tar -xzvf keepalived-2.3.3.tar.gz
在主机上安装keepalived
mkdir -p ~/keepalived # 新建一个空目录,为keepalived需要安装到的目录
cd keepalived-2.3.3 # 进入解压后的源码目录
./configure --prefix=~/keepalived
sudo make && sudo make install
configure
的prefix
参数,指定了keepalived安装的目录,在指定之前,需要新建该目录。
3.2 配置nginx检查脚本
mkdir -p /home/wingaso/keepalived/log # 新建一个存储日志的目录
cd /home/wingaso/keepalived/etc/keepalived
该目录下有一个keepalived.conf.sample文件。
我们在这个目录下新建一个check_ng.sh
文件,其中填写如下内容(注意将以下脚本中的目录改为你服务器上的对应目录)
#/bin/sh
d=`date +%Y%m%d%H%M`;
n=`ps -C nginx --no-heading|wc -l`;
if [ $n -eq "0" ]; then
/home/wingaso/nginx/sbin/nginx;
n2=`ps -C nginx --no-heading|wc -l`;
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop">>/home/wingaso/keepalived/log/check_ng.log;
sudo systemctl stop keepalived;
fi
fi
3.3 配置keepalived.conf
分别进入两个主机,进入keepalived/etc/keepalived
目录(即keepalived.conf.sample),新建keepalived.conf文件。
3.3.1 主机1配置
vrrp_script chk_nginx {
script "/home/wingaso/keepalived/etc/keepalived/check_ng.sh"
interval 3 # 每3秒执行一次脚本
}
vrrp_instance VIP_A_GROUP { # VIP A(渠道1)的主备组
state MASTER
interface eth0 # 绑定网卡A
virtual_router_id 51 # 虚拟路由ID,同一组主备必须相同,不同组需唯一
priority 105 # 优先级105(需高于同一组的备节点)
advert_int 1 # 主备心跳间隔1秒
authentication {
auth_type PASS # 使用密码认证
auth_pass 密码A
}
virtual_ipaddress {
Vip1/24
}
track_script { # 绑定健康检查脚本
chk_nginx
}
}
vrrp_instance VIP_B_GROUP { # VIP B(渠道2)的主备组
state BACKUP
interface eth1 # 绑定网卡B
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 密码B
}
virtual_ipaddress {
Vip2/24
}
track_script {
chk_nginx
}
}
3.3.2 主机2配置
vrrp_script chk_nginx {
script "/home/wingaso/keepalived/etc/keepalived/check_ng.sh"
interval 3
}
vrrp_instance VIP_A_GROUP { # VIP A(渠道1)的主备组
state BACKUP
interface eth0 # 绑定网卡C
virtual_router_id 51 # 必须与A组相同
priority 100 # 低于A的优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 密码A
}
virtual_ipaddress {
Vip1/24
}
track_script {
chk_nginx
}
}
vrrp_instance VIP_B_GROUP { # VIP B(渠道2)的主备组
state MASTER
interface eth1 # 绑定网卡D
virtual_router_id 52 # 必须与B组相同
priority 105 # 高于B的优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 密码B
}
virtual_ipaddress {
Vip2/24
}
track_script {
chk_nginx
}
}
部分参数的含义已在以上配置中进行注明,不赘述。
3.3.3 配置细节
3.3.3.1 网卡名查看
至于网卡名的查看,可以通过以下命令
ip a # 即 ip address的缩写
如下所示,其中蓝色框项为回环接口,下边两红色框为网卡1和网卡2。
3.3.3.2 Vip与网卡对应
VIP需与 对应网卡在同一子网,例如,假设 eth0
网卡的IP为 192.168.1.10/24(即子网掩码 255.255.255.0),其子网范围是 192.168.1.0 ~ 192.168.1.255。
此时,VIP(例如可取192.168.1.100/24)必须在此范围内,否则无法直接通过 eth0 网卡通信。
为什么VIP要和网卡在同一子网?
- ARP协议依赖:当其他设备访问VIP时,会通过ARP协议(地址解析协议)广播查询“哪个设备的MAC地址对应VIP”。如果VIP与网卡在同一子网,Keepalived节点可以正常响应ARP请求,声明自己持有该VIP。若不在同一子网,ARP请求无法到达目标子网,其他设备无法找到VIP对应的MAC地址,导致VIP不可达。
- 路由限制:默认情况下,操作系统只允许在同一子网内绑定额外的IP地址(即VIP)。如果VIP跨子网,需额外配置路由规则,否则数据包无法正确发送到VIP。
3.4 启动服务
sudo systemctl start keepalived
之后可以通过检查启动状态,确认配置是否存在问题。
sudo systemctl status keepalived
如果无异常,则显示如下所示:
3.5 验证
3.5.1 验证配置文件语法
cd /home/wingaso/keepalived/sbin
./keepalived -t -n -p -f=/home/wingaso/keepalived/etc/keepalived/keepalived.conf
-t
:仅检查配置文件语法。
-n
:不进入后台运行(直接输出错误)。
-f
:指定配置文件路径。
如果配置无异常,则输出的结果为
Configuration file is valid
或者
SECURITY VIOLATION - scripts are being executed but script_security not enabled.
第二种输出情况,是因为我们配置了自定义脚本,但未启用脚本执行的安全权限控制,仅是一个警告,实际配置没有异常。
可以考虑增加以下配置(三选一),或者直接忽略该警告。
global_defs {
script_security system # 允许以系统用户身份执行脚本(推荐)
# script_security sudo # 或以 sudo 权限执行(需配置sudo权限)
# script_security off # 或完全关闭安全限制(不推荐)
}
3.5.2 检查ip绑定情况
在Keepalived启动无异常后,输入以下命令检查Vip绑定情况。
ip addr
正常情况下,会在输出中看到对应的Vip1和Vip2。
主机1中,网卡A绑定了Vip1:
主机2中,网卡D绑定了Vip2:
3.5.3 测试VIP漂移(主备切换)
3.5.3.1 手动停止主节点的Keepalived
在主机1运行
systemctl stop keepalived
在主机2使用ip addr
命令查看Vip情况如下:
渠道2验证方式同理。
3.5.3.2 模拟健康检查失败
备份原check_ng.sh,然后将check_ng.sh脚本暂时改为强制返回异常。如下
#!/bin/sh
exit 1
之后通过ip addr
命令,查看ip浮动情况。
3.5.3.3 通过Vip访问服务
curl http://Vip1:80 # 替换为实际VIP和端口
nginx接收并返回预期结果,则为正常。
3.6 日志检查
检查命令如下:
tail -f /var/log/messages | grep keepalived # CentOS
tail -f /var/log/syslog | grep keepalived # Ubuntu
3.7 其他问题
3.7.1 频繁主备切换问题
如网络抖动或检查间隔太短,可能会出现频繁主备切换的情况,此时可通过调大keepalived.conf中的参数 interval
(脚本检查间隔) 和 advert_int
(主备心跳间隔)解决。
原创,引用请注明。