Mysql读写分离

作者: 归来依旧少女 | 来源:发表于2019-06-16 21:08 被阅读125次

    一、什么是读写分离?

    就是读写分开,读从一个数据库读,写从另一个数据库写。基于主从复制架构,一个主库,多个从库。写入主库,读从多个从库中读。

    二、Mysql主从复制的原理

    主库将变更写入到binlog日志中,从库有一个io线程,将主库的binlog日志备份到本地,写入到relay中继日志中。从库有一个SQL线程读取relay日志中的内容,在本地执行一遍。这样主库就与数据库内容一致了。

    mysql主从复制

    但是同时带来一个问题,主从复制会有一定的延时性,在从库还未执行复制之前查询就会有数据不一致的问题。所以刚写入主库的数据从库中是读取不到的,要过几十毫秒甚至几百毫秒才能读取出来。
    那么怎么解决这个主从数据不一致的问题呢?

    1. 主库分为多个库,减少写的并发压力,从而主从延时时间较短。
    2. 打开mysql支持的并行复制,多个库并行复制。如果某个库写入压力就是很大,那这个方式也没有多大效果。
    3. 业务允许延时读3~5秒的情况下,数据不一致就不一致,到从库中查询。如果写完要求立刻读出来,这种核心业务就直接到主库查询。代码设计上应尽量减少写完立刻度的情况。
      4.中间件比如MySQL Proxy 。
      主库中增加一个conut_table表,每次主库变更时就将conut_table表中id值+1.


      image.png

      当查询的时候,proxy就会查询主库中的conut_table表中id值是否与从库conut_table表中id值一致,一致就从库中查询,不一致就到主库查询。


      image.png
      这样一次查询要查询操作才能完成,但proxy与mysql是连接池的方式实现的,所以相对压力还好。

    三、读写分离的实现

    1. 应用层面实现。代码根据这是查询的动作还是写的动作去选择不同的数据库,spring可以通过aop方便的实现。优点是方便。缺点是不能动态的增加数据源。

    2. 引入中间件。现在比较常用的就是sharding-jdbc,mycat。优点是能动态的增加数据源,缺点是系统更复杂了。

    相关文章

      网友评论

        本文标题:Mysql读写分离

        本文链接:https://www.haomeiwen.com/subject/cqsufctx.html