mysql主从分离的思考

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yj1499945/article/details/90903891

为了缓解数据库的压力,有些时候会进行主从分离。主从分离的本质就是对主数据库binlog进行读取写入从库。

但是呢,这就带来一个问题如果从库在binlog写入很慢的时候,你去查询的时候数据是不存在的。但是的确在主库里面数据已经存在了。而且还不能在主库进行读取数据,不然就失去了主从分离的意义。因为在写代码的时候要注意一点这个问题。

说到这里 那么肯定有对应的解决方案:

1、半同步复制

先对主库进行一个写操作

等主从同步完成,写主库的请求才返回

读从库,读到最新的值

优点:利用数据库原生功能,比较简单
缺点:主库的写请求时延会增长,吞吐量会降低

2、数据库中间件

所有的读写都走数据库中间件,通常情况下,写请求路由到主库,读请求路由到从库

记录所有路由到写库的key,在主从同步时间窗口内(假设是500ms),如果有读请求访问中间件,此时有可能从库还是旧数据,就把这个key上的读请求路由到主库

主从同步时间过完后,对应key的读请求继续路由到从库

优点:能保证绝对一致
缺点:数据库中间件的成本比较高

3、缓存记录写key

当写请求发生的时候:

  • 当某个key要发生写操作时,记录在缓存里,设置缓存超时时间为主从同步时间,假设为500ms
  • 修改数据库

当读请求发生的时候:

  • 先到缓存里查看有没有对应的key
  • 如果有,说明这个key上刚发生过写操作,此时直接从缓存中读取值并返回
  • 如果没有,说明这个key上近期没有发生过写操作,此时将请求路由到从库,继续读写分离

优点:相对数据库中间件,成本较低
缺点:引入了一个缓存组件,并且读写数据库时都多了一步读写缓存操作

猜你喜欢

转载自blog.csdn.net/yj1499945/article/details/90903891