知识卡片
同步复制保证最新数据但代价是主库被单个从库拖累
内容
[[复制的三种主流架构单主多主无主及其复杂度权衡]]中单主复制的一个关键配置项是复制 发生得同步还是异步。同步复制:主库要等到指定从库确认收到写入后,才向客户端报告 写入成功;优点是从库保证拥有与主库一致的最新数据,主库突然失效时这些数据依然能在 该从库上找到;缺点是如果这个同步从库没有响应(崩溃、网络故障),主库就必须阻塞 所有写入、等它恢复,相当于让主库的可用性被这一个从库拖累。正因如此,把所有从库都 设成同步是不现实的——任何一个节点的中断都会让整个系统停摆。实践中常见的折衷是 半同步:只让一个从库同步、其余异步,如果这个同步从库变得不可用或缓慢,就把另一个 异步从库提升为同步——这样至少保证有两个节点(主库+当前同步从库)拥有最新数据, 不会让可用性完全依赖单一节点,也不会像全异步那样完全没有持久性保证。全异步配置: 主库完全不等从库确认就报告成功,即使所有从库都落后了,主库也能继续处理写入,但 代价是如果主库失效且不可恢复,任何尚未复制的写入都会永久丢失——也就是说,即使已经 向客户端确认了写入成功,这个”成功”也不能保证持久。尽管持久性打了折扣,全异步复制 依然被广泛使用,尤其是从库数量多或分布在异地时,因为要求所有从库都同步确认在这些 场景下代价过高。
参考来源
- 位置:《数据密集型应用系统设计》第五章《复制》"同步复制与异步复制"(源文件:
_epub-src/ch5_split_000.html)
- 结论依据:原文说明同步复制保证从库有最新数据但主库会被无响应的同步从库阻塞,
将所有从库设为同步不现实,实践常用半同步配置(一个同步+其余异步),全异步
配置下主库失效会丢失未复制的写入但仍被广泛使用,直接支撑本卡片结论。
- 原始内容:同步复制的优点是,从库保证有与主库一致的最新数据副本……缺点是,如果
同步从库没有响应……主库就无法处理写入操作……如果同步从库变得不可用或缓慢,则使
一个异步从库同步……在这种情况下,如果主库失效且不可恢复,则任何尚未复制给从库
的写入都会丢失……然而异步复制已经被广泛使用了,特别当有很多追随者,或追随者
异地分布时。