🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 主从库延迟问题 由于主从延迟,在实际上主从架构有些问题,如下 * 用户写主库,由于延迟,用户读从库,数据确没有读到 * 如果用户只读,但前后俩次被路由到俩个从库,则数据可能不一致 先说解决第一个问题办法: * 应该保证如果是一个事务内的写-读操作, 那读写都应该是主库,ConnectionSource.getConn 需要实现这个逻辑,BeetlSQL默认已经实现此逻辑,参考SpringConnectionSource 源码 * 如果写主库后,业务页面发起的请求,是否要查主库,这有俩个解决办法,第一个办法比较通用 通用解决办法 * 通用解决办法: ConnectionSource 在update操作后,应该给web cookie 设置一个超时时间,所以后续的所有读操作,检测这个cookie 是否存在,如果存在,说明此会话刚写完不久,所有操作都路由到主库。BeetlSQL没有内置实现设置web cookie功能,用户可以自己扩展ConnectionSource实现。 这个超时时间一句主从复制具体延时来评估,比如设置10秒。 也可用session设定一个上次更新主库时间 * 根据业务场景来决定,比如用户修改自己的profile,那凡是操作自己数据,读写必须是主库。如果是读别人数据,如查看别的用户profile,则从从库。 ​ 第二个解决办法:一般情况下是一主多从,或者从库也有自己的从库,因此需要设计路由策略,保证用户始终只访问一个从库。可以根据当前用户id或者当前IP地址等信息,hash后路由到一个确定从库,ConnectionSource目前实现是随机从库的,需要用户自己去实现路由库的策略 BeetlSQL这就要能按照如上方式,重写ConnectionSource的路由策略,即可支持,开发者需要结合自己的框架自行实现 > 此方案解决了同一个人用户能看到一致的数据,无法解决俩个用户,被路由到不同的从库,看到不同的数据的情况,这只分布式带来不可避免问题。