一般面试官问这个问题,都伴随着另外一个问题,叫:小伙子,你说一下MySQL主从原理?
当你回答完原理之后,就会问到关于MySQL主从的几种方式的问题。
一般我们的主从同步,分为:半同步复制和异步复制:
MySQL主从复制默认采用的是异步复制的机制进行同步,所谓的异步指的是主库执行完客户端提交的事务之后立即将结果返回给客户端,并不关心从库是否已经接收道binlog并同步。
如果从库还没有接收到binlog的时候主库发生宕机,那么进行主从切换后的从库数据并不能和主库完全一致。为了解决这个问题,从MySQL 5.5开始以插件的形式支持半同步复制(另需要注意由于半同步复制仅与默认复制通道(for channel “”)兼容,不支持与多源复制混用。)。半同步复制中,当一个客户端提交事务时主库执行完事务并不会立即响应该客户端,而是等待至少有一个从库接收到了binlog并将事务写到自己的relay log中,最后收到从库的ACK响应后才返回给客户端。
半同步这边根据存储引擎处理的逻辑不同又分为after-commit和after-sync两种:
主库未收到从库的ACK消息之前,虽然不会让发起事务的会话收到事务提交结果,但是会在存储引擎层先执行提交。这样一来虽然提交事务的会话无法知道事务结果,但其他会话在主库上却是可以正常查询的。如果发生主从切换,那么原本在主库可以查询到的数据,在从库却丢失了
也可以叫做增强半同步复制或者无损复制,是MySQL 5.7默认的半同步方式。主库未收到从库的ACK消息之前,发起事务的会话收无法到事务提交结果,存储引擎层也不会执行提交,解决了after-commit的缺陷,保证了数据的严格一致。由于OLTP应用场景大多数是读多写少,读不会产生binlog,所以即便开启无损复制,相比异步复制所损失的性能也并不多
半同步复制发生超时,可以由rel_semi_sync_master_timeout参数设置关闭半同步,转而使用异步。