缺点:无论采用上面哪一种方案 , 如果主库的写操作频繁不断 , 那么从库的值永远跟不上主库的值 , 那么读流量永远是打在了主库上 。
针对这个问题 , 有什么解决方案?这个问题跟 MQ消息队列 既要求高吞吐量又要保证顺序是一样的 , 从全局来看确实无解 , 但是缩小范围就容易多了 , 我们可以保证一个分区内的消息有序 。
回到 主从库 之间的数据同步问题 , 从库查询哪条记录 , 我们只要保证之前对应的写binglog已经同步完数据即可 , 可以不用管主从库的所有的事务binlog 是否同步 。
问题是不是一下简单多了
四、从库节点判断主库位点在从库执行下面命令 , 返回是一个正整数 M , 表示从库从参数节点开始执行了多少个事务
select master_pos_wait(file pos[ timeout
);
- file 和 pos 表示主库上的文件名和位置
- timeout 可选 ,表示这个函数最多等待 N 秒
五、比较 GTID执行下面查询命令
- 阻塞等待 , 直到从库执行的事务中包含 gtid_set , 返回 0
- 超时 , 返回 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 , 表示已经从库已经同步了数据 , 可以在从库执行 查询 操作
- 否则 , 在主库执行 查询 操作
六、引入缓存中间件
高并发系统 , 缓存作为性能优化利器 , 应用广泛 。 我们可以考虑引入缓存作为缓冲介质
处理过程:
- 客户端写SQL, 操作主库
- 同步将缓存中的数据删除
- 当客户端读数据时 , 优先从缓存加载
- 如果 缓存中没有 , 会强制查询主库预热数据
七、数据分片
参考 Redis Cluster 模式 ,集群网络拓扑通常是 3主 3从 , 主节点既负责写 , 也负责读 。
通过水平分片 , 支持数据的横向扩展 。 由于每个节点都是独立的服务器 , 可以提高整体集群的吞吐量 。
转换到数据库方面
常见的解决方式 , 是分库分表 , 每次读写都是操作主库的一个分表 , 从库只用来做数据备份 。 当主库发生故障时 , 主从切换 , 保证集群的高可用性 。
- 京东|电商巨头京东高达50%的部门裁员比例!
- 浏览器|裁员新说法?京东裁员称为“毕业”,网友:嘲讽谁呢?
- 京东|社交娱乐业务疲软,腾讯音乐靠“元宇宙”救场?
- 京东健康|飞奔的视频号,能成为腾讯的“第二曲线”吗?
- 京东|大数据时代下的智慧育种,百奥云获数千万元Pre-A轮融资
- 京东|京东长枪,美团短刀
- B2C|192期: 抖音跨境电商;华为全栈方案;京东业务线优化;腾讯阿里互联
- 华硕|华硕无双值得买吗?别犹豫了,首销日它已经登上京东热卖榜
- 伊隆·马斯克|灵活就业会否超3亿人?扛不住了,京东有赞纷纷裁员
- 京东|“母校”京东:不会开除任何一个兄弟,只会祝他们毕业快乐