【Docker】从零开始:15.搭建亿级数据Redis集群之哈希算法概念

【Docker】从零开始:15.搭建亿级数据Redis集群之哈希算法概念篇

  • 概述
  • 一般业界的3种解决方案
    • 1.哈希取余分区
      • 优点:
      • 缺点:
    • 2.一致性哈希算法分区
      • 背景
      • 目的
      • 原理
        • 一致性哈希环
        • 节点映射
        • key落到服务器的落键规则
      • 优点
        • 容错性
        • 扩展性
      • 缺点
    • 3.哈希槽分区
      • 背景
      • 原理

概述

  • 在如今大数据时代,Redis作为高性能键值存储数据库,被广泛应用于互联网领域。随着业务的发展,数据量也越来越大,对于Redis的设计也越来越复杂。本文将探讨如何在Redis中处理亿级数据的设计。
  • 数据缓存是一个重要的优化手段,可以将热点数据缓存到Redis中,减少数据库的IO操作,提高访问速度。但是,过多的缓存也会增加Redis的负载,因此需要根据具体情况进行缓存策略的调整。
  • 在亿级数据的情况下,Redis的性能调优变得更加复杂。需要关注内存使用、磁盘IO、网络传输等方面,针对具体情况进行调优,提高系统的性能和响应速度。
  • 在亿级数据的情况下,单台Redis服务器难以胜任,因此需要使用数据分片和副本技术。数据分片可以将数据分散到多个服务器上,提高数据的访问速度和可用性。数据副本可以保证数据的安全性和一致性,增加数据的备份。

一般业界的3种解决方案

1.哈希取余分区

在这里插入图片描述

  • 假设:2亿条记录就是2亿个k,v,我们单机不行必须要分布式多机,假设有3台机器构成一个集群,用户每次读写操作都是根据公式:
    hash(key) % N个机器台数,计算出哈希值,用来决定数据映射到哪一个节点上。

优点:

	简单粗暴,直接有效,只需要预估好数据规划好节点,例如3台、8台、10台,就能保证一段时间的数据支撑。使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡+分而治之的作用。

缺点:

原来规划好的节点,进行扩容或者缩容就比较麻烦了额,不管扩缩,每次数据变动导致节点有变动,映射关系需要重新进行计算,在服务器个数固定不变时没有问题,如果需要弹性扩容或故障停机的情况下,原来的取模公式就会发生变化:Hash(key)/3会变成Hash(key) /?。此时地址经过取余运算的结果将发生很大变化,根据公式获取的服务器也会变得不可控。原来规划好的节点,进行扩容或者缩容就比较麻烦了额,不管扩缩,每次数据变动导致节点有变动,映射关系需要重新进行计算,在服务器个数固定不变时没有问题,如果需要弹性扩容或故障停机的情况下,原来的取模公式就会发生变化:Hash(key)/3会变成Hash(key) /?。此时地址经过取余运算的结果将发生很大变化,根据公式获取的服务器也会变得不可控。某个redis机器宕机了,由于台数数量变化,会导致hash取余全部数据重新洗牌。

2.一致性哈希算法分区

背景

一致性哈希算法在1997年由麻省理工学院中提出的,设计目标是为了解决分布式缓存数据变动和映射问题,某个机器宕机了,分母数量改变了,自然取余数不OK了。

目的

当服务器个数发生变动时,尽量减少影响客户端到服务器的映射关系

原理

一致性哈希环

一致性哈希算法必然有个hash函数并按照算法产生hash值,这个算法的所有可能哈希值会构成一个全量集,这个集合可以成为一个hash空间[0,2^32-1],这个是一个线性空间,但是在算法中,我们通过适当的逻辑控制将它首尾相连(0 = 2^32),这样让它逻辑上形成了一个环形空间。
它也是按照使用取模的方法,前面笔记介绍的节点取模法是对节点(服务器)的数量进行取模。而一致性Hash算法是对232取模,简单来说,一致性Hash算法将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-232-1(即哈希值是一个32位无符号整形),整个哈希环如下图:整个空间按顺时针方向组织,圆环的正上方的点代表0,0点右侧的第一个点代表1,以此类推,2、3、4、……直到232-1,也就是说0点左侧的第一个点代表232-1, 0和232-1在零点中方向重合,我们把这个由232个点组成的圆环称为Hash环。
在这里插入图片描述

节点映射

将集群中各个IP节点映射到环上的某一个位置。
将各个服务器使用Hash进行一个哈希,具体可以选择服务器的IP或主机名作为关键字进行哈希,这样每台机器就能确定其在哈希环上的位置。假如4个节点NodeA、B、C、D,经过IP地址的哈希函数计算(hash(ip)),使用IP地址哈希后在环空间的位置如下:
在这里插入图片描述

key落到服务器的落键规则

当我们需要存储一个kv键值对时,首先计算key的hash值,hash(key),将这个key使用相同的函数Hash计算出哈希值并确定此数据在环上的位置,从此位置沿环顺时针“行走”,第一台遇到的服务器就是其应该定位到的服务器,并将该键值对存储在该节点上。
如我们有Object A、Object B、Object C、Object D四个数据对象,经过哈希计算后,在环空间上的位置如下:根据一致性Hash算法,数据A会被定为到Node A上,B被定为到Node B上,C被定为到Node C上,D被定为到Node D上。
在这里插入图片描述

优点

容错性

假设Node C宕机,可以看到此时对象A、B、D不会受到影响,只有C对象被重定位到Node D。一般的,在一致性Hash算法中,如果一台服务器不可用,则受影响的数据仅仅是此服务器到其环空间中前一台服务器(即沿着逆时针方向行走遇到的第一台服务器)之间数据,其它不会受到影响。简单说,就是C挂了,受到影响的只是B、C之间的数据,并且这些数据会转移到D进行存储。
在这里插入图片描述

扩展性

数据量增加了,需要增加一台节点NodeX,X的位置在A和B之间,那收到影响的也就是A到X之间的数据,重新把A到X的数据录入到X上即可,不会导致hash取余全部数据重新洗牌。
在这里插入图片描述

总结:加入和删除节点只影响哈希环中顺时针方向的相邻的节点,对其他节点无影响。

缺点

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

总结:数据的分布和节点的位置有关,因为这些节点不是均匀的分布在哈希环上的,所以数据在进行存储时达不到均匀分布的效果。

3.哈希槽分区

背景

哈希槽分区的出现是为了解决一致性哈希算法分区的数据倾斜问题,哈希槽实质就是一个数组,数组[0,2^14 -1]形成hash slot空间。

原理

哈希槽分区解决均匀分配的问题,在数据和节点之间又加入了一层,把这层称为哈希槽(slot),用于管理数据和节点之间的关系,现在就相当于节点上放的是槽,槽里放的是数据。
在这里插入图片描述

  • 槽解决的是粒度问题,相当于把粒度变大了,这样便于数据移动。
  • 哈希解决的是映射问题,使用key的哈希值来计算所在的槽,便于数据分配。

一个Redis集群只能有16384个槽,编号0-16383(0-2^14-1)。这些槽会分配给集群中的所有主节点,分配策略没有要求。可以指定哪些编号的槽分配给哪个主节点。集群会记录节点和槽的对应关系。解决了节点和槽的关系后,接下来就需要对key求哈希值,然后对16384取余,余数是几key就落入对应的槽里。slot = CRC16(key) % 16384。以槽为单位移动数据,因为槽的数目是固定的,处理起来比较容易,这样数据移动问题就解决了。

Redis 集群中内置了 16384 个哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,也就是映射到某个节点上。如下代码,key之A 、B在Node2, key之C落在Node3上
在这里插入图片描述

@Test
public void test3(){//import io.lettuce.core.cluster.slotHash;System.out.println(SlotHash.getslot(key:"A"));//6373System.out.println(SlotHash.getslot(key:"B"));//10374System.out.println(SlotHash.getslot(key:"c"));//14503System.out.println(SlotHash.getslot(key:"hello"));//866
}

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

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

相关文章

家用超声波清洗机哪个牌子好?一起来看、值得推荐超声波清洗机

家用超声波清洗机可以干嘛呢?最常见的就是来清洗眼镜。眼镜党朋友应该经常接触超声波清洗机,它常出现在眼镜店中,眼镜店老板帮顾客清洗眼镜;也会出现在工业领域、医疗领域等,超声波清洗机使用范围还是挺广的&#xff0…

微信小程序 分享的两种方式:菜单级和按钮级

按钮级 在使用微信小程序的时候,我们可能会设计到一些视频的一些分享等,那么视频分享也分为两种方式,例如下图,当我们点击的时候,进行一个转发分享的一个操作 那么在原先代码的基础上,我们需要在原先代码的基础上butt…

Unity中动态合批

文章目录 前言一、动态合批的规则1、材质相同是合批的前提,但是如果是材质实例的话,则一样无法合批。2、支持不同网格的合批3、动态合批需要网格支持的顶点条件二、我们导入一个模型并且制作一个Shader,来测试动态合批1、我们选择模型的 Mesh…

电商API接口开发和接入说明{包含淘宝/京东/拼多多/抖音}

“为什么改了这个没告诉我” “实际功能和文档上说的不一样啊”。 这些话大家在进行电商API接口开发时,想必耳朵都听出老茧了。 真不是故意的,有时候任务比较急,就先改了代码,想着以后再同步文档,然后就给忘了。 项…

在Pycharm中使用GitHub的方法步骤

文章目录 前言一、配置Pycharm二、建立远程仓库并提交代码三、在github中查看上传的新仓库四、使用pycharm克隆github仓库五、在pycharm内进行git的相关操作关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源…

【C++】三大特性 --- 继承的详细讲解

目录 1.继承的概念及定义 1.1 继承的概念 1.2 继承定义 1.2.1定义格式 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 5.继承与友元 6.继承与静态成员 7.复杂的菱形继承及菱形虚…

从0到1构建智能分布式大数据爬虫系统

文章目录 1. 写在前面2. 数据获取挑战3. 基础架构4. 爬取管理5. 数据采集6. 增量与去重设计 【作者主页】:吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作! 【作者推荐…

win10的系统下实现SUSTechPOINTS环境搭建

** win10的 标题系统下实现SUSTechPOINTS环境搭建 ** 参考文档: doc/install_from_source.md 张金来/SUSTechPOINTS - Gitee.com 在win10的系统下搭建**SUSTechPOINTS环境 1 克隆代码 git clone https://github.com/naurril/SUSTechPOINTS2 安装环境 2.1 创…

【EtherCAT详解】基于Wireshark的EtherCAT帧结构解析

写在前面 EtherCAT的报文比较繁琐,且一些参考书籍错误较多,且晦涩难懂,对于初学者,很难快速的入门。本文适用于有一定基础的研究者,如对报文有一些研究、对canopen协议有一定了解、并且对TwinCAT有了解的研究者。当然,对于初学者来说,也是很好的引导,少走很多弯路。本…

css 字体添加外轮廓

color: #ffeb3b; -webkit-text-stroke: 10px transparent; background: linear-gradient(90deg,#5d3d02f5,#5d3d02f5,#5d3d02f5,#5d3d02f5,#5d3d02f5,#5d3d02f5,#5d3d02f5) top left / 100% 100%; -webkit-background-clip: text;

语义分割网络-FCN全卷积网络

全卷积神经网络FCN整体概述 FCN是首个端对端针对像素级预测的全卷积网络。FCN会用到分类网络作为backbone FCN的网络结构类比分类网络 分类网络经过卷积操作后,接全连接层,最后一个全连接层输出长度与分类类别数量相同,最后经过softmax得到术…

springMVC实验(五)——数据校验

【知识要点】 数据校验的概念 在软件开发过程中,数据校验是非常重要的环节,用于确保数据的有效性和完整性 。数据校验分为客户端验证和服务端验证,客户端验证是确保人机交互过程中用户操作表单过程中的误操作,由JavaScript代码完…

优化用户直播体验:第三方美颜SDK的前沿技术

当下,用户对于直播体验的要求日益提高,其中之一的重要方面就是实时美颜效果。第三方美颜SDK为直播平台和应用提供了强大的美颜功能,极大地改善了用户的直播观感。 一、背景与发展 过去,直播中的美颜往往依赖于主播或用户自行调整…

【深度学习】深度学习框架的环境配置

目录 1. 配置cuda环境 1.1. 安装cuda和cudnn 1.1.1. 显卡驱动配置 1.1.2. 下载安装cuda 1.1.3. 下载cudnn,将解压后文件复制到cuda目录下 1.2. 验证是否安装成功 2. 配置conda环境 2.1. 安装anaconda 2.2. conda换源 2.3. 创建conda环境 2.4. pip换源 3…

常见的环境变量用于设置系统的路径查找

常见的环境变量用于设置系统的路径查找 echo $PATH 常见的环境变量用于设置系统的路径查找 在 Linux 中,有一些常见的环境变量用于设置系统的路径查找。以下是一些常见的环境变量和它们的作用: $PATH: 用于设置可执行文件的查找路径。 expo…

【EI征稿中#先投稿,先送审#】第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024)

第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024) 2024 3rd International Conference on Cyber Security, Artificial Intelligence and Digital Economy 第二届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2023&…

深度学习火车票识别系统 计算机竞赛

文章目录 0 前言1 课题意义课题难点: 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果4 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 图像识别 火车票识别系统 该项目较为新颖,适…

【算法系列篇】递归、搜索与回溯(一)

文章目录 什么是递归、搜索与回溯算法1. 汉诺塔1.1 题目要求1.2 做题思路1.3 代码实现 2. 合并两个有序链表2.1 题目要求2.2 做题思路2.3 代码实现 3. 反转链表3.2 题目要求3.2 做题思路3.3 代码实现 什么是递归、搜索与回溯算法 递归算法是一种通过重复将问题分解为同类的子问…

【一天一坑系列】Mysql中INSERT IGNORE INTO插入时去重无效,插入了重复数据

1、问题描述 今天刚好有一个需求,需要插入数据时去重。所以第一下就想到了insert ignore into方法,但是使用过程中,发现虽然设置了唯一键,但插入时还是出现了重复插入的情况。 具体信息如下,表的约束设置如下&…

从Excel中找sheet

pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …