我在两台服务器之间进行了非常简单的 mysql 主->从设置。问题是,复制是异步的,如果主服务器在 COMMIT 之后崩溃,而从服务器的复制线程尚未能够获取最后一个 bin 日志,这可能会导致问题(即使在低延迟链接上)。
有没有办法强制 mysql 进行同步提交,以便在 mysql->slave 关系中保证数据的一致性?
答案1
正常的 MySQL 复制必然是异步的,没有分布式锁,主服务器永远不会因为等待从服务器而被阻塞。这有优点也有缺点。
DRBD + heartbeat 是标准解决方案,可以避免在Master永久丢失的情况下丢失数据。
您可以在正常复制下使用 DRBD + 心跳,这允许读取扩展或异地复制以及非常高的耐用性。
由于 DRBD 在块级别进行同步复制,因此您需要网络具有非常低的延迟才能获得良好的性能(千兆以太网就可以,如果您有非常高的性能要求,自定义低延迟互连会更好)。
答案2
MySQL 5.5 具有半同步复制。基本上,它保证在提交事务之前至少有一个从属服务器已收到事务。
http://dev.mysql.com/doc/refman/5.5/en/replication-semisync.html
答案3
MySQL Cluster 提供同步复制,但引擎(NDBCLUSTER)并不适合很多用例。
Continuent 有一个同步复制解决方案(Sequoia),但它不再积极开发。
事实上的标准是 DRBD + Heartbeat,但设置起来并不容易。
干杯