转载部分

Mysql读写分离

2019-06-16  本文已影响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。优点是能动态的增加数据源,缺点是系统更复杂了。

上一篇下一篇

猜你喜欢

热点阅读