数据库读写分离
Mysql复制原理
负载容量的规划
上面的答案是1台主3台从。分析如下:
- 2倍的负载就是提高到 1000 X2 =2000次的查询
- 2000 x 20% = 400 次的写操作
- 80% X 1000 X 2 =1600 次的读操作
- 将1600的读操作转移到从库上去,每台从库支持1000次的查询,从库需要预留从主库读过来的请求(400), 这个时候,每个从库剩下600的读操作。1600/600 =3 .所以需要3台从库。 也就是1主3从。
复制无法扩展写操作
数据库同步延迟的解决办法
DB主从架构一致性优化方法
半同步复制(影响性能,基本不这样操作)
- 系统先对DB-master进行了一个写操作,
- 写主库等主从同步完成,写主库的请求才返回
- 读从库,读到最新的数据(如果读请求先完成,写请求后完成,读取到的是“当时”最新的。
写操作的脚本强制读主库,可借助数据库代理实现(工作中经常使用)
- 将统一脚本中的后续读操作都从主库读取。可以配置数据库代理自动实现。比如db_proxy等。
缓存记录写key法(因为网络抖动,延时超过500秒,也不建议使用)
- 将某个库上的某个key要发生写操作,记录在cache里,并设置“经验主从同步时间”的cache超时时间,例如500ms
- 修改数据库
- 读库时先到cache里查看,对应库的对应key有没有相关数据如果cache hit,有相关数据,说明这个key上刚发生过写操作,此时需要将请求路由到主库读最新的数据 。
- 如果cache miss,说明这个key上近期没有发生过写操作,此时将请求路由到从库,继续读写分离 。