rsyslog本地双机高可用通过keepalived实现vip漂移主备切换,主节点故障时备机秒级接管,客户端使用tcp双目标+磁盘队列确保日志不丢;主备配置完全一致,按源ip分目录存储,避免切换后格式错乱。

用 rsyslog 实现本地双机日志同步并达到高可用冗余,核心不是“双机同步”本身,而是构建一个具备故障接管能力的日志接收体系——即一台主服务器正常收日志,另一台作为热备,主挂了备立刻顶上,且日志不丢、不乱、可追溯。
主备日志服务器架构设计
不依赖 rsyslog 自身集群(它原生不支持多节点状态同步),而是借助外部高可用机制实现虚拟 IP + 主备切换:
- 两台服务器部署相同版本 rsyslog,均配置为日志接收端(启用 UDP/TCP 514)
- 通过 Keepalived 配置一个浮动 VIP(如 192.168.1.100),客户端只往这个 VIP 发日志
- Keepalived 在主节点运行 MASTER 状态,持有 VIP;备节点为 BACKUP,持续健康检查(例如 curl -f http://localhost:514 或检测 rsyslog 进程 + 端口监听)
- 主节点宕机后,Keepalived 自动将 VIP 迁移到备节点,客户端无感知继续投递
rsyslog 服务端统一配置(主/备均需一致)
确保两台机器行为完全一致,避免切换后日志路径或格式错乱:
- 启用网络输入模块:取消
module(load="imudp")和module(load="imtcp")注释 - 添加监听规则:
input(type="imudp" port="514")和input(type="imtcp" port="514") - 定义模板按源 IP 分目录存储:
$template RemoteLogs,"/var/log/remote/%FROMHOST-IP%/%$YEAR%-%$MONTH%-%$DAY%.log" - 应用规则:
*.* ?RemoteLogs & ~(& ~表示匹配后不再走后续规则) - 创建基础目录并授权:
sudo mkdir -p /var/log/remote && sudo chown syslog:adm /var/log/remote
客户端稳定投递配置(防单点中断)
客户端不能只写一个地址,要兼顾主备切换窗口期和网络抖动:
- 使用 TCP 协议(
@@)而非 UDP,保证传输可靠性 - 配置双目标 fallback(rsyslog 8.20+ 支持):
*.* @@192.168.1.100:514;RSYSLOG_ForwardFormat @@192.168.1.101:514;RSYSLOG_ForwardFormat(101 是备机真实 IP) - 启用磁盘队列缓存,断网时暂存日志:
$ActionQueueFileName fwdq1、$ActionQueueMaxDiskSpace 2g、$ActionQueueSaveOnShutdown on - 重启客户端:
sudo systemctl restart rsyslog
验证与日常保障要点
高可用不是配完就完事,得有闭环验证:
- 用
ss -tuln | grep :514确认主节点监听中,再手动停主 rsyslog + kill keepalived,观察 VIP 是否秒级漂移到备机、监听是否恢复 - 在客户端执行
logger "test failover $(date)",立刻在主/备的/var/log/remote/客户端IP/下查对应时间戳日志 - 定期检查磁盘空间(
df -h /var/log)、日志轮转(配合 logrotate 按天压缩 + 保留 30 天)、以及 Keepalived 的 vrrp 状态日志 - 建议主备之间不做日志实时同步(如 rsync 拉取),避免 IO 冲突和时序混乱;真正需要双写,应由客户端直发双目标更可控











