MySQL 集群通常是指 MySQL 的主从复制架构。通常使用 MySQL 主从复制来解决 MySQL 单点故障的问题,其通过逻辑复制的方式把主库的变更同步到从库上,主备之间无法保证严格一致的模式。于是MySQL 的主从复制带来了主从“数据一致性”的问题。
MySQL 的复制分为:全同步复制、异步复制、半同步复制。
全同步复制
当主库执行完一个事务,并且全部的从库都执行完了该事务后,才能返回给客户端。
那么主库完成一个事务的时间就会被拉长,因此全同步复制的性能必然会受到严重的影响。
异步复制
早期的 MySQL 仅支持异步复制。
主库在执行完客户端提交的事务后会立即将结果返回给客户端,而并不关心从库是否已经接收并处理。
这样就会有一个问题,如果主库 crash 了,此时主库上已经提交了的事务可能并没有传到从库上,此时如果强行将从库提升为主库,那么就可能会导致“数据不一致”。
半同步复制
MySQL 5.5 中引入了半同步复制,主库在应答客户端提交的事务前,需要保证至少有一个从库接收并写到 relay log 中。同时,这里只是一个收到的反馈,而不是已经彻底完成并且提交的反馈,如此节省了不少时间。
相对于异步复制,半同步复制提升了数据的安全性,同时它也形成了一定程度上的延迟,这个延迟最少是一个 TCP/IP 往返的时间。因此,半同步复制最好在低延时的网络中使用。
半同步复制通过 rpl_semi_sync_master_wait_point 参数来控制 master 在哪个环节接收 slave ack。
master 接收到 ack 后返回状态给客户端,此参数一共有两个选项 AFTER_SYNC & AFTER_COMMIT。