MySQL 读写分离

终于还是来了,读写分离的坑还是被我踩到了,年写接手了同事的一些代码,在上面缝缝补补,最近在自测的时候发现了一个奇怪的事儿,创建的数据推送到消息队列,本地开发环境是没有没有问题,到了测试环境,消息队的结构数据不正确,
排查了一下发现是数据库读写分离的问题

本质就是,插入的数据,需要立马查询出来获取插入的主键ID,为后续业务提供关联
本地开发环境,连接测试数据库延时比较高(100ms往上)复现不到这个问题
解决这种问题网上也是一大堆

  1. 在写库中读数据
  2. 等待读库后同步完数据完成后再进行同步

读写分离同步流程

写库的操作

  1. 修改内存数据页
  2. 记录redolog
  3. 写入binlog
    • 主库binlog发送到从节点
    • 从库记录到relay log
    • 从库从relay log读取log同步数据
  4. 提交事务
  • 异步复制:

    • 主库发送binlog发送到从节点,就立马提交事务响应用户
  • 半同步复制

    • 主库发送binlog发送到从节点,至少等到一个从库确认自己才提交事务然后响应用户
      • 并且不能解决查询从库立马获取到期望的数据,因为查询的从库可能不是响应主库的节点

解决问题的办法:

  1. 业务上实施等待,
  2. 引入缓存,插入的数据直接从缓存中获取
  3. 查询出从库是不是已经同步主库的binlog最新事务位置信息,从而可以直接在从库查询出事务变更的数据

参考资料:


MySQL 读写分离
https://maocat.cc/2024/04/27/中间件/MySQL/读写分离/
发布于
2024年4月27日
许可协议