MySQL-23丨读写分离需要注意

Posted by jiefang on November 1, 2019

读写分离需要注意

什么情况下会出现主从延迟

对于读写分离场景,最大的问题就是:主从延迟

可能导致主从延迟的场景:

  • 大表 DDL
  • 大事务
  • 主库 DML 并发大
  • 从库配置差
  • 表上无主键
  • 等等

读写分离怎样应对主从延迟

判断主从是否延迟

  • 判断 Seconds_Behind_Master 是否等于 0

    Seconds_Behind_Master 是在从库上执行 show slave status 时返回的其中一项,表示从库延迟的秒数。 其计算方法是:从库服务器当前的时间戳与二进制日志中的事件的时间戳(在主库上的写入时间)相对比得到的。

某些情况下,Seconds_Behind_Master 并不一定准确。比如网络中断时,Seconds_Behind_Master = 0 ,并不能代表主从无延迟。

  • 对比位点

如果 Master_Log_File 跟 Relay_Master_Log_File 相等,并且 Read_Master_Log_Pos 跟 Exec_Master_Log_Pos 相等,则主从无延迟。

通过show slave status 返回的参数,用来查询主从复制的状态:

  • Master_Log_File:IO 线程正在读取的主库 binlog 文件名
  • Relay_Master_Log_File:SQL 线程最近执行的事务对应的主库 binlog 文件名
  • Read_Master_Log_Pos :IO 线程正在读取的主库 binlog 文件中的位点
  • Exec_Master_Log_Pos :SQL 线程最近读取和执行的事务对应的主库 binlog 文件中的位点
  • GTID

如果开启了 GTID 复制,则可以对比 Retrieved_Gtid_Set 和 Executed_Gtid_Set 是否相等,相等则把读请求放到从库,有差异则读请求放到主库。

开启 GTID 两个参数才会有值,解释如下:

  • Retrieved_Gtid_Set:从库收到的所有日志的 GTID 集合
  • Executed_Gtid_Set:从库已经执行完的 GTID 集合

采用半同步复制

跟传统的异步复制相比,半同步复制保证了所有给客户端发送过确认提交的事务,从库都已经收到这个日志了。因此出现延迟的概率会小很多.

等待同步完成

报表类业务