DRBD双节点脑裂无数据丢失恢复:如何查找最后更新节点?
查找DRBD脑裂场景下最后更新节点的方法
针对你的DRBD主备架构(8.9.10-2版本)搭配Pacemaker、Corosync和PostgreSQL的场景,要在脑裂后确定哪个节点是最后更新的,下面是几个可靠的方法和命令:
1. 利用DRBD元数据查看最后更新时间
DRBD的元数据里直接记录了每个节点的最后写入时间,这是判断的核心依据:
- 在两个节点上分别执行命令(替换
<你的DRBD资源名>为实际资源名):drbdadm dump-md <你的DRBD资源名> - 输出结果中找到类似
last update: <时间戳>的字段,对比两个节点的这个时间,时间更晚的节点就是最后写入数据的那个。 - 想快速过滤结果的话,可以搭配grep:
drbdadm dump-md <你的DRBD资源名> | grep "last update"
重要提醒:一定要确保两个节点的系统时间是同步的(比如配置NTP服务),否则时间戳对比会完全失去参考价值。
2. 通过PostgreSQL日志和工具辅助验证
因为DRBD挂载的是PostgreSQL数据目录,数据库层面的记录也能作为有力佐证:
- 查看PostgreSQL日志文件(通常在
/var/log/postgresql/目录下),找到最后一条写入、提交相关的日志记录,对比两个节点的日志时间。 - 执行
pg_controldata命令(需要切换到PostgreSQL用户或用sudo),查看Latest checkpoint time或Time of latest WAL segment字段,时间较晚的节点即为最后更新的节点:sudo -u postgres pg_controldata /var/lib/postgresql/<你的PG版本>/main/
3. 检查Pacemaker集群日志辅助回溯
虽然脑裂时集群可能出现双主状态,但Pacemaker的日志能帮你回溯最后一次正常切换的状态:
- 查看Pacemaker日志里的资源提升记录:
grep "Promoted" /var/log/pacemaker/pacemaker.log - 找到最后一条资源被提升为主节点的记录,结合时间做初步判断,但这个只能作为辅助——毕竟脑裂后节点可能自行切换为主,日志记录可能不全。
结合你当前配置的后续建议
你当前的after-sb-2pri disconnect配置会让两个节点在脑裂后断开连接,确定最后更新节点后,你可以按以下步骤恢复(无数据丢失):
- 在确认的最后更新节点上执行,将其设为主:
drbdadm primary <你的DRBD资源名> - 在另一个节点上执行,将其设为从并同步数据:
drbdadm secondary <你的DRBD资源名> drbdadm connect --discard-my-data <你的DRBD资源名> - 待DRBD同步完成后,再恢复Pacemaker的集群管理。
内容的提问来源于stack exchange,提问作者Mr. Tux
相关产品推荐
相关产品推荐

