本文主要是介绍MySQL的一主多从机制的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一主多从导致主备切换的问题:
一主多从进行主备切换时,其他从库要将主库切换到新的主库(如图1和图2所示),此时需要在新主库上查找当前备份的位点(从bin log的哪个位置开始继续执行事务)一般为了保证数据不丢失,都是往前找一段距离,这样就会出现重复执行同几个事务的情况,MySQL对其进行了优化,采用GTID会自动过滤已经执行过备份的事务(如以下图三所示)。
一主多从导致的读写分离的问题
数据库的负载均衡
为了缓解主库的读写压力,客户端会在主库与备库之间选择一个库进行数据的读取(有两种机制)
- 一种机制是客户端负载均衡,选择要读哪个数据库的数据(客户端压力大);
- 另一种机制是后端负载均衡,客户端先访问一个proxy,由proxy进行负载均衡路由到相应的数据库(后端压力大)。
从备库中读取数据会存在“过期读”的情况:当主库刚更新完数据,客户端立马进行数据查询,备库还没有完成备份时(由于存在主从延迟),客户端从该备库中读取该数据,就会得到与主库中不一致的数据。
解决读写分离“过期读”的方法:
- 首先判断当前查询语句是否可以接受过期读,可以接受则正常选择数据库读取数据;
- 对于不能接受过期读的数据,当访问的是备库时,查询当前备库的位点是否已经超过了当前查询语句执行前一个事务在主库中的位点(可以采用以上的GTID方法),超过了就在当前备库读数据,没超过说明备库中的数据还是旧数据,要回主库读数据,如下图所示。
参考文章:
https://time.geekbang.org/column/article/77636
这篇关于MySQL的一主多从机制的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!