读写分离数据库如何保持数据⼀致性
数据库读写分离主要解决⾼并发时,提⾼系统的吞吐量。因为⼤部分场景下都是读多写少。下图是数据库读写分离模型。
每次请求打到这个系统后:
1. 读请求,直接读从库
2. 写请求,先写⼊主库,然后主库将数据同步到其他从库
在⾼并发或者⽹络状况不理想时,写完数据后,主库还没来得及将数据同步到从库,其他读请求去读从库,发现从库中的数据仍然是旧数据。这就是读写分离数据库数据不⼀致的根本原因。
下⾯给出两种⽅案去解决这个问题:
缓存标记法
上图流程:
1)A发起写请求,更新了主库,再在缓存中设置⼀个标记,代表此数据已经更新,标记格式( ⽤户ID+业务ID+其他业务维度)
形容观众多的成语2)设置此标记,要加上过期时间,可以为预估的主库和从库同步延迟的时间
3)B发起读请求的时候,先判断此请求的业务在缓存中有没有更新标记
4)如果存在标记,⾛主库;如果没有⾛从库。
这个⽅案就有效了解决了数据不⼀致的问题。
但这个⽅案会有个严重的问题,也就是每次的读请求都要到缓存中去判断是否存在缓存标记,如果是单机部署⽤的是jvm缓存,对性能还好;但如果是集部署缓存肯定⽤redis,每次读都要和redis进⾏交互,这样肯定会影响系统吞吐量。
四级万能作文那么解决这个问题可以⽤下⾯这个⽅案
本地缓存标记
护士装上图流程:
1)⽤户A发起写请求,更新了主库,并在客户端设置标记,过期时间(预估的主库和从库同步延迟的时间),可以使⽤cookie实现2)⽤户A再发起读请求时,带上这个cookie
土豪喜当爹3)服务器处理请求时,获取请求传过来的数据,看有没有这个标记
4)有这个业务标记,⾛主库;没有⾛从库。
明薇穆廷州小说这个⽅案就保证了⽤户A的读请求肯定是数据⼀致的,⽽且没有性能问题,因为标记是本地客户端传过去的。
魔兽世界什么职业好但是⽆法保证其他⽤户读数据是⼀致的,但是实际场景很少需要保持其他⽤户也保持强⼀致。延迟个⼏秒也没问题。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论