[Redis][集群][上]详细讲解

news2024/9/28 11:33:33

目录

  • 0.前言
  • 1.基本概念
  • 2.数据分片算法
    • 0.前言
    • 1.哈希求余
    • 2.一致性哈希算法
    • 3.哈希槽分区算法(Redis使用)


0.前言

  • 说明:该章节相关操作不需要记忆,理解流程和原理即可,用的时候能自主查到即可

1.基本概念

  • 哨兵模式提高了系统的可用性,但是真正用来存储数据的还是masterslave节点,所有的数据都需要存储在单个masterslave节点中
    • 如果数据量很大,接近超出了master/slave所在机器的物理内存,就可能出现严重的问题了
  • 如何获取更大的空间?
    • 加机器即可
    • 所谓”大数据”的核心,其实就是一台机器搞不定了,用多台机器来搞定
  • Redis集群就是在上述的思路下,引入多组Master/Slave,每组Master/Slave存储数据全集的一部分,从而构成一个更大的整体,称为Redis集群(Cluster)
  • 假定整个数据全集是1TB,引入三组Master/Slave来存储,那么每一组机器只需要存储整个数据全集的 1 / 3 1/3 1/3即可
    • 三组机器存储的数据都是不同的
    • 每个Slave都是对应Master的备份,当Master挂了,对应的Slave会补位成Master
    • 每个红框部分都可以称为是一个**分片**(Sharding)
      • 如果全量数据进一步增加,只要再增加更多的分片,即可解决
    • 示例
      • Master1Slave11Slave12保存的是同样的数据,占总数据的 1 / 3 1/3 1/3
      • Master2Slave21Slave22保存的是同样的数据,占总数据的 1 / 3 1/3 1/3
      • Master3Slave31Slave32保存的是同样的数据,占总数据的 1 / 3 1/3 1/3
        请添加图片描述

2.数据分片算法

0.前言

  • Redis Cluster的**核⼼思路是⽤多组机器来存数据的每个部分**
  • 那么接下来的核⼼问题就是,给定⼀个数据(⼀个具体的key),那么这个数据应该存储在哪个分⽚上? 读取的时候⼜应该去哪个分片读取?

1.哈希求余

  • 设有N个分片,使用[0, N-1]进行编号

    • 针对某个给定的key,先计算hash值,再把得到的结果%N,得到的结果即为分片编号
    • 后续如果要取某个key的值,也是针对key进行hash,再对N求余,就可以找到对应的分片编号了
      请添加图片描述
  • 优点:简单高效,数据分配均匀

  • 缺点一旦需要进行扩容,N改变了,原有的映射规则被破坏,就需要让节点之间的数据互相传输,重新排列,以满足新的映射规则,此时需要搬运的数据量是比较多的,开销较大
    请添加图片描述


2.一致性哈希算法

  • 为了降低上述的搬运开销,能够更高效扩容,业界提出了”一致性哈希算法”

  • 本质区别

    • 在哈希求余中,当前key属于哪个分片,是交替的
    • 在一致性哈希下,把交替出现,改进成了连续出现,此时就降低了需要搬运数据的可能
  • key映射到分片序号的过程不再是简单求余了,而是改成以下过程

    1. 0 0 0 -> 2 32 − 1 2^{32} - 1 2321这个数据空间,映射到一个圆环上,数据按照顺时针方向增长
      请添加图片描述

    2. 假设当前存在三个分片,就把分片放到圆环的某个位置上
      请添加图片描述

    3. 假定有一个key,计算得到hashH,那么这个key映射到哪个分片呢?

      • H所在位置,顺时针往下找,找到的第一个分片,即为该key所从属的分片
        请添加图片描述

      • 这就相当于,N个分片的位置,把整个圆环分成了N个管辖区间,keyhash值落在某个区间内,就归对应区间管理
        请添加图片描述

    4. 如果扩容一个分片,如何处理呢?

      • 原有分片在环上的位置不动,只要在环上新安排一个分片位置即可
      • 此时只需要把0号分片上的部分数据,搬运给3号分片即可,1号分片和2号分片管理的区间都是不变的
        请添加图片描述
  • 优点:大大降低了扩容时数据搬运的规模,提高了扩容操作的效率

  • 缺点:数据分配不均匀 -> 有的多有的少,数据倾斜


3.哈希槽分区算法(Redis使用)

  • 为了解决上述问题(搬运成本高和数据分配不均匀),Redis Cluster引入了哈希槽(hash slots)算法
  • 本质:把哈希求余和一致性哈希的
  • hash slots
    • 说明
      • crc16也是一种hash算法
      • 16384 16384 16384 16 ∗ 1024 16 * 1024 161024,即16K,为 2 14 2^{14} 214
    • 解释
      • 相当于把整个哈希值,映射到 16384 16384 16384个槽位上,也就是[0, 16383]
      • 然后再把这些槽位比较均匀的分配给每个片,每个分片的节点都需要记录自己持有哪些分片
    • 这里的分片规则是很灵活的,每个分片持有的槽位也不一定连续
    • 每个分片的节点使用位图来表示自己持有哪些槽位,对于 16384 16384 16384个槽位而言,需要2048个字节(2KB)大小的内存空间表示
    • 如果需要扩容,比如新增一个3号分片,就可以针对原有的槽位进行重新分配
      • 把之前每个分片持有的槽位,各拿出一点,分给新分片
    hash_slot = crc16(key) % 16384
    
  • 示例
    • 假设当前有三个分片,一种可能的分配方式:
      • 0号分片:[0, 5461],共5462个槽位
      • 1号分片:[5462, 10923],共5462个槽位
      • 2号分片:[10924, 16383],共5460个槽位
    • 此时扩容了一个分片,一种可能的分配方式:
      • 0号分片:[0, 4095],共4096个槽位
      • 1号分片:[5462, 9557],共4096个槽位
      • 2号分片:[10924, 15019],共4096个槽位
      • 3号分片:[4096, 5461] + [9558, 10923] + [15019, 16383],共4096个槽位
  • 在实际使用Redis集群分片的时候,不需要手动指定哪些槽位分配给某个分片,只需要告诉某个分片应该持有多少个槽位即可,Redis会自动完成后续的槽位分配,以及对应的key搬运的工作
  • 两个问题
    • Redis集群是最多有16384个分片吗?
      • 并非如此,如果一个分片一个槽位,这对于集群的数据均匀是难以保证的
      • 实际上,Redis作者建议集群分片数不应该超过1000
      • 并且,16000这么大规模的集群,本身的可用性也是一个大问题
        • 一个系统越复杂,出现故障的概率就越高
    • 为什么是16384个槽位?
      • Redis作者的答案
      • 节点之间通过⼼跳包通信,⼼跳包中包含了该节点持有哪些slots,这个是使⽤位图这样的数据结构表⽰的
        • 表⽰16384(16k)个slots,需要的位图⼤⼩是2KB,如果给定的slots数更多了,⽐如65536个了,此时就需要消耗更多的空间,如8KB位图表⽰了
        • 8KB对于内存来说不算什么,但是在频繁的⽹络⼼跳包中,还是⼀个不⼩的开销的
      • 另⼀⽅⾯,Redis集群⼀般不建议超过1000 个分⽚,所以16k对于最⼤1000个分⽚来说是⾜够⽤的,同时也会使对应的槽位配置位图体积不⾄于很⼤

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据交易知多少?从零到一的数据交易指南

在数字经济浪潮汹涌的今天,数据已成为推动社会进步和经济发展的关键生产要素。从政府决策到企业运营,从城市管理到个人生活,数据的价值日益凸显。那么数据流通交易机制及公共数据在各个领域的应用你都知道吗? 一、数据要素 数字经…

OFDM通信系统发射端需要做ifftshift的原因分析

对频率为15Hz的正弦波信号进行FFT分析,并且直接画图,matlab代码如下: fs 100; % sampling frequency t 0:(1/fs):(10-1/fs); % time vector S cos(2*pi*15*t); n length(S); X fft(S); f (0:n-1)*(fs/n); %frequenc…

react 常用hooks封装--useReactive

概述 一种具备响应式的useState 我们知道用useState可以定义变量格式为: const [count, setCount] useState(0) 通过 setCount 来进行设置,count 来获取,使用这种方式才能够渲染视图 来看看正常的操作,像这样 let count 0;…

open-resty 服务安装redis插件

从github下载 作者:程序那点事儿 日期:2023/11/16 22:04 lua-resty-redis-cluster cd /usr/local/openresty/modules #进入到modules目录git clone https://github.com/cuiweixie/lua-resty-redis-cluster.git #下载插件mv lua-resty-redis-cluster/ …

数据结构编程实践20讲(Python版)—03栈

本文目录 03 栈 StackS1 说明S2 示例基于列表的实现基于链表的实现 S3 问题:复杂嵌套结构的括号匹配问题求解思路Python3程序 S4 问题:基于栈的阶乘计算VS递归实现求解思路Python3程序 S5 问题:逆波兰表示法(后缀表达式)求值求解思路Python3程…

unix中父进程如何获取子进程的终止状态

一、前言 本文将介绍在unix系统中,父进程如何获取子进程的终止状态。本文主要围绕如下函数展开: 1.wait 2.waitpid 3.waitid 4.wait3、wait4 在讨论这些函数前,先介绍一个进程从创建到释放子进程的过程。 二、子进程的创建以及终止 在unix…

【Java】单元测试【主线学习笔记】

文章目录 前言测试分类JUnit单元测试介绍编写单元测试方法的条件IDEA中简易使用JUnit 前言 Java是一门功能强大且广泛应用的编程语言,具有跨平台性和高效的执行速度,广受开发者喜爱。在接下来的学习过程中,我将记录学习过程中的基础语法、框架…

大联大友尚集团推出基于炬芯科技产品的蓝牙音箱方案

大联大控股宣布,其旗下友尚推出基于炬芯科技(Actions)ATS2835P蓝牙音频SoC的蓝牙音箱方案。 图示1-大联大友尚基于炬芯科技产品的蓝牙音箱方案的展示板图 在智能音频设备市场持续升温的浪潮中,蓝牙音箱凭借音质卓越、操作简便等…

[Linux] Linux操作系统 进程的优先级 环境变量(一)

标题:[Linux] Linux操作系统 进程的优先级 个人主页水墨不写bug (图片来源于网络) 目录 一、进程优先级 1.PRI and NI 2.PRI vs NI 的补充理解 二、命令行参数和环境变量 正文开始: 一、进程优先级 基本概念 进程的调用需要CP…

Study--Oracle-09--部署Openfiler存储服务器

免费的存储服务器软件有FreeNAS 和 Openfiler。 其中Freenas的网站上只有i386及amd64的版本,也就是说Freenas不能支持64位版本的Intel CPU,而Openfiler则提供更全面的版本支持,在其网站上可以看到支持多网卡、多CPU,以及硬件Raid的…

manim中获取并定位不规则页面的中心位置

介绍中心点 找到中心点非常重要,因为它在多个领域中都有重要的应用和意义。中心点可以指一个几何形状的中心、数据集的平均值中心、或是特定情境下的关键焦点。以下是一些中心点重要性的具体解释: 数学与几何:在几何中,中心点&…

jinaai/jina-embeddings-v2-base-zh向量模型报错解决

报错信息 OSError: We couldn’t connect to ‘https://huggingface.co’ to load this file, couldn’t find it in the cached files and it looks like jinaai/jina-bert-implementation is not the path to a directory containing a file named configuration_bert.py. 报…

C++ | Leetcode C++题解之第441题排列硬币

题目: 题解: class Solution { public:int arrangeCoins(int n) {return (int) ((sqrt((long long) 8 * n 1) - 1) / 2);} };

探索Python新境界:funboost库揭秘

文章目录 探索Python新境界:funboost库揭秘背景:为什么选择funboost?funboost是什么?如何安装funboost?简单的库函数使用方法场景应用常见Bug及解决方案总结 探索Python新境界:funboost库揭秘 背景&#x…

什么是前缀索引?

什么是前缀索引? 1、什么是前缀索引?2、为什么要使用前缀索引?3、如何选择前缀长度?4、创建前缀索引的SQL语法5、示例 💖The Begin💖点点关注,收藏不迷路💖 在处理包含长字符串的数据…

yolo自动化项目实例解析(七)自建UI--工具栏选项

在上一章我们基本实现了关于预览窗口的显示,现在我们主要完善一下工具栏菜单按键 一、添加工具栏ui 1、配置文件读取 我们后面要改的东西越来越多了,先加个变量文件方便我们后面调用 下面我们使用的config.get意思是从./datas/setting.ini文件中读取关键…

RedisBoost Web缓存加速平台

1.产品介绍 产品名称:RedisBoost Web缓存加速平台 主要功能: 智能缓存策略配置 功能描述:RedisBoost提供了一套直观易用的缓存策略配置界面,允许用户根据业务场景自定义缓存策略,包括缓存时间(TTL)、缓存淘汰算法(如LRU、LFU)、数据分区与分片策略等。支持动态调整策…

SSM私人诊所管理系统—计算机毕业设计源码36406

摘 要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存…

Redis高级特性及应用

一、Redis慢查询 1.1 Redis命令流程 1.2 慢查询配置: 可以通过以下命令配置慢查询时间阈值(慢查询值得是上图中执行命令的时间,不包含其他时间) config set slowlog-log-slower-than 10000 //单位微秒 config rewrite //写入…

【设计模式-访问者模式】

定义 访问者模式(Visitor Pattern)是一种行为型设计模式,允许你在不修改已有类的情况下向这些类添加新的功能或行为。它通过将操作的执行逻辑从对象的类中分离出来,使得你可以在保持类的封闭性(符合开闭原则&#xff…