MySQL半同步复制问题

alt*_*elo 3 mysql semi-sync-replication

我正在研究MySQL Semisynchronous Replication,我对工作流程的理解如下:

  1. Master 从客户端会话接收成功的事务。
  2. 大师把它写到他的二进制日志中
  3. Master 等待rpl_semi_sync_master_timeout几毫秒以接收来自至少一个从站的确认
  4. Slave 选择这个成功的交易,将它写入他的中继日志,将它刷新到磁盘
  5. 从站向主站返回确认
  6. Master 成功返回到他的客户端会话。

我的问题是,在任何时候,这种类型的复制都确保事务在从属上执行(SQL_TREAD应用它)。考虑到它会在每个事务上增加延迟,并且在 master 失败的情况下,不能 100% 保证 slave 与 master 一致,使用这种类型的复制有什么好处?

Nat*_*lly 5

Baron Schwartz在这方面了一篇出色的文章,我认为一个关键句子可以回答您的问题:

那么半同步复制对我有什么保证呢?如果没有错误或超时,那么保证本质上就是如果主节点崩溃,每个客户端只有一个事务可能会丢失。

所以半同步复制最大限度地减少(但不完全消除)这个确切问题的机会:

  1. IO Thread出于某种原因,副本 B 的复制开始在其主服务器 - 服务器 A 后面运行
  2. 服务器 A 死亡 - 不可恢复
  3. 交易永远丢失

正如 Baron 的帖子中所指出的(根据你的措辞,我相信你知道这一点),它不是万无一失的——如果它停止从复制者那里得到响应,MySQL 将回退到常规复制——但不可恢复的数据丢失是不太可能发生。

结果是它防止了上述情况,它是“开箱即用的”,并且不需要任何第三方或基础架构级解决方案(例如 Galera/Xtradb Cluster 或 DRBD)。这些好处是否值得付出代价可能会因您的情况而异。

  • 半同步复制并不是开箱即用的。需要一些程序集:http://dba.stackexchange.com/a/27853/877。尽管如此,对提出的整体观点+1。 (2认同)