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

目录

  • 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.rhkb.cn/news/433650.html

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

相关文章

试用Debian12.7和Ubuntu24.4小札

Debian GNU/Linux 12 (bookworm)和Ubuntu 24.04.1 LTS是现阶段(2024年9月26日)两个发行版的最新版本。Ubuntu Server版本默认就不带桌面(ubuntu-24.04-live-server-amd64.iso),这个默认就是最小化安装(安装…

Moshi: a speech-text foundation model for real time dialogue

视频号 挺神奇的东西 整下来 kyutai-labs/moshi (github.com) git clone https://github.com/kyutai-labs/moshi.git 在线体验 moshi.chat 结束后 点击Download audio Download video 可以下载音频与视频 (不过是webm格式) 发行版 已上传至资源 小…

springboot+大数据基于数据挖掘的招聘信息可视化大屏系统【内含源码+文档+部署教程】

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ 🍅由于篇幅限制,想要获取完整文章或者源码,或者代做&am…

【C++】 vector 迭代器失效问题

【C】 vector 迭代器失效问题 一. 迭代器失效问题分析二. 对于vector可能会导致其迭代器失效的操作有:1. 会引起其底层空间改变的操作,都有可能是迭代器失效2. 指定位置元素的删除操作--erase3. Linux下,g编译器对迭代器失效的检测并不是非常…

数论——数数(找质因数个数),三位出题人(组合数学,快速幂)

数数&#xff08;找质因数个数&#xff09; 题目描述 登录—专业IT笔试面试备考平台_牛客网 运行代码&#xff08;通过率一半&#xff09; #include <iostream> #include <vector> using namespace std; const int N5e66; int n; vector<bool>vis; vo…

vmware-toolbox安装,VMware虚拟机访问win10共享目录

问题&#xff1a;VMware界面无法安装vmware-toolbox&#xff0c;共享目录设置失败 解决方法&#xff1a; VMware设置 共享文件夹 ubuntu24 vm中运行vmware-toolbox-cmd -v 检查版本 vm运行sudo apt install open-vm-tools // vm可能需要重启 vm的 /mnt 目录下如果没有 hgfs…

骨传导耳机哪个牌子好?年度五大热门骨传导耳机推荐清单来了!

近年来&#xff0c;骨传导耳机以其独特的传音方式和开放耳道的设计&#xff0c;逐渐成为运动爱好者和追求健康生活方式人群的新宠。与传统耳机相比&#xff0c;骨传导耳机不仅能够保护听力&#xff0c;还能在享受音乐的同时保持对周围环境的警觉。 随着骨传导耳机市场的不断壮…

1.MySQL的安装

目录 下载安装包 安装前环境的准备 正式安装 下载安装包 MySQL安装网址:https://www.mysql.com/cn/ 进去之后就是上面这个页面&#xff0c;进行汉化的时候将这个网页拉至最下&#xff0c;右下角点成中文就可以&#xff0c;如下这个页面。 回到页面顶端&#xff0c;点击下载&a…

并发编程---线程与进程

业务场景&#xff1a;小明去理发店理发。 小明去理发店理发&#xff0c;完成理发需要吹&#xff0c;剪&#xff0c;洗、理的过程。由这个场景我们引用进程和线程这两个 概念。 一.进程 1.什么是进程 进程是具有独立功能的程序关于某个数据集合上的一次运行活动&#xff0c;是…

基于Hadoop的NBA球员大数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

MySQL InnoDB MVCC数据结构分析

1、概述 MVCC&#xff08;Multiversion Concurrency Control&#xff09;多版本并发控制&#xff0c;通过维护不同的版本号&#xff0c;提供一种很好的并发控制技术&#xff0c;这种技术能够使读写操作不冲突&#xff0c;提升并发性能。 MySQL InnoDB存储引擎&#xff0c;在更…

Colorful/七彩虹将星X17 XS 22 Win11原厂OEM系统 带COLORFUL一键还原

安装完毕自带原厂驱动和预装软件以及一键恢复功能&#xff0c;自动重建COLORFUL RECOVERY功能&#xff0c;恢复到新机开箱状态。 【格式】&#xff1a;iso 【系统类型】&#xff1a;Windows11 原厂系统下载网址&#xff1a;http://www.bioxt.cn 注意&#xff1a;安装系统会…

设计模式、系统设计 record part02

软件设计模式&#xff1a; 1.应对重复发生的问题 2.解决方案 3.可以反复使用 1.本质是面向对象 2.优点很多 1.创建型-创建和使用分离 2.结构型-组合 3.行为型-协作 571123种模式 UML-统一建模语言-Unified Modeling Language 1.可视化&#xff0c;图形化 2.各种图&#xff08;9…

服务器操作系统【sar 命令】

sar 安装、语法参数说明以及示例 文章目录 功能概述一、功能介绍1.安装配置2. 配置3. 启动二、sar 语法及参数说明三、示例及释义1.汇报 io 传输速率信息2.内存分页信息3.块设备状态信息4.hugepages 利用率统计信息5.列长度和负载平均值6.内存利用率统计信息7.swap 交换空间利用…

ARM点灯---看手册

知识点&#xff1a; 一个程序可能会遇到内存泄漏问题&#xff0c;可能一次运行泄漏几M大小&#xff0c;执行几个小时才会泄漏到站崩溃&#xff0c;所以要查看是否有内存泄漏。 查看手册教程 0927-上午 视频1&#xff1a;25&#xff1b;00 硬件程序开发流程 最小系统:单片…

16.第二阶段x86游戏实战2-发包函数和怎么去找改写过的发包函数

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

使用celery+Redis+flask-mail发送邮箱验证码

Celery是一个分布式任务队列&#xff0c;它可以让你异步处理任务&#xff0c;例如发送邮件、图片处理、数据分析等。 在项目中和celery 有关系的文件如下&#xff1a; task.py : 创建celery.py 对象&#xff0c;并且添加任务&#xff0c;和app绑定&#xff0c;注意&#xff1…

实习前学一学git

工作区 暂存区 本地仓库 远程仓库 git commit -m "提交信息" 提交的是暂存区里的内容&#xff0c;没有git add 的不会被提交到本地仓库

对抗攻击方法详解:梯度攻击、转移攻击与模型集成攻击

对抗攻击方法详解&#xff1a;梯度攻击、转移攻击与模型集成攻击 近年来&#xff0c;随着深度学习模型在各个领域取得惊人突破&#xff0c;对抗攻击&#xff08;Adversarial Attack&#xff09; 逐渐成为研究热点。对抗攻击旨在通过在输入数据上施加精心设计的微小扰动&#x…

这样做快速除甲醛入住新家 科学分解甲醛的产品哪个好

这样做快速除甲醛入住新家 科学分解甲醛的产品哪个好 在新房装修的喜悦之余&#xff0c;业主们不得不面对一个常见却又棘手的问题——甲醛污染。甲醛&#xff0c;这种无形的敌人&#xff0c;以其难以察觉的存在&#xff0c;对家人和孩子的健康造成潜在威胁。很多业主们在装修期…