我有一个包含两个节点的 HA 集群,节点 1 是主节点,节点 2 是其镜像。由于我的节点不同步,我的 mysql 资源出现问题
drbd 概述
节点主体:
0:home 已连接 主/次 最新/最新 C r-----
1:storage 已连接 次/主 最新/最新 C r-----
2:mysql 独立 次/未知 最新/过时 r-----
次要节点:
0:home 已连接 次要/主要 最新/最新 C r-----
1:storage 已连接 主/次要 最新/最新 C r-----
2:mysql 独立 主/未知 最新/过时 r-----
查看消息文件我发现以下内容
Apr-19 18:20:36 clsstd2 kernel: block drbd2:self C1480E287A8CAFAB:C7B94724E2658B94:5CAE57DEB3EDC4EE:F5887A918B55FB1A bits:114390101 flags:0
Apr-19 18:20:36 clsstd2 kernel: block drbd2:peer 719D326BDE8272E2:0000000000000000:C7BA4724E2658B94:C7B94724E2658B95 bits:0 flags:1
Apr-19 18:20:36 clsstd2 kernel: block drbd2:uuid_compare()=-1000 by rule 100
Apr-19 18:20:37 clsstd2 kernel: block drbd2:Unrelated data, aborting!
Apr-19 18:20:37 clsstd2 kernel: block drbd2:conn (WFReportParams -> Disconnecting)
Apr-19 18:20:37 clsstd2 kernel: block drbd2:error receiving ReportState, l: 4!
Apr-19 18:20:38 clsstd2 kernel: block drbd2:asender terminated
Apr-19 18:20:38 clsstd2 kernel: block drbd2:Terminating asender thread
Apr-19 18:20:38 clsstd2 kernel: block drbd2:Connection closed
Apr-19 18:20:38 clsstd2 kernel: block drbd2:conn (Disconnecting -> StandAlone)
Apr-19 18:20:39 clsstd2 kernel: block drbd2:reciver terminated
Apr-19 18:20:39 clsstd2 kernel: block drbd2:Terminating reciver thread
Apr-19 18:20:39 clsstd2 auditd[3960]: Audit daemon rotating log files
我不明白问题是什么以及如何解决它,因为检查两个节点后我意识到在 var/lib/mysql 目录中我没有节点 2 中的 ibdata1 文件,但它确实存在于节点 1 中
答案1
问题是您遇到了“著名”的 DRBD 裂脑情况,并且两个 DRBD 节点都进入了“独立”状态。很难说您的主节点上的数据库是有效的还是损坏的,但目前您有两种选择:
- 尝试重新同步 DRBD 节点,并指定其中一个节点具有较新版本的数据,但对于您的情况来说这不是必需的。
这是在第二个节点上运行的:
#drbdadm secondary resource
#drbdadm disconnect resource
#drbdadm -- --discard-my-data connect resource
这是你在活动节点上运行的,你认为该节点拥有最新版本的数据:
#drbdadm connect resource
如果这没有帮助,您可以丢弃第二个节点并模拟自动重建执行以下命令:
#drbdadm invalidate resource
- 使用(1)中的最后一条命令清除两个节点的数据并从备份中恢复数据库。
希望这有帮助!
PS 我强烈建议在生产中避免使用 DRBD。不幸的是,您看到的是相当常见的情况。
答案2
此处的问题就是Unrelated data, aborting!
您在日志中看到的内容。很可能节点在断开连接时已经多次更改角色,以至于元数据中标识的历史代数不再匹配。有关更多信息,请参阅此处的 DRBD 用户指南:https://linbit.com/drbd-user-guide/drbd-guide-9_0-en/#s-gi
此时,您需要选择一个节点来覆盖另一个节点的数据并执行新的完全同步。为此,您应该在要成为的节点上重新创建元数据SyncTarget
。您可以使用drbdadm create-md <resource>
答案3
谢谢,确实,解决方案是再次创建元数据,在我想要重新创建元数据的节点上运行以下命令,现在一切都再次同步。
drbdadm down resource
drbdadm wipe-md resource
drbdadm create-md resource
drbdadm up resource
drbdadm disconnect resource
drbdadm connect resource
最后一个命令首先在重新创建元数据的节点上执行,然后在另一个节点上执行。
最后,执行命令#cat/proc/drbd 并检查备份副本数。