背景
读写分离提高了资源的利用效率的同时也引出了一个问题,就是由于延时(网络传输,操作)而引起的数据库主从不一致的问题,对于这个问题,给一下集中解决方案。
半同步复制
- 先对主库进行一个写操作
- 等主从同步完成,写主库的请求才返回
- 读从库,读到最新的值
优点:利用数据库原生功能,比较简单
缺点:主库的写请求时延会增长,吞吐量会降低
数据库中间件
- 所有的读写都走数据库中间件,通常情况下,写请求路由到主库,读请求路由到从库
- 记录所有路由到写库的key,在主从同步时间窗口内(假设是500ms),如果有读请求访问中间件,此时有可能从库还是旧数据,就把这个key上的读请求路由到主库
- 主从同步时间过完后,对应key的读请求继续路由到从库
优点:能保证绝对一致
缺点:数据库中间件的成本比较高
缓存记录写key
当写请求发生的时候:
- 当某个key要发生写操作时,记录在缓存里,设置缓存超时时间为主从同步时间,假设为500ms
- 修改数据库
当读请求发生的时候:
- 先到缓存里查看有没有对应的key
- 如果有,说明这个key上刚发生过写操作,此时直接从缓存中读取值并返回
- 如果没有,说明这个key上近期没有发生过写操作,此时将请求路由到从库,继续读写分离
优点:相对数据库中间件,成本较低
缺点:引入了一个缓存组件,并且读写数据库时都多了一步读写缓存操作