读写分离,当使用从节点响应读请求时,业务端可能会遇到如下问题:

  • 复制数据延迟
  • 读到过期数据
  • 从节点故障

复制数据延迟

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

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

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

  • 一方面,主从库间的网络可能会有传输延迟,所以从库不能及时收到主库发送的命令,从库上执行同步命令的时间就会被延后
  • 另一方面,及时从库及时收到了主库的命令,但是,也可能会因为正在处理其他复杂度高的命令而阻塞

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

  • 首先,在硬件配置方面,我们要尽量保证主从库间的网络连接良好。比如,我们要避免把主从库部署在不同机房,或者是避免把网络通信密集的应用(比如数据分析应用)和redis主从库部署在一起。
  • 另外,在主节点写入数据后立即在从节点上读取可能获取不到(由于网络带宽和命令阻塞),因此需要业务场景允许短时间内的数据延迟
  • 如果无法容忍大量延迟场景,可以编写外部监听程序监听主从节点的复制偏移量,当延迟较大时触发报警或者通知客户端避免读取延迟过高的从节点。实现逻辑如下:
    • 监控程序(monitor)定期检查主从节点的偏移量,主节点偏移量在info replication的master_repl_offset指标记录,从节点偏移量可以查询主节点的slave0字段的offset指标,它们的差值就是主从节点延迟的字节量
    • 当延迟字节量过高时,比如超过10MB。监控程序触发报警并通知客户端从节点延迟过高。可以采用Zookeeper的监听回调机制实现客户端通知
    • 客户端接到具体的从节点高延迟通知后,修改读命令路由到其他从节点或者主节点上。当延迟恢复后,再次通知客户端,恢复从基地的读命令请求
    • 这种方案的成本比较高,需要单独修改适配Redis的客户端类库。如果涉及多种语言成本将会扩大。客户端逻辑需要识别出读写请求并自动路由, 还需要维护故障和恢复的通知。采用此方案视具体的业务而定,如果允许不 一致性或对延迟不敏感的业务可以忽略,也可以采用Redis集群方案做水平扩展

读到过期数据

redis的从库是无法主动的删除已经过期的key的,所以如果做了读写分离,就很有可能在从库读到脏数据

当主节点存储大量设置超时的数据时,如缓存数据,Redis内部需要维护过期数据删除策略。删除策略主要有两种:惰性删除和定时删除。

  • 惰性删除:主节点每次处理读取命令时,都会检查键是否超时,如果超时则执行del命令删除键对象,之后del命令也会异步发送给从节点。需要注意的是为了保证复制的一致性,从节点自身永远不会主动删除超时数据

  • 定时删除:Redis主节点在内部定时任务会循环采样一定数量的键,当发现采样的键过期时执行del命令,之后再同步给从节点,如下图所示

    如果此时数据大量超时,主节点采样速度跟不上过期速度而且主节点没有读取过期键的操作,那么从节点将无法收到del命令。此时在从节点上就可以读取到已经超时的数据。

如何避免从库读取到脏数据

  1. 通过scan命令扫库

当redis中的key被scan时,相当于访问了该key,同样也会做过期检测,充分发挥redis惰性删除的策略。这个方法能大大降低脏数据读取的概念。缺点也比较明显,会造成一定的数据压力。

  1. 升级到redis新版本

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

redis面试:由于主从延迟导致读取到过期数据怎么处理相关推荐

  1. 数据库主从延迟导致查询不准确的解决思路

    强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan [前言] 当数据达到一定量的时候,数据库会成为整个系统的瓶颈,一般采取的优化策略为读写分离,数据 ...

  2. Day43-Java面试系列(七)- Redis面试专题

    概述 1. Redis是什么?简述它的优缺点? Redis本质上是一个Key-Value类型的内存数据库,很像Memcached,整个数据库加载在内存当中操作,定期通过异步操作把数据库中的数据flus ...

  3. redis mysql主从延迟_MySQL主从延迟问题解决

    今天我们就来看看为什么会产生主从延迟以及主从延迟如何处理等相关问题. 坐好了,准备发车! 主从常见架构 随着日益增长的访问量,单台数据库的应接能力已经捉襟见肘.因此采用主库写数据,从库读数据这种将读写 ...

  4. 分析与解决:MySQL分区表复制bug导致的主从延迟

    来自:DBAplus社群 作者介绍 张松坡,腾讯云数据库架构师,主要负责腾讯云数据库MySQL.Redis等数据库架构设计.数据库运维.运营开发等工作.曾就职于腾讯新闻.腾讯视频. 写在前面,感谢腾讯 ...

  5. 【运维面试】面试官:mysql主从延迟是怎么处理的

    前言 运维关于mysql的面试题,最常见的就是mysql主从同步,对于主从同步这一块稍微深入一点的就是mysql主从延迟怎么产生的,怎么解决的. 现阶段的互联网公司,一般都是读多写少,一个主库配几个从 ...

  6. redis面试精华指南pdf

    本文将会从:Redis 使用场景与介绍 -> 数据结构与简单使用 -> 小功能大用处 -> 持久化.主从同步与缓存设计 -> 知识拓展 (缓存与数据库同步策略,分布式锁, 集群 ...

  7. Redis面试知识点

    Redis面试知识点 1.Redis概述 在我们日常的Java Web开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉 ...

  8. Redis面试突击串讲 --图灵

    Redis面试突击串讲 什么是Redis Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的高性能非关系型(NoSQL)的键值对数据库. 与传统数据库不 ...

  9. 看完这篇再也不怕 Redis 面试了

    看完这篇再也不怕 Redis 面试了 0x00.前言 Redis是跨语言的共同技术点,无论是Java还是C++都会问到,所以是个高频面试点. 笔者是2017年才开始接触Redis的,期间自己搭过单机版 ...

最新文章

  1. 电子书下载:Learn Office 2011 for Mac OS X
  2. [云炬创业基础笔记]第二章创业者测试13
  3. .Net使用RabbitMQ详解
  4. 在使用win 7 无线承载网络时,启动该服务时,有时会提示:组或资源的状态不是执行请求操作的正确状态。 网上有文章指出,解决这个问题的方法是在设备管理器中启动“Microsoft托管网络虚拟适配
  5. mysql online ddl 5.6_MySQL 5.6的Online DDL功能测试
  6. c++ 函数当参数传参,类函数当参数传参,匿名函数当参数传参,function<void()>
  7. Android:访问网络资源,在手机本地显示网络资源源代码
  8. 使用AWS DMS 升级Postgre 10到12
  9. 沪江前端由H5页面引起的一场前端数据结构讨论
  10. PyTorch并行与分布式(二)分布式通信包torch.distributed
  11. Ansible之五:常用模块
  12. 那些年被我坑过的Python——不得不知(第二章)
  13. 「架构师必备」关于网络优化你必须要知道的重点
  14. elementUI select 默认选中
  15. 【笔记】研究生的早期科研之路(作者:中国人民大学 赵鑫)
  16. 记录在处理SIF数据中,遇到的一些问题及解决过程
  17. 【转】金蝶EAS BOS工作流开发(附带JAVA脚本)
  18. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛 G 旋转矩阵 【模拟】
  19. 北京清能互联公司(广州分公司)前端实习总结
  20. 2020牛客寒假算法基础集训营1-nico和niconiconi

热门文章

  1. 守住繁华,需耐得住寂寞
  2. Python程序设计基础(第五章函数 练习记录)
  3. JAVA、大数据微信群
  4. SteamVR---UI交互
  5. Linux系统运维排故思路参考手册
  6. 转~MDX Step by Step 读书笔记(四) - Working with Sets
  7. 古人用计算机计算图片,简直黑科技!咱古人2300多年前就用上“计算器”了
  8. 我的2020,起飞的1年!
  9. JavaXML解析的四种方法(连载)
  10. 对《安娜卡列琳娜》的一点感想