关于Redis集群同步/持久化/淘汰机制的详解

Redis是非常常用的KV数据库, 使用内存以及HashMap进行存储的特点带来了高效的查询. 本文将围绕Redis的常见开发使用场景, 阐述在Redis集群中各个节点是如何进行数据同步, 每个节点如何进行持久化以及在长期使用中如何对数据进行更新和淘汰.

如果对Redis有更多的兴趣, 可以查看我的技术博客: https://dingyuqi.com

下面是Redis在开发过程中常用的几种使用场景.
在这里插入图片描述

集群

Redis对于集群的部署支持三种模式: 主从, 哨兵和分片. 在正式的生产环境中一般会采用一主一从+哨兵的模式来解决高可用和高并发读的问题, 但是这种模式无法解决高并发写的问题. 高并发写可以借助于分片集群.

主从模式

由于单个服务器的并发数量存在上限, 我们可以使用主从模式实现读写分离, 以此提高读写的效率. 通常主节点进行写操作, 从节点进行读操作.

在主从模式中主节点和从节点之间存在数据同步的问题, 目前Redis支持两种不同的同步方式: 全量同步和增量同步.

全量同步

在了解全量同步的流程之前, 我们先熟悉几个Redis内部的定义:

  1. ReplicationId: 数据集标记, id一致说明是同一个数据集.
  2. repl-baklog: 命令的日志文件. 主要用于记录同步过程中master生成快照到slave拷贝快照这段时间master接受的命令.
  3. offset: repl-baklog的偏移量. slave的offset如果小于master则说明版本落后于master, 需要更新.

下面是全量同步的流程时序图:

slave master 执行replicaf命令建立连接 1 请求同步(参数: ReplicationId+offset) 2 判断是否为第一次同步请求(判断replid是否一致) 3 返回master的版本信息 4 保存版本信息 5 执行`bgsave`生成RDB 6 发送RDB文件 7 清空本地, 加载RDB 8 记录此间受到的所有命令到repl-baklog中 9 发送repl-baklog 10 执行repl-baklog中所有的命令 11 slave master

::: tip
步骤9实际上记录了步骤6到步骤10之间master收到的所有命令.
:::

增量同步

在了解过全量同步后, 再来对比看一下增量同步的流程. 增量同步主要用于slave节点重启后或者后期出现数据变化的场景.

slave master 重启 1 同步ReplicationId, offset 2 判断ReplicationId是否一致 3 不是第一次, 回复continue 4 从repl-baklog中获取offset之后的数据 5 发送offset之后的命令 6 执行命令 7 slave master

哨兵模式

哨兵模式主要用来实现主从集群的自动恢复. 主要的功能有三个:

  1. 监控: 检查master和slave是否正常工作
  2. 自动恢复: 如果master出现故障, 提升slave为master
  3. 通知: 集群发生故障转移时, 将最新的信息推送给Redis客户端
监控

用心跳机制, 每隔15s发一次ping确保节点的状态保持活跃. 节点下线分为两种情况:

  1. 主观下线: 某个节点超时未响应.
  2. 客观下线: 超过阈值数量的哨兵认为某节点下线. 阈值变量为quorum.
选主

当Redis中的master节点宕机后, 会使用类似Raft的投票机制来进行选主. 选主的标准大致基于以下几个:

  1. slave-priority越小
  2. offset越小
  3. 运行id越小

分片集群

分片集群主要用于应对海量的数据, 有以下几个特点:

  1. 多个master. 每个master都会存储不同的数据
  2. 每个master有多个slave
  3. master之间会用ping检测健康
  4. client可访问任意的节点进行读写, 内部会将请求自动转发到正确的节点上

那么如果不同的master存储的是不同的数据, Redis又是如何决定每一个数据应当存储到哪个节点上呢? Redis使用的是插槽, 一共有16384个插槽. 大致过程为: 首先根据key的有效部分计算Hash值, 再与16384取余决定其插槽位置, 再去取数据.

至于为什么插槽的数量定为16384, 其作者有做过正式答复:

why redis-cluster use 16384 slots?

  • Normal heartbeat packets carry the full configuration of a node, that can be replaced in an idempotent way with the old in order to
    update an old config. This means they contain the slots configuration
    for a node, in raw form, that uses 2k of space with16k slots, but
    would use a prohibitive 8k of space using 65k slots.
  • At the same time it is unlikely that Redis Cluster would scale to more than 1000 mater nodes because of other design tradeoffs. So 16k
    was in the right range to ensure enough slots per master with a max of
    1000 maters, but a small enough number to propagate the slot
    configuration as a raw bitmap easily. Note that in small clusters the
    bitmap would be hard to compress because when N is small the bitmap
    would have slots/N bits set that is a large percentage of bits set.

持久化

Redis一共提供两种持久化的策略: RDB和AOF, 现在我们分别来看一下这两种策略的优缺点.

RDB

RDB是基于快照的全量备份, 周期性地把全量的数据写入快照文件.

优点

  1. 恢复快. 因为是全量数据直接恢复就好
  2. 主进程不进行I/O, 对节点影响小

缺点

  1. 丢失间隔. RDB是快照文件, 两个快照之间节点宕机会导致快照之间的修改会丢失
  2. 老版本无法兼容. RDB文件格式与Redis的版本息息相关, 不同版本可能无法使用相同的RDB进行恢复
  3. 设置的备份的间隔时间过长, RDB太大的时候可能导致服务暂停

AOF

AOF策略是对内存修改进行指令记录.

优点

  1. 不会出现数据丢失. 最多丢失1s的数据
  2. 没有磁盘寻址开销. 因为日志是追加写入(append-only)
  3. 日志可读. 该场景可以用于紧急恢复, 例如误删了重要数据后, 可以趁着文件还未更新前将AOF保存下来.

缺点

  1. AOF日志比RDB更大. 因为AOF是指令文件, RDB是二进制文件
  2. 性能低. 因为备份间隔更小
  3. 恢复慢. 需要执行一遍AOF中的指令才能恢复

过期淘汰机制

随着Redis集群的使用时间不断增加, 里面保存的KV越来越多, 此时就会面临内存不够用的问题. Redis为此提供了过期和淘汰策略来管理海量的数据.

过期策略

顾名思义就是每一个数据在Redis当中都有一个"寿命", 当过了设定的有效时间该数据就会变为无效的数据, 不再支持读写. Redis提供两种过期策略:

  1. 定期删除: 每隔100ms随机删除部分过期key. 这里只删除部分的原因是如果进行全量扫描会导致Redis性能过低. 如果想要调整扫描间隔可以修改参数h2.
  2. 惰性删除: 不进行定期扫描, 仅仅在查询的时候判断该key是否过期, 如果过期则删除

还有一些额外的场景下Redis会对过期的key进行统一的处理:

  1. RDB生成和载入
  2. AOF的写入和重写
  3. 主从同步
    以上几种场景中都会过滤过期的key, 即过期的key不会进入快照文件或者被同步到slave节点.

淘汰机制

序号名称定义
1volatile_LRU设置了过期时间的key中执行LRU算法
2allkeys-LRU在所有key中执行LRU算法
3volatile_LFU设置了过期时间的key中执行LFU算法
4allkeys-LFU在所有key中执行LFU算法(删除最不常用的key)
5volatile_random设置了过期时间的key中执行随机删除
6allkeys-random在所有key中执行随机删除
7volatile_TTL删除过期时间最早的key
8noeviction不进行key的删除(默认配置, 但是正常开发中不会使用该模式)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/418667.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中方法的使用详解

1.引言 假设有一个美女博主,每次发的照片都特别漂亮 然后该博主的评论区每次都会有很多粉丝的评论: 哇!宝宝好漂亮,求上衣链接!!! 老婆亲亲!这个口红是什么色号呀? 宝…

【go】内存分配模型

内存是怎么分配给对象的? 内存分配优化的地方是? 讲讲golang内存分配模型? ans: 1.按照对象的大小分配:先算出对象的大小如果是tiny对象,就从tiny block中获取地址和偏移量,将对象打包到mcache;如果是16B以…

Python 在Excel中应用和取消多种不同类型的数据筛选

目录 安装Python Excel处理库 Python 在 Excel 中应用文本筛选 Python 在 Excel 中应用数字筛选 Python 在 Excel 中应用字体颜色、单元格颜色或图标集筛选 Python 在 Excel 中应用日期筛选 Python 在 Excel 中应用动态日期筛选 Python 在 Excel 中筛选空单元格或非空单…

【ArcGIS Pro第一期】界面简介

ArcGIS Pro简介 ArcGIS Pro界面简介1.1 打开工程1.2 使用功能区上的工具 参考 ArcGIS Pro 是一种基于功能区的应用程序。 ArcGIS Pro 窗口顶部的功能区有许多命令可供选择,而根据需要打开的各个窗格(可停靠窗口)中则提供了更为高级或专用的功…

快速排序(QuickSort)-归并排序(MergeSort)[java编写]

1. 快速排序 1.1 基本概述 快速排序采用分治思想,即在一个无序的序列中选取一个任意的基准元素pivot,利用pivot 将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用…

参会邀请 | 第二届机器视觉、图像处理与影像技术国际会议(MVIPIT 2024)

第二届机器视觉、图像处理与影像技术国际会议(MVIPIT 2024)将于2024年9月13日-15日在中国张家口召开。 MVIPIT 2024聚焦机器视觉、图像处理与影像技术,旨在为专家、学者和研究人员提供一个国际平台,分享研究成果,讨论…

算法训练营——day3长度最小子数组

1 长度最小子数组-力扣209(中等) 1.1 题目: 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返…

基于orangePi的智能家居系统

目录 一.接线图 1.orangePi接线 2.继电器接线 二.语音模块的配置 1.pin脚的配置 2.命令词自定义信息 三.测试 1.通过gpio指令测试烟雾检测器是否正确连接 2.编写脚本测试其他模组接线是否正常 四.人脸识别方案 1.首先开通人脸搜索识别服务 2. 点击产品控制台,向人…

2024年四川省安全员B证证考试题库及四川省安全员B证试题解析

题库来源:安全生产模拟考试一点通公众号小程序 2024年四川省安全员B证证考试题库及四川省安全员B证试题解析是安全生产模拟考试一点通结合(安监局)特种作业人员操作证考试大纲和(质检局)特种设备作业人员上岗证考试大…

ARM----时钟

时钟频率可以是由晶振提供的,我们需要高频率,但是外部接高的晶振会不稳定,所有使用PLL(锁相环)来放大频率。接下来就让我们学习用外部晶振提供的频率来配置时钟频率。 一.时钟源的选择 在这里我们选择外部晶振作为时钟…

数据库面试题学习

B树和B树 B树 排好序的 节点内部有多个元素 B树 排好序的 节点内多个元素 叶子节点有指针(双向指针) 非叶子节点冗余了一份在叶子节点 mysql定义B树 InnoDB B树是B树的升级版~ InnoDB b树是怎么产生的 mysql 页 目录 16KB 自增id uuid 一页最多可以存储…

【精选】文件摆渡系统:跨网文件传输的安全与效率之选

文件摆渡系统可以解决哪些问题? 文件摆渡系统(File Shuttle System)主要是应用于不同网络、网段、区域之间的文件数据传输流转场景, 用于解决以下几类问题: 文件传输问题: 大文件传输:系统可…

Windows bat脚本学习九(srec_cat)

一、简介 srec_cat是一个在嵌入式开发中,使用非常频繁的软件,这里做个常用功能的介绍。 二、常用参数 文件类型 在使用srec_cat指令时,在输入文件和输出文件时,要指明文件的类型,如: input.hex -intel …

2024国赛数学建模C题完整论文:农作物的种植策略

农作物种植策略优化的数学建模研究(完整论文,持续更新,大家持续关注,更新见文末名片 ) 摘要 在本文中,建立了基于整数规划、动态规划、马尔科夫决策过程、不确定性建模、多目标优化、相关性分析、蒙特卡洛…

网络层 VII(IP多播、移动IP)【★★★★★★】

一、IP 多播 1. 多播的概念 多播是让源主机一次发送的单个分组可以抵达用一个组地址标识的若干目的主机,即一对多的通信。在互联网上进行的多播,称为 IP 多播(multicast , 以前曾译为组播)。 与单播相比,在一对多的…

Linux_kernel移植uboot07

一、移植 根据硬件平台的差异,将代码进行少量的修改,修改过后的代码在目标平台上运行起来 移植还需要考虑硬件环境,驱动只需要考虑内核的环境 二、移植内容 1、移植Uboot uboot属于bootloader的一种,还有其他的bootloader&#x…

【超简单】1分钟解决ppt全文字体一键设置

省流 ppt的全部字体需要在“幻灯片母版”里面,“自定义字体”去设置好标题与正文的字体之后才算全部设置完毕 “视图”---“幻灯片母版” 找到“字体”---“自定义字体” 设置好中文和西文的字体,都可以按照自己的选择来,保存即可 吐槽 之…

通信工程学习:什么是FEC前向纠错

FEC:前向纠错 FEC(Forward Error Correction,前向纠错)是一种增加数据通信可信度的技术,广泛应用于计算机网络、无线通信、卫星通信等多种数据传输场景中。其基本原理和特点可以归纳如下: 一、FEC前向纠错…

固态硬盘装系统有必要分区吗?

前言 现在的新电脑有哪一台是不使用固态硬盘的呢?这个好像很少很少了…… 有个朋友买了一台新的笔记本电脑,开机之后,电脑只有一个分区(系统C盘500GB)。这时候她想要给笔记本分区…… 这个真的有必要分区吗&#xf…