主从数据不一致问题

因为主从库间的命令复制是异步进行的,所以有可能客户端从从库中读取到的值和主库中的最新值并不一致。

具体来说,在主从库命令传播阶段,主库收到新的写命令后,会发送给从库。但是,主库并不会等到从库实际执行完命令后,再把结果返回给客户端,而是主库自己在本地执行完命令后,就会向客户端返回结果了。如果从库还没有执行主库同步过来的命令,主从库间的数据就不一致了。

从库滞后执行同步命令主要有两种情况:

  • 一方面,主从库间的网络可能会有传输延迟,所以从库不能及时地收到主库发送的命令,从库上执行同步命令的时间就会被延后。

  • 另一方面,即使从库及时收到了主库的命令,但是,也可能会因为正在处理其它复杂度高的命令(例如集合操作命令)而阻塞。

为了避免从库会滞后执行同步命令,有以下两种方法:

  • 首先,在硬件环境配置方面,我们要尽量保证主从库间的网络连接状况良好。例如,我们要避免把主从库部署在不同的机房,或者是避免把网络通信密集的应用(例如数据分析应用)和 Redis 主从库部署在一起。
  • 另外,我们还可以开发一个外部程序来监控主从库间的复制进度。

读取过期数据问题

这个问题是由 Redis 的过期数据删除策略引起的。Redis 同时使用了两种策略来删除过期的数据,分别是惰性删除策略和定期删除策略。

  • 惰性删除策略:当一个数据的过期时间到了以后,并不会立即删除数据,而是等到再有请求来读写这个数据时,对数据进行检查,如果发现数据已经过期了,再删除这个数据。
  • 定期删除策略:Redis 每隔一段时间(默认 100ms),就会随机选出一定数量的数据,检查它们是否过期,并把其中过期的数据删除,这样就可以及时释放一些内存。

首先如果过期数据很多,并且一直没有再被访问的话,定期删除检查的数据数量也并不多,这些数据就会留存在 Redis 实例中。业务应用之所以会读到过期数据,这些留存数据就是一个重要因素。

其次如果客户端从主库上读取留存的过期数据,主库会触发删除操作,此时,客户端并不会读到过期数据。但是,从库本身不会执行删除操作,如果客户端在从库中访问留存的过期数据,从库并不会触发数据删除。

如果你使用的是 Redis 3.2 之前的版本,那么,从库在服务读请求时,并不会判断数据是否过期,而是会返回过期数据。在 3.2 版本后,Redis 做了改进,如果读取的数据已经过期了,从库虽然不会删除,但是会返回空值,这就避免了客户端读到过期数据。所以,在应用主从集群时,尽量使用 Redis 3.2 及以上版本。

Redis 3.2 后的版本也并不能完全保证读不到过期数据,这跟 Redis 用于设置过期时间的命令有关系,有些命令给数据设置的过期时间在从库上可能会被延后,导致应该过期的数据又在从库上被读取到了,我来给你具体解释下。

我先给你介绍下这些命令。设置数据过期时间的命令一共有 4 个,我们可以把它们分成两类:

  • EXPIRE 和 PEXPIRE:它们给数据设置的是从命令执行时开始计算的存活时间;

  • EXPIREAT 和 PEXPIREAT:它们会直接把数据的过期时间设置为具体的一个时间点。

这 4 个命令的参数和含义如下表所示:

当主从库全量同步时,如果主库接收到了一条 EXPIRE 命令,那么,主库会直接执行这条命令。这条命令会在全量同步完成后,发给从库执行。而从库在执行时,就会在当前时间的基础上加上数据的存活时间,这样一来,从库上数据的过期时间就会比主库上延后了。

为了避免这种情况,我给你的建议是,在业务应用中使用 EXPIREAT/PEXPIREAT 命令,把数据的过期时间设置为具体的时间点,避免读到过期数据。

Redis主从数据不一致及读取过期数据问题的解决方案相关推荐

  1. MySQL主从数据不一致,怎么办?

    先给大家说个身边的故事. 小伙伴二狗最近面宇宙厂,前面被问MySQL索引.锁.主从复制原理时答的都很开心. 当面试官问到 :"你们遇到主从不一致的问题怎么解决呢?你有什么更好的方案吗?&qu ...

  2. mysql 主从 不一致_揭秘MySQL主从数据不一致

    前言: 目前MySQL数据库最常用的是主从架构,大多数高可用架构也是通过主从架构演变而来.但是主从架构运行时间长久后容易出现数据不一致的情况,比如因从库可写造成的误操作或者复制bug等,本篇文章将会详 ...

  3. mysql主从字符集不一致_MySQL多字节字符集造成主从数据不一致问题

    问题产生线上一直有个历史遗留问题,最近DBA提了出来,所以跟了下代码,作了下简单分析,问题描述如下: 在master-slave的环境下,对master上的某个表中的数据插入,会导致master-sl ...

  4. 基于GTID Replication主从数据不一致操作

    基本的M-S结构 现在master与slave主机数据一致: mysql> select * from t1; +------+ | id   | +------+ |    1 | |    ...

  5. Redis 主从数据同步

    Redis 数据同步 全量同步 redis 从节点第一次连接主节点采用的是全量同步,包括两个阶段: 第一阶段: 从节点执行slaveof命令和主节点建立了连接,然后发送同步请求: 主节点收到消息判断是 ...

  6. mysql防止从节点可写数据_mysql 主从数据不一致 Slave_SQL_Running: No 解决方法

    在slave服务器上通过如下命令 MysqL> show slave status\G; 显示如下情况: Slave_IO_Running: Yes Slave_sql_Running: No ...

  7. Redis主从同步方面的坑

    三大坑 主从数据不一致 主从数据不一致,就是指客户端从从库中读取到的值和主库中的最新值并不一致. 举个例子,假设主从库之前保存的用户年龄值是19,但是主库接收到了修改命令,已经把这个数据更新为20了, ...

  8. 10丨 Redis主从同步与故障切换,有哪些坑

    1. 主从数据不一致   主从数据不一致,就是指客户端从从库中读取到的值和主库中的最新值并不一致.举个例子,假设主从库之前保存的用户年龄值是 19,但是主库接收到了修改命令,已经把这个数据更新为 20 ...

  9. Redis主从、哨兵、 Cluster集群一锅端

    1. Redis 主从 面试官经常会问到Redis的高可用.Redis高可用回答包括两个层面,一个就是 数据不能丢失,或者说尽量减少丢失 ;另外一个就是保证 Redis服务不中断 . 对于尽量减少数据 ...

最新文章

  1. 中date转为string_股票数据获取篇(持续更新中...)
  2. python 类-python--类
  3. POJ1328贪心放雷达
  4. LCS2005客户端配置详解:LCS2005系列之二
  5. 云计算概念诠释:18个权威人士的定义
  6. ssh无密码登录设置(centos6系统下实现)
  7. wangeditor html编辑,Vue整合wangEditor富文本编辑器
  8. 方法对头,报表模板维护其实很简单
  9. 5G 如何改写高铁 Wi-Fi?
  10. 基于多搜索引擎和深度学习技术的自动问答
  11. ubuntu 下 imagick PHP扩展的安装
  12. 【转】404、500、502等HTTP状态码介绍
  13. 美图录爬虫(requests模块,re模块)
  14. 计算机会议论文扩充期刊,计算机权威期刊 会议.doc
  15. 简谐振动的能量与合成(大学物理笔记)
  16. 树莓派Remote GPIO启用方法
  17. 推进企业使用正版软件工作部际联席会议第四次全体会议(2010)
  18. 如何使用Windows10自带的photo应用给视频添加字幕
  19. 篮球数据API接口 - 【篮球赛事分析数据】API调用示例代码
  20. 让人眼花缭乱的视错觉,太酷炫了!

热门文章

  1. python中glob_python中的glob模块
  2. java mvvm框架实例_什么是MVVM框架?
  3. 旋转接头的原理和优势以及安装方法
  4. 【MYSQL】一个时间是另一个时间的三分之一
  5. 电子书《大型组织深入推广零代码应用平台的行动指南》正式发布
  6. 解决 You could try using --skip-broken to work around the problem,rpm -Va --nofiles --nodigest问题
  7. Flex Component Kit for Flash CS3
  8. 什么叫真正的Windows系统音频终极增强效果器
  9. 烧心吃什么马上能缓解11 oracle,【图】烧心吃什么马上能缓解 教你如何轻松治疗烧心...
  10. CF449B Jzzhu and Cities