MySQL 读写分离
终于还是来了,读写分离的坑还是被我踩到了,年写接手了同事的一些代码,在上面缝缝补补,最近在自测的时候发现了一个奇怪的事儿,创建的数据推送到消息队列,本地开发环境是没有没有问题,到了测试环境,消息队的结构数据不正确,
排查了一下发现是数据库读写分离的问题
本质就是,插入的数据,需要立马查询出来获取插入的主键ID,为后续业务提供关联
本地开发环境,连接测试数据库延时比较高(100ms往上)复现不到这个问题
解决这种问题网上也是一大堆
- 在写库中读数据
- 等待读库后同步完数据完成后再进行同步
读写分离同步流程
写库的操作
- 修改内存数据页
- 记录redolog
- 写入binlog
- 主库binlog发送到从节点
- 从库记录到relay log
- 从库从relay log读取log同步数据
- 提交事务
-
异步复制:
- 主库发送binlog发送到从节点,就立马提交事务响应用户
-
半同步复制
- 主库发送binlog发送到从节点,至少等到一个从库确认自己才提交事务然后响应用户
- 并且不能解决查询从库立马获取到期望的数据,因为查询的从库可能不是响应主库的节点
- 主库发送binlog发送到从节点,至少等到一个从库确认自己才提交事务然后响应用户
解决问题的办法:
- 业务上实施等待,
- 引入缓存,插入的数据直接从缓存中获取
- 查询出从库是不是已经同步主库的binlog最新事务位置信息,从而可以直接在从库查询出事务变更的数据
参考资料:
MySQL 读写分离
https://maocat.cc/2024/04/27/中间件/MySQL/读写分离/