Read-Scale(无集群)AG同步提交配置下主副本丢失为何会数据丢失?
微软官方文档说明:如果主副本不可用且无法立即恢复,则需要强制故障转移到辅助副本,这会导致数据丢失。
技术疑问
在配置sync-commit模式且故障转移前数据库处于SYNCHRONIZED状态时,主副本不可用后故障转移为何仍可能出现数据丢失?
核心原因解析
哪怕是sync-commit模式且处于SYNCHRONIZED状态,Read-Scale场景下的强制故障转移仍存在数据丢失风险,关键在于这类可用性组没有集群管理器的协调管控,具体原因如下:
裂脑场景的数据分歧:Read-Scale可用性组依赖手动监控和操作,没有WSFC这类集群组件来确保主副本彻底停止运行。如果主副本只是因网络分区暂时失联而非彻底故障,你执行强制故障转移后,原主副本可能仍在接收客户端写入。等网络恢复后,原主副本和新主副本(原辅助)的数据会出现分歧,最终只能以新主副本的数据为准,原主副本上未同步的写入就会永久丢失。
强制故障转移的无校验特性:不同于集群托管的自动故障转移,Read-Scale的强制故障转移不会先校验主副本的状态,也不会等待所有未同步的日志完成传输。哪怕之前处于
SYNCHRONIZED状态,极端情况下(比如主副本在提交事务后、日志刚发出就崩溃),辅助副本可能没接收到最后一笔事务日志,强制切换后该笔数据就会丢失。日志应用延迟的感知偏差:就算日志已经传到辅助副本并完成硬话,辅助副本可能还没来得及将日志应用到数据库(即事务未完成redo)。强制故障转移后,辅助副本会从已硬话的日志恢复,虽然最终数据会一致,但切换瞬间可能出现短暂的数据“缺失”——不过这不属于永久丢失,只是未及时完成事务落地。
内容的提问来源于stack exchange,提问作者qqq

