Redis集群简介及槽位映射(哈希取余和一致性哈希算法)

news2024/11/18 6:42:23

redis cluster需求至少需要3个master才能组成一个集群,同时每个sentinel至少有一个slave节点,各个节点之间保持tcp通信。当master发生宕机,redis cluster自动将对应的slave节点提拔为master,来重新对外提供服务。

先来说一下槽,集群的中每个redis实例都负责接管一部分槽,总槽数为:16384(2^ 14),如果有3台master,那么每台负责5641个槽(16284)。
官网建议 集群个数不要超过1000个

redis节点负责的槽位个数
节点10-54615631
节点25461-109225632
节点110922-163835631

当redis客服端设置值时,会拿key进行CRC16算法,然后更16284取模,得到的就是落在那个槽位。根据上面的表格就知道key在那台redis上。
slot = CRC16(key) mod 16383

redis cluster功能: 负载均衡,故障转移,主从复制。

  1. 负载均衡,
    redis 集群支持多个master
  2. 故障转移
    cluster自带sentinel 故障转移机制
  3. 主从复制
    cluster 可支持多个master,每个master 又支持多个slave
  4. 客服端与redis的节点连接,不需要连接节点中的所有节点,只要连接集群中任意一个可用节点即可,由cluster 通过CRC16算法将key分配到槽位,而又在不同的redis实例中。

rediscluster 分片

使用redis集群时,我们会将存储的数据分散到多台redis上,这称为分片。简言之,集群中每个redis实例都是一个分片。

rediscluster 为何要使用槽位

最大优势时方便扩容,和数据分派查找
方便扩容
这种结构很容易添加或删除节点,
比如我们想新添加节点D,我们需要将A,B,C中部分槽位分到D上。
再比如我们需要将A中的槽位移到B,C,然后将没有任何槽位的A节点移除即可

由于从一个节点将哈希槽移到另一个节点不会停止服务,无论是添加槽删除槽或者改变某个节点槽的数量,都不会造成集群不可用状态。

槽位映射,一般业界有三种解决方案

  1. 哈希取余分区
    假设有n台redis实例,每次hash(key)%n计算出hash值,用hash值决定数据映射在那一台主机上
    优点:
    简单有效,只需要预估好数据的节点,例如3,起到负载均衡,分而治之的作用
    缺点
    原来已经规划好的节点,进行扩容或缩容就比较麻烦,每次扩容映射关系需要重新计算。取模公式也会发生变化,hash(key)%3->hash(key)%?。

  2. 一致性哈希算法分区
    设计目的:为了解决分布式缓存数据变动和映射问题,某个机器宕机了,分母的值改变了,自然取余数就不OK了的问题。
    主要实现以下三步
    A.算法一致性hash环

     一致性hash算法必然有一个hash函数按算法产生hash值,这个算法的
     所有hash值在0-2^ 32中,让0=2^ 32。就形成了一个环形空间。
     它也是按照使用取模的方法,但是是按2^ 32 取模。
    

在这里插入图片描述

B。服务器IP节点映射

将集群的各个节点的IP映射到环上的某一个位置,
假如4个节点 NodeA,B,C,D

在这里插入图片描述

C.key落到服务器的落键规则

当我们需要存储一个kv键值对时,首先会计算key的hash值,将这个key使用相同
的函数Hash()计算出hash值,并确定此程序在环上的位置,从此位置沿顺时针行
走,第一台遇到的服务器就是其存储到的服务器。
如,我们有ObjectA,ObjectB,ObjectC,OjbectD 4个存储对象,经过hash计
算后,在环形空间上位置如下,hash一致性算法ObjectA在NodeA,ObjectB在
nodeB,ObjectC在nodeC

在这里插入图片描述

一致性hash算法的优点

1.容错性
假上图的nodeC宕机了,可以看到A,B,D不会受影响,一般在一致性hash算法中,如果一台服务器不可用,则受影响的数据仅仅是此服务器的数据,简单说,就是C不可用了,受影响的是BC之间的数据且这些数据会转移到D
2.扩展性
数据量增加了,需要增加一台节点nodeX,假设nodeX在A和B之间,那受到影响的只是A到X之间的数据,重新吧A->X中的数据录入X即可,不会导致
hash取余重新洗牌。

一致性hash 算法的缺点

1.数据倾斜问题
一致性hash算法在服务节点太少时,容易因为节点分布不均匀而造成数据倾斜(被缓存的对象大部分集中在某一天服务器)问题。
加入只有两台redis服务器:
在这里插入图片描述

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

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

相关文章

从“被动发现”变为“主动感知”|智能井盖脚下安全守护者

井盖作为城市基础设施的重要组成部分,具有关键的作用。城市的管道网络错综复杂,包括雨水、污水、弱电和强电等。其中,雨水和污水管道的管径较大,可能会导致隐藏或其他安全事故的发生。而弱电井则是整个城市信息传输的重要环节&…

Java 基础进阶篇(十四):File 类常用方法

File 类的对象代表操作系统的文件(文件、文件夹),File 类在 java.io.File 包下。 File 类提供了诸如:创建文件对象代表文件,获取文件信息(大小、修改时间)、删除文件、创建文件(文件…

Java【文件和IO】File 类, 字节IO流的使用

文章目录 前言一、File 类1, 构造方法2, 成员方法 二、字节流输入输出1, 字节流输入 InputStream1.1, 每次输入一个字节1.2, 每次输入多个字节 2, 字节流输出 OutputStream2.1, 每次输出一个字节2.2, 每次输出多个字节 总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望…

chatgpt赋能Python-python3__2怎么算

Python3中<<2的计算方法 Python3是一种高级编程语言&#xff0c;它具有强大的数据分析和计算能力。在Python3中&#xff0c;<<2是一种用于移位计算的运算符。在本篇文章中&#xff0c;我们将介绍Python3中<<2的计算方法。 什么是移位运算符 移位运算符是一…

C++基础语法——内存管理

1. C/C中的内存管理 我们先看如下一段代码 #include <iostream>using namespace std;int globalVar 1; static int staticGlobalVar 1;void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const ch…

rk3399 buildroot ubuntu20版本编译遇到问题

一、编译uboot遇到问题 /usr/include/libfdt.h:258:1: error: redefinition of fdt_set_version 258 | fdt_set_hdr_(version); | ^~~~~~~~~~~~ In file included from tools/fdt_host.h:11, from tools/imagetool.h:22, from tools…

BurpSuite—-Target模块(目标模块)

前言 本文主要介绍BurpSuite—-Target模块(目标模块)的相关内容 关于BurpSuite的安装可以看一下之前这篇文章&#xff1a; http://t.csdn.cn/cavWt Target功能 目标工具包含了SiteMap&#xff0c;用你的目标应用程序的详细信息。它可以让你定义哪些对象在范围上为你目前的工…

基于QGIS的长株潭城市群边界范围融合实战

背景 在面向区域的研究过程中&#xff0c;比如一些研究区域&#xff0c;如果是具体的行政区划&#xff0c;比如具体的某省或者某市或者县&#xff0c;可以直接从国家官方的地理数据中直接下载就可以。但如果并没有直接的空间数据那怎么办呢&#xff1f;比如之前遇到的一个场景&…

chatgpt赋能Python-python3_len__

Python3 len()函数&#xff1a;使用方法和常见应用 在Python中&#xff0c;len()函数是一个内置函数&#xff0c;用于返回对象的长度或元素的个数。它适用于字符串、列表、元组、字典、集合等Python数据类型。在本篇文章中&#xff0c;我们将深入探讨Python3 len()函数的使用方…

C++ [STL之string模拟实现]

本文已收录至《C语言和高级数据结构》专栏&#xff01; 作者&#xff1a;ARMCSKGT STL之string模拟实现 前言正文存储结构默认成员函数构造函数析构函数拷贝构造函数赋值重载 容量操作类获取字符串长度size获取当前容量capacity查询是否为空串emptyreserve扩容调整字符串大小si…

基于Freertos的ESP-IDF开发——6.使用DHT1温湿度传感器

基于Freertos的ESP-IDF开发——6.使用DHT1温湿度传感器 0. 前言1. DHT11驱动原理2. 完整代码3. 演示效果4. 其他FreeRtos文章 0. 前言 开发环境&#xff1a;ESP-IDF 4.3 操作系统&#xff1a;Windows10 专业版 开发板&#xff1a;自制的ESP32-WROOM-32E 准备一个DHT11温湿度传…

【Element-ui】el-table大数据量渲染卡顿问题

1、场景描述 在项目开发中&#xff0c;遇到在表格中一次性加载完的需求&#xff0c;且加载数量不少&#xff0c;有几百几千条&#xff0c;并且每条都可能有自己的下拉框&#xff0c;输入框来做编辑功能&#xff0c;此时普通的el-table肯定会导致浏览器卡死&#xff0c;那么怎么…

Windows10 双网卡配置,轻松实现内外互通

1 背景 我平常需要连接外网查阅资料&#xff0c;聊天等&#xff0c;做实验时需要将写到的代码打包部署到内网服务器中&#xff0c;所以需要频繁地切换内外网&#xff0c;修改静态网络配置。很是苦恼。 2 方法 最近&#xff0c;我找到了几种解决办法。 方法一、…

uniapp DIY可视化工具 控件拖拽工具怎么开发/拖拽库/模板引擎

uniapp DIY可视化工具 控件拖拽工具怎么开发 答&#xff1a;需要 (**拖拽库**) &#xff08;**模板引擎**&#xff09;代码自动生成 python有哪些模板引擎 Jinja2是一个小型但快速且易于使用的以纯python编写的独立模板引擎&#xff08;最主要的模板&#xff09;Chameleon是T…

深度学习之卷积神经网络(CNN)

大家好&#xff0c;我是带我去滑雪&#xff01; 卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;是一种基于深度学习的前馈神经网络&#xff0c;主要用于图像和视频识别、分类、分割和标注等计算机视觉任务。它主要由卷积层、池化层、全连接…

【开源、应用】QT—TCP网络上位机的设计

本文设计一个终端控制的上位机软件&#xff08;如“设计目标”下图所示&#xff09;&#xff0c;可以和STM32、Adruino等通信实现无线局域网控制系统。 本文的通信内容和图表内容可以参考作者之前的文章 STM32ESP8266连接电脑Qt网络上位机——QT篇https://blog.csdn.net/qq_53…

【STM32G431RBTx】备战蓝桥杯嵌入式→决赛试题→第六届

文章目录 前言一、题目二、模块初始化三、代码实现interrupt.h:interrupt.c:main.h:main.c: 四、完成效果五、总结 前言 无 一、题目 二、模块初始化 1.LCD这里不用配置&#xff0c;直接使用提供的资源包就行 2.ADC:开启ADCsingle-ended 3.LED:开启PC8-15,PD2输出模式就行了…

【JVM001】宋红康JVM字节码举例

宋红康JVM字节码举例 1 Integer package jvmT; public class IntegerTest {public static void main(String[] args) {Integer i 5;int y 5;System.out.println(iy); //trueInteger i6 5;Integer y6 5;System.out.println(i6y6);//trueInteger i5 128;Integer y5 128;System.…

SpringBoot中使用lombok

1.添加依赖 在项目的根目录中找到pom.xml&#xff0c;在dependencies下复制这段代码 <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifac…

解决Python爬虫中selenium模块中的find_element_by_id方法无法使用

如有错误&#xff0c;敬请谅解&#xff01; 此文章仅为本人学习笔记&#xff0c;仅供参考&#xff0c;如有冒犯&#xff0c;请联系作者删除&#xff01;&#xff01; 我们在学习selenium模块的时候&#xff0c;经常会用到 browser.find_element_by_id命令&#xff0c;但随着se…