分布式系统常见的数据分区算法

news2024/12/30 3:22:20

文章目录

  • 顺序分区
    • 轮询分区算法
    • 时间片轮转分区算法
    • 数据块分区算法
    • 业务主题分区算法
  • 哈希分区
    • 节点取模分区算法
    • 一致性哈希分区算法(重点)
      • 1.Hash环
      • 2.容错性和可扩展性
      • 3.数据倾斜
      • 4.带有限负载的一致性哈希算法
      • 5.带虚拟节点的一致性哈希算法
    • 虚拟槽分区算法(重点)

顺序分区

顺序分区规则可以将数据按照某种顺序平均分配到不同的节点。不同的顺序方式,产生了不同的分区算法。例如,轮询分区算法、时间片轮转分区算法、数据块分区算法、业务主题分区算法等。

轮询分区算法

轮询分区算法是最简单的一种分区算法,它将数据均匀地分散到不同的节点上。具体来说,轮询分区算法会将数据按照顺序分配到不同的节点上,每个节点处理一部分数据。该算法适合于数据问题不确定的场景。其分配的结果是,在数据总量非常庞大的情况下,每个节点中数据是很平均的。

时间片轮转分区算法

在某人固定长度的时间片内的数据都会分配到一个节点。时间片结束,再产生的数据就会被分配到下一个节点。这些节点会被依次轮转分配数据。该算法可能会出现节点数据不平均的情况(因为每个时间片内产生的数据量可能是不同的)。但生产者与节点间的连接只需占用当前正在使用的这个就可以,其它连接使用完毕后就立即释放。

数据块分区算法

在整体数据总量确定的情况下,根据各个节点的存储能力,可以将连接的某一整块数据分配到某一节点。

业务主题分区算法

数据可根据不同的业务主题,分配到不同的节点。

哈希分区

节点取模分区算法

该算法的前提是,每个节点都已分配好了一个唯一序号,对于 N 个节点的分布式系统,其序号范围为[0, N-1]。然后选取数据本身或可以代表数据特征的数据的一部分作为 key,计算 hash(key)与节点数量 N 的模,该计算结果即为该数据的存储节点的序号。

该算法最大的优点是简单,但其也存在较严重的不足。如果分布式系统扩容或缩容,已经存储过的数据需要根据新的节点数量 N 进行数据迁移,否则用户根据 key 是无法再找到原来的数据的。生产中扩容一般采用翻倍扩容方式,以减少扩容时数据迁移的比例。

一致性哈希分区算法(重点)

一致性hash算法可以有效地解决分布式存储结构下节点取模分区算法带来的伸缩性差的问题,可以保证在动态增加和删除节点的情况下尽量有多的请求命中原来的机器节点。

1.Hash环

一致性Hash算法也是使用取模的方法,只是,节点取模分区算法是对服务器的数量进行取模,而一致性Hash算法是对2^ 32-1取模。一致性 hash 算法通过一个叫作一致性 hash 环的数据结构实现。这个环的起点是 0,终点是 232 - 1(哈希值是一个32位无符号整型)。环中间的整数按逆/顺时针分布,故这个环的整数分布范围是[0, 232 -1]。整个哈希环如下:

img

下一步将各个服务器的主机名(主机ID)进行一次哈希,这样每台机器就能确定其在哈希环上的位置,这里假设三个master节点主机哈希后在环空间的位置如下:

img

下面将三条key-value数据也放到环上:将数据key使用相同的函数Hash计算出哈希值,并确定此数据在环上的位置。将数据从所在位置顺时针找第一台遇到的服务器节点,这个节点就是该key存储的服务器!

例如我们有a、b、c三个key,经过哈希计算后,在环空间上的位置如下:key-a存储在node1,key-b存储在node2,key-c存储在node3。

img

2.容错性和可扩展性

现假设Node 2不幸宕机,可以看到此时对象key-a和key-c不会受到影响,只有key-b被重定位到Node 3。一般的,在一致性Hash算法中,如果一台服务器不可用,则受影响的数据仅仅是此服务器到其环空间中后一台服务器之间数据(b节点的前面一个节点是c,后面一个节点是a),其它不会受到影响。同样的,如果集群中新增一个node 4,受影响的数据是node 1和node 4之间的数据,其他的数据是不受影响的。

img

综上所述,一致性Hash算法对于节点的增减都只需重定位环空间中的一小部分数据,具有较好的容错性和可扩展性。

3.数据倾斜

一致性Hash算法在服务节点太少时,容易因为节点分部不均匀而造成数据倾斜(被缓存的对象大部分集中缓存在某一台服务器上)问题,例如系统中只有两台服务器,此时必然造成大量数据集中到Node 2上,而只有极少量会定位到Node 1上。其环分布如下:

4.带有限负载的一致性哈希算法

因为一致性哈希算法的数据分布不均匀的问题,Google 在 2017 年提出了带有限负载的一致性哈希算法来解决这个问题,带有限负载的一致性哈希算法思想比较简单,给每个存储节点设置了一个存储上限值来控制存储节点添加或移除造成的数据不均匀。简单来说就是当数据按照一致性哈希算法找到相应的存储节点时,要先判断该存储节点是否达到了存储上限;如果已经达到了上限,则需要继续寻找该存储节点顺时针方向之后的节点进行存储。

5.带虚拟节点的一致性哈希算法

带有限负载的一致性哈希算法也有一个问题,那就是每台服务器的性能配置可能存在不一样,如果规定数量过小的话,对于配置高的服务器来说有点浪费,这是因为服务器之间可能存在差异,叫做服务器之间的异构性,为了解决服务器之间的异构性问题,引入了一种叫做带虚拟节点的一致性哈希算法,带虚拟节点的一致性哈希算法核心思想是:根据每个节点的性能为每个节点划分不同数量的虚拟节点,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点,并将这些虚拟节点映射到哈希环中,然后再按照一致性哈希算法进行数据映射和存储。

具体做法可以在主机名的后面增加编号来实现。例如上面的情况,可以为每台服务器计算三个虚拟节点,于是可以分别计算 “Node 1#1”、“Node 1#2”、“Node 1#3”、“Node 2#1”、“Node 2#2”、“Node 2#3”的哈希值,于是形成六个虚拟节点:

上图中虚拟节点node 1#1,node 1#2,node 1#3都属于真实节点node 1;虚拟节点node 2#1,node 2#2,node 2#3都属于真实节点node 2。

虚拟节点可以让配置好的服务器存储更多的数据,这样就解决了系统异构性的问题,同时由于大量的虚拟节点的存在 在数据迁移时数据会落到不同的物理机上,这样就减小了数据迁移时某台服务器的分担压力,能够保证系统的稳定性。

虚拟槽分区算法(重点)

该算法首先虚拟出一个固定数量的整数集合,该集合中的每个整数称为一个 slot 槽。这个槽的数量一般是远远大于节点数量的。然后再将所有 slot 槽平均映射到各个节点之上。例如,Redis 分布式系统中共虚拟了 16384 个 slot 槽,其范围为[0, 16383]。假设共有 3 个节点,那么 slot 槽与节点间的映射关系如下图所示:

image-20230610115233234

而数据只与 slot 槽有关系,与节点没有直接关系。数据只通过其 key 的 hash(key)映射到slot 槽:slot = hash(key) % slotNums。这也是该算法的一个优点,解耦了数据与节点,客户端无需维护节点,只需维护与 slot 槽的关系即可。Redis 数据分区采用的就是该算法。其计算槽点的公式为:slot = CRC16(key) % 16384。

CRC16()是一种带有校验功能的、具有良好分散功能的、特殊的 hash 算法函数。其实 Redis中计算槽点的公式不是上面的那个,而是:slot = CRC16(key) &16383。

若要计算 a % b,如果 b 是 2 的整数次幂,那么 a % b = a & (b-1)。当a=10,b=4时。10%4=10 & (4-1)=(1010) & (0011)=(0010)=2。之所以用这个公式是因为 & 运算的速度比 % 运算的速度快,这与Redis的特性相吻合。下面是数据存入Redis节点的过程图。

img

至于为什么Redis的虚拟槽的数量是16384个,而不是其他。详见:京东面试题:为啥RedisCluster设计成16384个槽 - 知乎


参考链接:

  1. redis系列之一致性hash算法 - 知乎
  2. 借Redis Cluster集群,窥探集群中数据分布算法 - 知乎
  3. 京东面试题:为啥RedisCluster设计成16384个槽 - 知乎

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

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

相关文章

个人开发者或学生必备的100元云服务器大全

100元以内云服务器配置大全,预算100元可以买到什么配置的云服务器?100元可以选到腾讯云2核2G3M带宽轻量服务器、阿里云2核2G3M带宽轻量应用服务器、UCloud香港轻量应用云主机30M带宽、华为云HECS云服务器2核4G配置等,阿腾云分享预算100元可选…

华为OD机试真题 JavaScript 实现【数列描述】【2023 B卷 100分】,附详细解题思路

一、题目描述 有一个数列a[N] (N60),从a[0]开始,每一项都是一个数字。数列中a[n1]都是a[n]的描述。其中a[0]1。 规则如下: a[0]:1 a[1]:11(含义:其前一项a[0]1是1个1,即“11”。表示a[0]从左到右,连续出…

GitOps的12个痛点

如今很多团队采用GitOps作为标准部署流程,这篇文章总结了GitOps的12个痛点,从而帮助我们在采用这一实践的过程中更好的理解GitOps的优势和缺陷,选择适合自己的解决方案。原文:The pains of GitOps 1.0[1] GitOps作为软件发布实践有…

Git与Gitee远程仓库的系列操作

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章 ⭐作者主页:逐梦苍穹 ⭐所属专栏:Git ⭐如果觉得文章写的不错,欢迎点个关注一键三连😉有写的不好的地方也欢迎指正&#x…

Prometheus插件安装(mysql_exporter)

简介 mysql_exporter是用来收集MysQL或者Mariadb数据库相关指标的,mysql_exporter需要连接到数据库并有相关权限。既可以用二进制安装部署,也可以通过容器形式部署,但为了数据收集的准确性,推荐二进制安装。 一,下载安…

ASO优化之如何维护品牌词

App Store的关键词优化一般可以分为品牌词,竞品词和行业词,长度要控制在100字符以内。所以我们可以通过投放竞品词,将竞争对手的部分的流量占为己有,维护品牌词的有效方式有:1,率先拿下自己家的品牌词。 2…

『 前端三剑客 』:CSS选择器

文章目录 一 . 基本语法二 . CSS 引入方式2.1 内部样式表2.2 内联样式表2.3 外部样式表 三 . CSS选择器3.1 基础选择器1 . 标签选择器2 . 类选择器3 . id 选择器4 . 通配符选择器 3.2 复合选择器5 . 后代选择器6 . 子代选择器7 . 并集选择器8 . 伪类选择器 上一篇文章我们介绍了…

ProGuard 进阶系列(一): 运行源代码

在前面的文章深入 Android 混淆实践:ProGuard 通关秘籍和深入 Android 混淆实践:多模块打包爬坑之旅中,已经讲到了如何在 Android 中使用 ProGuard,以及如何自定义实现混淆规则的生成。为了更深入地理解 ProGuard 的细节&#xff…

Python3数据分析与挖掘建模(11)复合分析-分组分析与实现示例

1. 分组分析 1.1 概述 分组与钻取是数据分析中常用的技术,用于对数据进行聚合和细分分析。它可以帮助我们从整体数据中获取特定维度的汇总信息,并进一步钻取到更详细的子集数据中进行深入分析。 分组(Grouping)是指根据某个或多…

chatgpt赋能python:Python怎么写绝对值

Python怎么写绝对值 在Python编程语言中,有很多常用函数。其中包括求绝对值的函数。在这篇文章中,我们将介绍如何在Python中使用绝对值函数,并提供一些示例。 什么是绝对值函数? 绝对值函数是一个数学中常用的函数,…

WPF开发txt阅读器4:字体控件绑定

文章目录 控件折叠字体尺寸绑定选择字体字体的中文名称 txt阅读器系列: 需求分析和文件读写目录提取类💎列表控件与目录 控件折叠 作为一个txt阅读器,至少能够设置文字字体、尺寸,段落行间距等,还得有护眼模式等一系…

2023 年最新版Java面试题及答案整理(完整版,超详细)

程序员一步入中年,不知不觉便会被铺天盖地的“危机感”上身,曾经的那个少年已经不在,时间就是这样公平。就算你能发明Java语言,随着时间的推移,你注定还是要成为慢慢变蔫的茄子,缓缓变黑的葡萄。 看着金九…

支付宝商家多个账号下的账单管理工具配置指南

大家好,我是小悟 阅读这篇文章之前,结合这篇【有了这个工具,支付宝商家多个账号下的账单管理更方便了】干货食用更佳。 商户管理 这里录入的是商家应用相关信息 商户名称:应用id所属的应用名称。 应用id:支付宝开放…

Django新手必看:如何创建应用和定义数据表。(详细讲解)

Django新手必看:如何创建应用和定义数据表。 1. Django创建应用1.1 创建应用1.2 应用的添加 2. Django ORM2.1 定义数据表2.2 定义项目数据表2.3 通用字段选项2.4 外键使用2.5 应用数据库迁移 🏘️🏘️个人简介:以山河作礼。 &…

json-server操作restful

1.安装Node.js 默认已经内置npm&#xff0c;下载对应软件包直接安装即可。nodejs的官网 命令 描述 指令解释npm -v查看版本npm install <模块名>安装模块npm list查看所有全局安装的模块npm list -g查看某个模块的版本号npm install --save <模块名>在package.js…

【大模型】开源大模型汇总以及微调策略

目录 前言LLaMAstanford AlpacaGuanacoVicunaChinese-LLaMA-AlpacaChinese-VicunaLuotuo-Chinese FalconOpenBuddy-Falcon ChatGLM && VisualGLMMOSSAquilaPandaGPTTigerBot模型微调策略LoRAQLORAP-tuningv2 前言 自从ChatGPT出世以来&#xff0c;各个大厂/研究院都纷…

Hugging News #0609: 最新代码生成模型 StarCoder+ 和 StarChat Beta 重磅发布!

每一周&#xff0c;我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新&#xff0c;包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等&#xff0c;我们将其称之为「Hugging News」&#xff0c;本期 Hugging News 有哪些有趣的消息…

SG90舵机介绍

SG90舵机简介 SG90舵机是一种位置&#xff08;角度&#xff09;伺服的驱动器&#xff0c;适用于那些需要角度不断变化并可以保持的控制系统。在机器人机电控制系统中&#xff0c;舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构&#x…

耗时一个月,整理了这份大厂Java面试 / 学习指南,共计1500+ 题全面解析

程序员一步入中年&#xff0c;不知不觉便会被铺天盖地的“危机感”上身&#xff0c;曾经的那个少年已经不在&#xff0c;时间就是这样公平。就算你能发明 Java 语言&#xff0c;随着时间的推移&#xff0c;你注定还是要成为慢慢变蔫的茄子&#xff0c;缓缓变黑的葡萄。 看着金…

AI不能做什么?

什么是非人工智能 每个行业都需要的 3 种人为驱动的决策能力 布兰代斯马歇尔 支持统计数据的研究报告预计高度依赖AI的未来。 • 2018年,麦肯锡全球研究院发布了一份《工作未来报告》,估计到2030年,全球将有4亿人被AI系统、工具和平台取代。 • 2023年3月,高盛发布了其《全球经…