问题
在高并发的场景下,一般是读写分离,写主库,读从库。
但是主从同步存在延迟,原因可能有
a. 主库的从库太多
b. 从库硬件配置比主库差
c. 慢 SQL 语句过多
d. 主从库之间的网络延迟
e. 主库读写压力大
如果数据写入主库之后还未来得及同步到从库,此时读从库就会读到脏数据
解决方案
1、基于数据库中间件(canal)
1)所有的读写请求都走数据库中间件,通常情况下,写请求路由到主库,读请求路由到从库
2)记录所有路由到写库的key,在主从同步时间窗口内(假设是500ms),如果有读请求访问中间件,此时有可能从库还是旧数据,就把这个key上的读请求路由到主库。
3)在主从同步时间过完后,对应key的读请求继续路由到从库。
能保证一致但是数据库中间件的成本较高
2、基于缓存
写流程:
1)如果key要发生写操作,记录在cache里,并设置“经验主从同步时间”为的cache超时时间,例如500ms
2)然后修改主数据库
读流程:
1)先到缓存里查看,对应key有没有相关数据
2)有相关数据,说明缓存命中,这个key刚发生过写操作,此时需要将请求路由到主库读最新的数据。
3)如果缓存没有命中,说明这个key上近期没有发生过写操作,此时将请求路由到从库,继续读写分离。、
成本低,但对数据库的操作增加了对缓存的操作
标签:主库,读写,key,一致性,从库,主从,路由 From: https://www.cnblogs.com/yogayao/p/17480502.html