在Linux服务器规模增长后,散落在各节点的日志给故障排查带来巨大负担。如果只把日志写在本地磁盘,一旦机器宕机或磁盘损坏,关键运行记录就再也找不回来。高可用日志管理的目标是让日志采集、传输与存储都不存在单点故障,任意组件崩溃时系统自动接管,保证日志不丢、不乱、可查。

为什么需要高可用的日志管理
传统做法是在每台Linux主机上用rsyslog或syslog-ng把日志发往一台中心日志服务器。这种架构看似简单,但中心服务器一旦停机,所有节点的日志都会积压在本地或丢弃。对于金融、电商等核心业务,哪怕几分钟的日志缺失都可能影响审计与告警。
高可用方案通过冗余节点、共享存储与自动故障转移来解决该问题。例如使用两台日志服务器组成活跃-备用集群,前置虚拟IP(VIP),客户端始终向VIP发送日志。当主节点失效,备用节点在秒级内接管VIP,业务无感知。这种机制同样适用于后续的日志检索与可视化层。
基于RSyslog与Keepalived的基础方案
RSyslog是绝大多数Linux发行版预装的日志守护进程,支持TCP、TLS及队列缓冲。Keepalived则通过VRRP协议管理VIP漂移,配置轻量。两者结合能以很低成本实现传输层高可用。
在主节点上,先确保rsyslog监听TCP 514端口,并将接收的日志写入本地专用目录。Keepalived配置中声明同一个VIP,主节点优先级高,备节点低。下面给出主节点keepalived简化配置:
# 主节点 /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass ipipp_pass
}
virtual_ipaddress {
192.168.0.100
}
}
备节点只需把state改为BACKUP,priority设为100。RSyslog客户端配置统一指向192.168.0.100,而非具体主机IP。这样任意一台服务器宕机,VIP漂到另一台,日志继续落盘。该方案优点部署快,缺点是两个节点日志文件相互独立,查历史需登录不同机器。
使用DRBD实现双机日志存储同步
若要求两份日志严格一致、可互相替代,可引入DRBD(分布式复制块设备)。它在两台Linux主机间同步块设备,上层文件系统写入看似本地,实际已复制到对端。将RSyslog日志目录放在DRBD资源上,主备切换后目录内容完全连续。
以下为DRBD资源定义示例,两块机器使用/dev/sdb1作为底层设备,挂载到/var/log/ha:
resource logres {
protocol C;
on node1 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.0.1:7788;
meta-disk internal;
}
on node2 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.0.2:7788;
meta-disk internal;
}
}
配置后通过drbdadm create-md logres与systemctl start drbd启动。主节点执行drbdadm primary logres并挂载文件系统,RSyslog将日志路径指向/var/log/ha。当Corosync+Pacemaker检测到节点故障,会自动将DRBD提升为primary并挂载,实现存储层高可用。该方式数据强一致,但写性能受网络同步影响。
用Corosync与Pacemaker管理集群资源
手动切换DRBD和VIP容易出错,Pacemaker可把这些资源编为集群服务。Corosync负责节点间通信与成员管理,Pacemaker根据规则迁移资源。下面展示一个Pacemaker配置片段,把VIP、DRBD与文件系统绑成资源组:
<configuration>
<resources>
<primitive id="vip" class="ocf" provider="heartbeat" type="IPaddr2">
<instance_attributes id="vip-ia">
<nvpair name="ip" value="192.168.0.100"/>
<nvpair name="cidr_netmask" value="24"/>
</instance_attributes>
</primitive>
<primitive id="drbd" class="ocf" provider="linbit" type="drbd">
<instance_attributes id="drbd-ia">
<nvpair name="drbd_resource" value="logres"/>
</instance_attributes>
</primitive>
</resources>
<group id="loggroup">
<primitive ref="vip"/>
<primitive ref="drbd"/>
</group>
</configuration>
资源组保证VIP与DRBD永远在同一节点。运维人员可用crm_mon查看状态,用crm resource migrate手动演练。该组合适合中大型环境,缺点是组件多、排错曲线陡。
常见配置误区与排查建议
第一个误区是忽略时间同步。高可用日志跨节点,若node1与node2的NTP偏移数秒,故障切换后日志时间戳会跳变,导致按时间检索失效。务必在所有节点启用chrony或ntpd,并监控偏移量。
第二个误区是RSyslog队列未配置磁盘缓冲。网络闪断时,内存队列满就丢日志。应在客户端配置$ActionQueueType LinkedList与$ActionResumeRetryCount -1,把暂存写到磁盘。第三个误区是防火墙只开UDP 514,但高可用建议用TCP并加TLS,避免日志被篡改或丢包无法重传。
| 方案 | 优点 | 缺点 |
|---|---|---|
| RSyslog+Keepalived | 极简、易维护 | 两节点日志不互通 |
| 加DRBD同步 | 存储强一致 | 写延迟略增 |
| Pacemaker集群 | 自动编排资源 | 学习成本高 |
综合来看,小型团队用RSyslog加Keepalived即可明显提升可用性;有合规与审计要求的场景,再叠DRBD与Pacemaker。上线前用断电、断网做真实切换测试,才能确认配置真正生效。