一主多从的架构,主写入和少量的读,从库承担大量的读。读从库有不可避免的延迟,有些业务是不允许过期读。
比如金融类的业务就必须查询主库
某些特殊场景下可能有用,比如淘宝商家发布商品后,只用将发布的内容展示在页面上,而后台查询时延迟1s在查询。
从库执行show slave status
可以看到主库和备库同步位点,gtid_set, auto_position参数
seconds_behind_master
参数的值,当其值为0才能查询。判断无延迟的三种办法,本质上还是备库根据已经同步到备库binlog来判断,如果事务提交了,主库回应客户端事务提交了,而binlog在主库还没同步到备库,客户端马上来备库查询,使用判断无延迟方案,此时是没有延迟的,读备库就是过期读
因此,如果主库在执行完事务,然后确保binlog同步给了从库,再响应客户端。
一主一备 + semi-sync + 位点判断 的方案有点不足
select master_pos_wait(file, pos[, timeout])
这个命令时从库用来获取主库基于(file, pos)位点后是否有新的提交,返回值有:
当收到客户端查询时,从库执行show master status
获取(File, Position),然后
当select master_pos_wait(File, Position, 1) >= 0 表示从库此时已经同步执行完主库的事务了,可以进行查询。
select wait_for_executed_gtid_set(gtid_set, 1)
在超时时间内,如果执行事务包括gtid_set, 那么返回0,超时返回1。
MySQL 5.7.6之后,允许将提交事务的GTID返回客户端。
使用GTID避免过期读:
select wait_for_executed_gtid_set(gtid, 1);
原文:https://www.cnblogs.com/linyihai/p/15055149.html