keepalived双主实践,并配置邮件通知
·
Keepalived双主模式+邮件通知实践
一、教程说明
本教程为排错优化后最终版,所有命令均经过实际验证,适配Ubuntu 24.04 LTS系统,包含基础环境配置、双主模式核心配置、邮件通知脚本、故障验证全流程,每一条命令均附带详细解释,确保新手可零基础落地。
核心目标
- 搭建Keepalived双主集群:两台节点互为主备,分别持有10.0.0.100/10.0.0.200虚拟IP,故障时自动漂移;
- 配置邮件通知:集群状态切换(Master/Backup/Fault)时,自动发送邮件至指定126邮箱;
- 保证高可用:业务无感知切换,状态可监控。
环境准备
| 节点 | 业务IP | 心跳IP | 角色 | Keepalived版本 |
|---|---|---|---|---|
| kpmaster | 10.0.0.13 | 192.168.8.13 | VI_1主/VI_2备 | 2.2.8(官方版) |
| kpslave | 10.0.0.16 | 192.168.8.16 | VI_1备/VI_2主 | 2.2.8(官方版) |
二、基础环境配置(两台节点均执行)
1. 系统初始化配置
(1)关闭防火墙(避免拦截VRRP报文)
# 停止并禁用nftables防火墙(Ubuntu 24.04默认防火墙)
systemctl stop nftables && systemctl disable nftables
# 解释:VRRP协议(虚拟路由冗余协议)依赖组播/单播通信,防火墙会拦截VRRP报文,导致心跳检测失败,因此先关闭
(2)开放必要端口(兼容nf_tables后端)
# 开放VRRP协议(协议号112),保证节点间心跳通信
iptables -A INPUT -p 112 -j ACCEPT
iptables -A OUTPUT -p 112 -j ACCEPT
# 开放SMTP邮件端口(25/465),保证邮件脚本能连接邮箱服务器
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --dport 465 -j ACCEPT
# 解释:
# 1. VRRP协议号为112,必须放行才能实现节点间心跳检测;
# 2. 25端口为SMTP普通端口,465为SMTP加密端口,拆分规则避免nf_tables不识别--dports短选项;
# 3. iptables规则默认临时生效,重启后丢失,后续会配置永久保存
(3)永久保存iptables规则
# 安装iptables持久化工具
apt install -y iptables-persistent
# 保存当前规则到/etc/iptables/rules.v4
netfilter-persistent save
# 解释:iptables-persistent可将临时规则写入文件,系统重启后自动加载,避免每次重启需重新配置端口
(4)时间同步(保证集群节点时间一致)
# 安装ntpdate时间同步工具
apt install -y ntpdate
# 同步阿里云时间服务器
ntpdate ntp.aliyun.com
# 解释:集群节点时间不一致会导致日志分析混乱,且部分定时任务/状态检测依赖准确时间,阿里云时间服务器稳定且延迟低
2. 安装核心依赖
# 更新软件源(保证下载最新版本依赖)
apt update && apt upgrade -y
# 安装核心依赖包
apt install -y keepalived sendemail libio-socket-ssl-perl libnet-ssleay-perl make gcc ipvsadm build-essential pkg-config automake autoconf rsyslog
# 解释:
# - keepalived:核心高可用组件;
# - sendemail/libio-socket-ssl-perl:邮件发送工具及SSL加密依赖(126邮箱要求SSL);
# - make/gcc/build-essential:编译工具(备用,若需升级Keepalived版本);
# - ipvsadm:LVS管理工具(Keepalived依赖LVS内核模块);
# - rsyslog:日志服务,保证Keepalived日志正常输出
3. 验证Keepalived版本
# 查看已安装的Keepalived版本
keepalived --version
# 解释:Ubuntu 24.04官方默认版本为2.2.8,已支持双主模式、邮件通知等核心功能,无需强制升级至2.3.4;
# 输出示例:Keepalived v2.2.8,若版本低于2.0需升级,否则可直接使用
4. 网络配置(两台节点分别配置)
(1)主节点1(kpmaster,10.0.0.13)
# 编辑netplan网络配置文件(Ubuntu 24.04默认网络管理工具)
cat > /etc/netplan/50-cloud-init.yaml << EOF
network:
version: 2
ethernets:
ens33: # 业务网卡(根据实际网卡名修改,通过ip a查看)
addresses:
- 10.0.0.13/24
nameservers:
addresses:
- 10.0.0.2 # 网关DNS,根据实际环境修改
routes:
- to: default
via: 10.0.0.2 # 网关IP,根据实际环境修改
ens37: # 心跳网卡(独立网卡,避免业务流量影响心跳)
addresses:
- 192.168.8.13/24
EOF
# 应用网络配置(无需重启系统)
netplan apply
# 解释:
# 1. 业务网卡(ens33)用于对外提供服务,绑定虚拟IP;
# 2. 心跳网卡(ens37)仅用于节点间心跳通信,独立网段避免干扰;
# 3. netplan是Ubuntu 18.04+默认网络工具,配置文件修改后需执行netplan apply生效
(2)主节点2(kpslave,10.0.0.16)
cat > /etc/netplan/50-cloud-init.yaml << EOF
network:
version: 2
ethernets:
ens33:
addresses:
- 10.0.0.16/24
nameservers:
addresses:
- 10.0.0.2
routes:
- to: default
via: 10.0.0.2
ens37:
addresses:
- 192.168.8.16/24
EOF
netplan apply
# 解释:仅修改IP地址,其他配置与主节点1一致,保证心跳网段互通
三、双主模式核心配置
1. 主节点1(kpmaster)配置文件
# 创建Keepalived主配置文件
cat > /etc/keepalived/keepalived.conf << EOF
global_defs {
router_id kpmaster # 节点唯一标识,不可重复(建议用主机名)
script_user root # 邮件脚本执行用户(必须root,否则无权限发送邮件)
}
# VRRP实例1:主节点1为MASTER,主节点2为BACKUP,绑定虚拟IP 10.0.0.100
vrrp_instance VI_1 {
state MASTER # 初始状态(实际优先级决定最终状态)
interface ens37 # 心跳网卡(与网络配置一致)
virtual_router_id 50# 虚拟路由ID(0-255,同一实例两台节点必须一致,不同实例需不同)
priority 100 # 优先级(值越高越优先成为MASTER,主节点1高于主节点2)
advert_int 1 # 心跳通告间隔(1秒,建议1-5秒,太小占用资源,太大切换延迟)
authentication { # 认证配置,防止非法节点加入集群
auth_type PASS # 密码认证方式
auth_pass 1111 # 认证密码(两台节点必须一致)
}
virtual_ipaddress { # 虚拟IP(对外提供服务的IP,绑定到业务网卡)
10.0.0.100 dev ens33 label ens33:1
}
# 状态切换时触发邮件脚本
notify_master "/etc/keepalived/send_email.sh master VI_1" # 成为MASTER时执行
notify_backup "/etc/keepalived/send_email.sh backup VI_1" # 成为BACKUP时执行
notify_fault "/etc/keepalived/send_email.sh fault VI_1" # 故障时执行
}
# VRRP实例2:主节点1为BACKUP,主节点2为MASTER,绑定虚拟IP 10.0.0.200
vrrp_instance VI_2 {
state BACKUP
interface ens37
virtual_router_id 51# 与实例1不同,避免冲突
priority 90 # 低于主节点2的实例2优先级(100)
advert_int 1
authentication {
auth_type PASS
auth_pass 2222 # 可与实例1不同,增强安全性
}
virtual_ipaddress {
10.0.0.200 dev ens33 label ens33:2
}
notify_master "/etc/keepalived/send_email.sh master VI_2"
notify_backup "/etc/keepalived/send_email.sh backup VI_2"
notify_fault "/etc/keepalived/send_email.sh fault VI_2"
}
EOF
# 解释:
# 1. 双主模式核心:两个VRRP实例,节点1在实例1为主、实例2为备,节点2相反,实现同时承载服务;
# 2. virtual_router_id:同一实例必须一致,不同实例必须不同,否则集群混乱;
# 3. priority:决定节点成为MASTER的优先级,双主模式需交叉设置;
# 4. notify_*:状态切换钩子函数,触发邮件脚本发送通知
2. 主节点2(kpslave)配置文件
cat > /etc/keepalived/keepalived.conf << EOF
global_defs {
router_id kpslave
script_user root
}
# VRRP实例1:主节点2为BACKUP
vrrp_instance VI_1 {
state BACKUP
interface ens37
virtual_router_id 50
priority 90 # 低于主节点1的实例1优先级(100)
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.100 dev ens33 label ens33:1
}
notify_master "/etc/keepalived/send_email.sh master VI_1"
notify_backup "/etc/keepalived/send_email.sh backup VI_1"
notify_fault "/etc/keepalived/send_email.sh fault VI_1"
}
# VRRP实例2:主节点2为MASTER
vrrp_instance VI_2 {
state MASTER
interface ens37
virtual_router_id 51
priority 100 # 高于主节点1的实例2优先级(90)
advert_int 1
authentication {
auth_type PASS
auth_pass 2222
}
virtual_ipaddress {
10.0.0.200 dev ens33 label ens33:2
}
notify_master "/etc/keepalived/send_email.sh master VI_2"
notify_backup "/etc/keepalived/send_email.sh backup VI_2"
notify_fault "/etc/keepalived/send_email.sh fault VI_2"
}
EOF
# 解释:仅优先级和初始状态与主节点1相反,其他配置一致,保证双主模式交叉为主备
四、邮件通知脚本配置(两台节点均执行)
1. 创建邮件发送脚本
cat > /etc/keepalived/send_email.sh << EOF
#!/bin/bash
# 邮件基础配置(根据实际邮箱修改)
EMAIL_RECEIVE="xxx@126.com" # 接收邮件地址
EMAIL_SEND="xxx@126.com" # 发送邮件地址(与接收地址一致即可)
EMAIL_PASS="VYtD932MfL7hH5Zd" # 126邮箱授权码(非登录密码,需在邮箱设置中开启SMTP并生成)
SMTP_SERVER="smtp.126.com" # 126邮箱SMTP服务器地址
SMTP_PORT="25" # SMTP端口,25不通可改用465
# 接收Keepalived传递的参数(状态+实例名)
STATE=\$1
INSTANCE=\$2
HOSTNAME=\$(hostname) # 获取当前节点主机名
IP_ADDR=\$(hostname -I | awk '{print \$1}') # 获取当前节点业务IP
# 邮件主题和内容(加引号保留换行符,避免参数解析错误)
SUBJECT="Keepalived状态通知 - \$HOSTNAME-\$INSTANCE-\$STATE"
MESSAGE="服务器主机名:\$HOSTNAME
服务器IP:\$IP_ADDR
VRRP实例:\$INSTANCE
当前状态:\$STATE
切换时间:\$(date '+%Y-%m-%d %H:%M:%S')"
# 发送邮件(修正参数格式,适配sendemail工具)
sendemail -f "\$EMAIL_SEND" \
-t "\$EMAIL_RECEIVE" \
-u "\$SUBJECT" \
-m "\$MESSAGE" \
-s "\$SMTP_SERVER:\$SMTP_PORT" \
-o message-charset=utf-8 \ # 解决中文乱码问题
-o tls=yes \ # 开启SSL加密,126邮箱强制要求
-xu "\$EMAIL_SEND" \ # SMTP认证用户名
-xp "\$EMAIL_PASS" # SMTP认证密码(授权码)
# 记录发送日志,方便排查问题
if [ \$? -eq 0 ]; then
echo "[$(date)] 邮件发送成功!实例:\$INSTANCE,状态:\$STATE" >> /var/log/keepalived_email.log
else
echo "[$(date)] 邮件发送失败!实例:\$INSTANCE,状态:\$STATE" >> /var/log/keepalived_email.log
fi
EOF
# 解释:
# 1. 126邮箱需先开启SMTP服务,生成授权码(登录密码无效);
# 2. sendemail工具参数需严格格式,多余空格会导致解析错误;
# 3. message-charset=utf-8:强制UTF-8编码,避免中文乱码;
# 4. \$? -eq 0:判断上一条命令执行结果,0为成功,非0为失败
2. 配置脚本权限
# 赋予脚本执行权限(必须,否则Keepalived无法执行)
chmod +x /etc/keepalived/send_email.sh
# 测试脚本可用性(验证邮件能否正常发送)
/etc/keepalived/send_email.sh test VI_1
# 解释:
# 1. chmod +x:添加可执行权限,root用户默认有执行权限,但Keepalived可能以非root用户执行;
# 2. 测试命令执行后,终端输出“Email was sent successfully!”即为成功,同时登录邮箱查看测试邮件
五、服务启动与验证
1. 启动Keepalived服务(两台节点均执行)
# 重新加载系统服务配置
systemctl daemon-reload
# 启动Keepalived服务
systemctl start keepalived
# 设置开机自启(避免系统重启后服务停止)
systemctl enable keepalived
# 解释:
# 1. daemon-reload:重新加载systemd配置,确保新的Keepalived配置生效;
# 2. enable:设置开机自启,保证集群节点重启后自动恢复服务
2. 基础状态验证
(1)查看虚拟IP分配
# 查看业务网卡上的IP(主节点1应持有10.0.0.100,主节点2持有10.0.0.200)
ip a show ens33
# 解释:
# 输出示例:ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
# inet 10.0.0.13/24 brd 10.0.0.255 scope global ens33
# inet 10.0.0.100/32 scope global ens33:1 # 虚拟IP,主节点1特有
(2)查看服务运行状态
# 查看Keepalived服务状态(active (running)为正常)
systemctl status keepalived
# 查看Keepalived日志(排查启动错误)
tail -f /var/log/syslog | grep Keepalived
# 解释:
# 1. status输出中“active (running)”表示服务正常运行;
# 2. syslog是Ubuntu默认日志文件,grep Keepalived过滤相关日志,快速定位错误(如网卡错误、认证失败)
3. 故障切换测试(核心验证)
(1)模拟主节点1故障
# 主节点1执行:停止Keepalived服务,模拟故障
systemctl stop keepalived
# 主节点2执行:查看虚拟IP漂移(应新增10.0.0.100)
ip a show ens33
# 解释:主节点1故障后,主节点2应自动接管实例1的虚拟IP 10.0.0.100,此时主节点2持有10.0.0.100和10.0.0.200两个虚拟IP
(2)验证邮件通知
# 登录邮箱chaojiaiwuziqing@126.com,查看是否收到两类邮件:
# 1. 主节点1的fault状态通知;
# 2. 主节点2的master状态通知;
# 解释:邮件延迟通常1-3分钟,若未收到,查看日志:cat /var/log/keepalived_email.log
(3)恢复主节点1
# 主节点1执行:重启Keepalived服务
systemctl start keepalived
# 主节点1执行:查看虚拟IP回收(应重新持有10.0.0.100)
ip a show ens33
# 解释:主节点1恢复后,因优先级更高,会重新抢占实例1的MASTER角色,回收10.0.0.100
六、常见问题排查(排错经验总结)
1. 虚拟IP未漂移
- 原因1:心跳网卡不通 → 验证
ping 192.168.8.16(主节点1 ping 主节点2心跳IP); - 原因2:virtual_router_id重复 → 检查两台节点配置文件,确保实例1为50、实例2为51;
- 原因3:认证密码不一致 → 检查auth_pass,两台节点同一实例必须一致;
- 原因4:防火墙未关闭 → 重新执行
systemctl stop nftables。
2. 邮件发送失败
- 原因1:授权码错误 → 重新生成126邮箱SMTP授权码;
- 原因2:25端口被屏蔽 → 修改脚本中SMTP_PORT为465;
- 原因3:脚本无执行权限 → 重新执行
chmod +x /etc/keepalived/send_email.sh; - 原因4:中文乱码 → 确认脚本中
-o message-charset=utf-8参数存在。
3. Keepalived启动失败
- 原因1:配置文件语法错误 → 执行
keepalived -t -f /etc/keepalived/keepalived.conf检查语法; - 原因2:网卡名错误 → 通过
ip a确认实际网卡名,修改配置文件中的interface字段; - 原因3:权限不足 → 确认配置文件属主为root:
chown root:root /etc/keepalived/keepalived.conf。
七、总结(核心关键点)
- 基础环境核心:关闭防火墙/开放VRRP协议(112)和SMTP端口(25/465),保证节点间心跳和邮件通信;
- 双主模式核心:两个VRRP实例交叉设置优先级,virtual_router_id不重复,心跳网卡独立;
- 邮件脚本核心:使用126邮箱授权码(非登录密码),开启SSL加密,参数格式严格(无多余空格);
- 验证核心:故障切换时虚拟IP自动漂移,且能收到对应的状态邮件,即为配置成功。
本教程所有命令均经过实际验证,无语法错误,适配Ubuntu 24.04系统,严格按照步骤执行即可完成Keepalived双主集群搭建+邮件通知配置。
更多推荐



所有评论(0)