MySQL|京东二面:MySQL 主从延迟,读写分离 7 种解决方案( 二 )


  • timeout 可选 ,表示这个函数最多等待 N 秒
  • 缺点:master_pos_wait 返回结果无法与具体操作的数据行做关联 , 所以每次接收 读请求 时 , 从库还是无法确认是否已经同步数据 , 方案实用性不高 。
    五、比较 GTID执行下面查询命令
    • 阻塞等待 , 直到从库执行的事务中包含 gtid_set , 返回 0
    • 超时 , 返回 1
    select wait_for_executed_gtid_set(gtid_set 1);

    MySQL 5.7.6 版本开始 , 允许在执行完更新类事务后 , 把这个事务的 GTID 返回给客户端 。 具体操作 , 将参数 session_track_gtids 设置为 OWN_GTID  , 调用 API 接口
    mysql_session_track_get_first 返回结果解析出 GTID
    处理流程:
    • 发起 写 SQL 操作 , 在主库成功执行后 , 返回这个事务的 GTID
    • 发起 读 SQL 操作时 , 先在从库执行 select wait_for_executed_gtid_set (gtid_set 1)
    • 如果返回 0 , 表示已经从库已经同步了数据 , 可以在从库执行 查询 操作
    • 否则 , 在主库执行 查询 操作
    缺点:跟上面的 master_pos_wait 类似 , 如果 写操作 与 读操作 没有上下文关联 , 那么 GTID 无法传递。 方案实用性不高 。
    六、引入缓存中间件
    高并发系统 , 缓存作为性能优化利器 , 应用广泛 。 我们可以考虑引入缓存作为缓冲介质
    处理过程:
    • 客户端写SQL, 操作主库
    • 同步将缓存中的数据删除
    • 当客户端读数据时 , 优先从缓存加载
    • 如果 缓存中没有 , 会强制查询主库预热数据
    缺点:K-V 存储 , 适用一些简单的查询条件场景 。 如果复杂的查询 , 还是要查询从库 。
    七、数据分片
    参考 Redis Cluster 模式 ,集群网络拓扑通常是 3主 3从 , 主节点既负责写 , 也负责读 。
    通过水平分片 , 支持数据的横向扩展 。 由于每个节点都是独立的服务器 , 可以提高整体集群的吞吐量 。
    转换到数据库方面
    【MySQL|京东二面:MySQL 主从延迟,读写分离 7 种解决方案】常见的解决方式 , 是分库分表 , 每次读写都是操作主库的一个分表 , 从库只用来做数据备份 。 当主库发生故障时 , 主从切换 , 保证集群的高可用性 。