核心是借助外部机制弥补rsyslog无状态同步短板:一、keepalived实现双机热备+vip漂移,主备配置一致并按源ip分目录存储;二、traefik/haproxy负载均衡多实例,客户端启用tcp双队列与无限重试;三、服务端开启tcp keep-alive、禁用本地日志干扰;四、prometheus+grafana监控队列、连接与健康状态。

构建高可用日志处理集群,核心不是让 rsyslog 自己“组队同步”,而是用外部机制补足它原生不支持状态共享的短板——通过负载均衡分担压力、用主备切换保障连续性、靠本地队列兜底防丢日志。
一、双机热备 + VIP 漂移(适合中小规模)
这是最成熟、部署成本最低的高可用方案,依赖 Keepalived 实现秒级接管:
- 两台服务器安装相同版本 rsyslog,配置完全一致:启用
imudp和imtcp模块,监听 514 端口 - 用 Keepalived 绑定一个虚拟 IP(如
192.168.1.100),客户端只往这个 VIP 发日志 - 主节点健康检查失败(如检测
ss -tln | grep :514或 rsyslog 进程)时,VIP 自动漂移到备机 - 模板中按源 IP 分目录存储,例如:
$template RemoteLogs,"/var/log/remote/%FROMHOST-IP%/%$YEAR%-%$MONTH%-%$DAY%.log",避免切换后路径混乱
二、多实例 + 反向代理负载均衡(适合中大型流量)
当单台接收压力大或需横向扩展时,用 Traefik / HAProxy 做 TCP 层负载均衡:
- 客户端配置指向负载均衡器域名或 VIP,使用 TCP 协议(更可靠):
*.* action(type="omfwd" target="log-lb.example.com" port="10514" protocol="tcp" action.resumeRetryCount="10" queue.type="linkedlist" queue.size="10000") - 负载均衡器做健康检查(如探测后端 rsyslog 的 TCP 连通性),自动剔除异常节点
- 每台 collector 保持无状态,日志落地路径与模板统一,便于后续归档或接入 Loki/ES
- 建议配合磁盘队列(
queue.filename+queue.saveonshutdown)防止网络抖动丢日志
三、日志不丢的关键配置细节
高可用不只是“服务在线”,更是“数据不丢”:
- 客户端必须启用内存+磁盘双队列:
queue.type="disk"或"linkedlist"配合queue.filename持久化 - 设置合理重试策略:
action.resumeRetryCount="-1"(无限重试)或至少 30 次以上,搭配action.queue.timeoutShutdown="0" - 服务端开启 TCP keep-alive:
$InputTCPServerStreamDriverMode 1和$InputTCPServerStreamDriverAuthMode x509/name(如用 TLS) - 禁用
$OmitLocalLogging on防止本地日志干扰,确保所有远程日志独立落盘
四、监控与故障响应闭环
没有监控的高可用是纸糊的:
- 用 Prometheus 抓取 rsyslog 内置指标(需加载
impstats模块),重点关注imtcp:current_sessions、queue_full、failed_transmits - Grafana 中配置阈值告警:队列积压超 5000 条、TCP 连接数突降、连续 3 次健康检查失败
- Keepalived 自带日志可输出到 syslog,结合
logger命令触发通知(如调用 webhook 发钉钉/企微) - 定期验证日志完整性:比对客户端发送量与服务端接收量(可通过
rsyslogd -N1检查配置语法,rsyslogd -v查版本兼容性)











