来源:搜狐 时间:2023-09-26 18:03:27
读写分离架构的收益很明显,但也会带来一些问题,核心的问题就是数据读一致性问题。
造成不一致的原因主要是主从复制时的数据延迟,数据库中设置主从数据为强同步是可以避免一致性问题,但是如果你有5个从、10个从时会怎样?相信性能的下降会使你用到崩溃,因此业务一般不会使用同步复制方式而采用异步复制;异步带来了效率的提升,假设A请求修改了数据t1,紧接着B请求查询t1数据,查询结果会是什么?
返回什么
返回结果处于不确定状态,当B请求负载到主节点或者已经完成数据同步的从节点上时结果为最新数据,当负载到未完成数据同步的从节点时结果为旧数据;这种不确定性造成读数据产生不一致,这种情况也称为数据的最终一致性,即在未来的某个时间点数据能够达到一致性;但这种方式会对一致性敏感的业务造成影响,如何解决这类问题呢?
我们先将问题范围缩小到一个会话(session)内即一个连接中处理。核心需要解决的问题是:如何在做负载之前得知哪些节点已经是最新数据了?
数据库中有个名词叫日志序列编号(LSN)是事务日志里面每条记录的编号,我们可以利用它来判断节点是否具有最新数据,过程也容易理解:
(1)更新操作执行后获取该操作对应的LSN;
(2)获取从节点日志回放的最新LSN;
(3)负载时判断哪些节点的LSN >= 当前session的最大LSN,满足条件的节点即可作为请求处理的节点。
相关推荐
猜你喜欢