数据库主从延迟解决方案 作者:Admin MySql 时间:2022-07-28 15:22:24 800人已阅读 个人博客 简介主从延迟方案 #### 数据库读写分离主从延迟解决方案 - 强制走主库方案; - sleep方案; - 判断主备无延迟方案; - 配合semi-sync方案; - 等主库位点方案 - 等GTID方案。 ###### 判断主备无延迟方案 show slave status结果 第一种 seconds_behind_master是否已经等于0 第二种 对比位点确保主备无延迟: Master_Log_File和Read_Master_Log_Pos,表示的是读到的主库的最新位点; Relay_Master_Log_File和Exec_Master_Log_Pos,表示的是备库执行的最新位点。 如果Master_Log_File和Relay_Master_Log_File、Read_Master_Log_Pos和 Exec_Master_Log_Pos这两组值完全相同,就表示接收到的日志已经同步完成。 第三种种方方法法, 对比GTID集合确保主备无延迟: Auto_Position=1 ,表示这对主备关系使用了GTID协议。 Retrieved_Gtid_Set,是备库收到的所有日志的GTID集合; Executed_Gtid_Set,是备库所有已经执行完成的GTID集合。 如果这两个集合相同,也表示备库接收到的日志都已经同步完成。 ###### 半同步Semi-sync Semi synchronous中,仅仅保证事务的已经传递到备库上,但是并不确保已经在备库上执行完成了。 semi-sync+位点判断的方案,只对一主一备的场景是成立的。在一主多从场景中,主库只 要等到一个从库的ack,就开始给客户端返回确认 ###### 等主库位点方案 ```mysql select master_pos_wait(file, pos[, timeout]); ``` 1. trx1事务更新完成后,马上执行show master status得到当前主库执行到的File和Position; 2. 选定一个从库执行查询语句; 3. 在从库上执行select master_pos_wait(File, Position, 1); 4. 如果返回值是>=0的正整数,则在这个从库执行查询语句; 5. 否则,到主库执行查询语句。 ###### GTID方案 ```mysql select wait_for_executed_gtid_set(gtid_set, 1); ``` MySQL 5.7.6版本开始,允许在执行完更新类事务后,把这个事务的GTID返回给客户端 等GTID的执行流程就变成了: 1. trx1事务更新完成后,从返回包直接获取这个事务的GTID,记为gtid1; 2. 选定一个从库执行查询语句; 3. 在从库上执行 select wait_for_executed_gtid_set(gtid1, 1); 4. 如果返回值是0,则在这个从库执行查询语句; 5. 否则,到主库执行查询语句。 来源于MySql 45讲 上一篇: Mysql数据库快速备份恢复 下一篇: 二进制搭建PHP