正文
redis主从延时数据不一致,redis主从怎么保证数据一致性
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
Redis主从模式下过期数据和数据不一致
从库不会进行过期扫描,主库删除时,会在AOF文件里增加一条del指令,同步到所有从库,从库通过此指令来删除。由于指令的同步存在异步,所以会出现主从数据不一致的情况。
数据一致性:由于Redis缓存中的数据与数据库中的数据可能存在不一致的情况,这会导致用户在查询数据时看到不一致的结果。数据过期:缓存数据有过期时间,如果缓存数据过期,需要重新从数据库中获取,这可能会影响查询速度。
因为指令同步是异步进行的,所以主库过期的 key 的 del 指令没有及时同步到从库的话,会出现主从数据的不一致 这是由 redis 的过期策略来决定。redis 过期策略是: 定期删除+惰性删除 。
Redis集群是通过分片来实现横向扩展的,即将数据分散存储在不同的节点上,每个节点只负责一部分数据的读写操作。因此,在集群中,每个节点都存储着不同的数据片段,主节点和从节点之间也会进行数据同步,以保证数据的一致性。
原因一:跟 Redis 的版本有关系,Redis 2 之前版本,读从库并不会判断数据是否过期,所以有可能返回过期数据。解决方案:升级Redis的版本,至少要2 以上版本,读从库,如果数据已经过期,则会过滤并返回空值。
redis主从复制数据延迟解决方案
1、对于无法容忍大量延迟场景,可以编写外部监控程序监听主从节点的复制偏移量,当延迟较大时触发报警或者通知客户端避免读取延迟过高的从节点。
2、应用Redis实现数据的读写,同时利用队列处理器定时将数据写入mysql。
3、Redis实现延时任务,是通过其数据结构ZSET来实现的。ZSET会储存一个score和一个value,可以将value按照score进行排序。
4、主从复制可以将写操作集中在主节点,仅让从节点负责读取数据,从而实现读写分离,并提高Redis集群的性能。
5、redis硬盘中断节点不死主从超时(主从连接超时超过repl-timeout配置的值)a.数据同步阶段:在主从节点进行全量复制bgsave时,主节点需要首先fork子进程将当前数据保存到RDB文件中,然后再将RDB文件通过网络传输到从节点。
6、该参数是可以通过 config set命令动态配置的(即不重启Redis也可以生效)。
redis如何与mysql保持一致性
1、SAGA或者TCC - 这两种需要业务代码的大量配合。通过业务代码来补偿一致性。 现实当中有XA协议。比如Ehcache是支持XA协议的。但是性能表现不佳,运维也麻烦。
2、本文把两种方式都实现下。如果公司有统一的平台接入binlog的话,canal+mq应该是比较好的解耦的方式。
3、读从redis, 没有就到db查。redis设数据超时时间,db数据更新只能准实时。实时要求高的数据超时时间设短点就行了。超时失效可以用消极方法或积极方法,具体自己搜。 写直接写db. 不然要考虑很多问题和情况。
4、比如基于数据库的唯一键来保证重复数据不会重复插入多条。因为有唯一键约束了,重复数据插入只会报错,不会导致数据库中出现脏数据。
脑裂以及Redis主从同步中的坑
因为 master - slave的复制是异步 的(客户端发送给redis,主节点数据同步到内存中后就返回成功了) 所以可能有部分数据还没复制到slave,master就宕机了,此时master内存中的数据也没了,这些部分数据就丢失了。
redis的集群脑裂是指因为网络问题,导致redis master节点跟redis slave节点和sentinel集群处于不同的网络分区,此时因为sentinel集群无法感知到master的存在,所以将slave节点提升为master节点。
redis集群没有过半机制会有脑裂问题,网络分区导致脑裂后多个主节点对外提供写服务,一旦网络分区恢复,会将其中一个主节点变为从节点,这时会有大量数据丢失。
border-radius: 4px;` uuid = gen()问题-4 假如redis主节点宕机,主从同步延迟或者有问题,那么从成为主之后,客户端就会重新获取到锁,这样也会并发不安全。
在线上灰度环境试运行后,发现两个问题,一个是程序没有主动释放锁,另一个是redis没有删除超时过期的key,导致key值一直存在,后续的操作一直被排斥。
主从复制启用 从节点开启主从复制,有3种方式:配置文件: 在从服务器的配置文件中加入 slaveofmasteripmasterport。启动命令: redis-server启动命令后加入 --slaveofmasteripmasterport。
如何保持redis和DB的数据一致性
如果没有消费过,你就处理,然后这个 id 写 Redis。如果消费过了,那你就别处理了,保证别重复处理相同的消息即可。比如基于数据库的唯一键来保证重复数据不会重复插入多条。
SAGA或者TCC - 这两种需要业务代码的大量配合。通过业务代码来补偿一致性。 现实当中有XA协议。比如Ehcache是支持XA协议的。但是性能表现不佳,运维也麻烦。
从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。这种方案下,我们可以对存入缓存的数据设置过期时间,所有的写操作以数据库为准,对缓存操作只是尽最大努力即可。
读从redis, 没有就到db查。redis设数据超时时间,db数据更新只能准实时。实时要求高的数据超时时间设短点就行了。超时失效可以用消极方法或积极方法,具体自己搜。 写直接写db. 不然要考虑很多问题和情况。
redis主从延时数据不一致的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于redis主从怎么保证数据一致性、redis主从延时数据不一致的信息别忘了在本站进行查找喔。