一致性哈希在分库分表的应用

news2024/11/24 18:35:40

文章目录

  • 前言
  • 分库分表方法
  • 一致性哈希
    • 介绍
    • 分库分表的应用
  • 总结

前言

大家应该都知道一些哈希算法,比如MD5、SHA-1、SHA-256等,通常被用于唯一标识、安全加密、数据校验等场景。除此之外,还有一种应用是对某个数据进行哈希取模映射到一个有限的范围,比如哈希表快速定位、分库分表数据分配等。本文将以分库分表为主题,介绍另外一种哈希算法,并详细说明其在分库分表中的应用与优势。

分库分表方法

在对数据进行分库分表时,通常有两个策略(这里主要说的是水平分库分表):

  1. 第一种是范围分库分表,比如将ID1~1000W的数据存放在第一个表或库中,或者将某个时间段的数据放在第一个表或库中,以此类推。这种方式会带来几个问题:

    • 数据倾斜:因为某些时间段的数据的多少是不确定的,可能会出现数据量超过预期而造成的查询性能下降,或者是数据量远远小于预期造成的空间浪费。
    • 没有分担压力:分库分表的一个主要目的是避免单节点的数据量过大造成性能下降。另一个目的是可以在高并发的场景下分担压力,但是范围策略中总是在对一个库或者表在操作,起不到分担压力的作用,毕竟一个数据库的连接和处理能力是有限的。
  2. 第二种是哈希分库分表,通常都是将某个数据进行哈希后进行取模,然后映射到对应的库或表中,这个模一般就是库的个数或者表的个数,所以个数是固定的。

    同样,如果哈希不当也会存在数据倾斜问题,所以通常对那些随机、不连续的数据进行哈希效果较好。

    但是同样存在一个问题那就是:当现有的表和库容量不足也就是需要扩容的时候,涉及到数据迁移的问题,因为模数变了,之前的数据都需要重新取模重新分配到新的库和表中,不然就会出现“查无此人”的错误了。如下图,添加“DB4“后,旧数据进行hash后会映射到“DB0“上,如果不迁移数据就会出现问题。
    在这里插入图片描述

很显然,以上两种方法都存在问题,但是哈希这种方法更能体现分库分表的作用,但是带来的代价是全量数据的迁移,需要考虑迁移带来的风险,迁移之后的数据一致性、完整性等各种因素。

那有没有方法可以避免迁移,答案是没有的,只要是使用哈希这种方式,在改变模个数后一定是要迁移数据的。但是有一种方法可以降低迁移量以及带来的风险,那就是一致性哈希。

一致性哈希

介绍

一致性哈希算法是一种特殊的哈希算法,通常用于分布式系统中,比如分布式缓存、分布式数据库等解决数据的分配和负载均衡的场景。与其他哈希算法一样,具有单向性、离散性、平衡性。不同的是,一致性哈希算法在取模时这个模足够大,比如 Fowler–Noll–Vo (FNV) 哈希函数,就是是一种高效、分布均匀的哈希函数,其模数也就是输出域在0~232-1区间。

其原理是将输出域构成一个环,数据和节点通过一致性哈希算法后映射到环中的某个点,当需要把数据插入某个节点或查找数据在某个节点时,这个数据对应的哈希值只需在这个环上顺时针找到第一个节点进行操作即可。当节点数量改变时,只需要重新分配一小部分数据即可。

分库分表的应用

如下图,共有3个节点(也可以理解成3个数据库实例),经过一致性哈希算法后映射到环中的某个点。图中的“数据1”经过相同的一致性哈希算法后也映射到环中的某个点,这个时候如果要存储或者查找该数据就需要顺时针找到第一个节点,也就是“节点2”。

在这里插入图片描述

那当添加一个节点后数据怎么迁移?如下图,当添加“节点4“后,只需要将“节点2“中的部分数据迁移到“节点4“中。实现上就是将“节点2“中的哈希值大于“节点3“小于等于“节点4“的数据迁移到“节点4“中,这样在分库分表中就最大程度减少的数据的迁移,也降低了迁移数据的风险。

在这里插入图片描述

通常在进行分库分表时我们的节点个数时有限的,前期可能如图1的分布一样,由于节点在环中分配不均匀,数据映射到环中也不均匀,就会有大量的数据会分布到“节点2”中,同样会造成数据倾斜问题。

怎么办?那就让节点分布均匀,这时候就要引入虚拟节点了。就是说真实的节点虽然只有三个,但是我们可以让每个节点作为大节点管理1000、10000、100000个虚拟的节点,使得每个大节点在环中分布均匀,如下图。

在这里插入图片描述

这样之后,根据哈希的平衡性,数据会均匀的分布到3个节点中,如果需要添加一个大节点,同样是分发给虚拟节点到环上,然后根据迁移规则进行部分数据的迁移。

总结

一致性哈希算法在分库分表的应用中提供了一种高效、均匀且易于扩展的数据分布方式,同时在节点增减时最小化数据迁移成本,是一种还不错的分库分表方案。

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

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

相关文章

【数据开发】大数据平台架构,Hive / THive介绍

1、大数据引擎 大数据引擎是用于处理大规模数据的软件系统, 常用的大数据引擎包括Hadoop、Spark、Hive、Pig、Flink、Storm等。 其中,Hive是一种基于Hadoop的数据仓库工具,可以将结构化的数据映射到Hadoop的分布式文件系统上,并提…

什么是防火墙?详解三种常见的防火墙及各自的优缺点

目录 防火墙的定义 防火墙的功能 防火墙的特性 防火墙的必要性 防火墙的优点 防火墙的局限性 防火墙的分类 分组过滤防火墙 优点: 缺点: 应用代理防火墙 优点 缺点 状态检测防火墙 优点 缺点 防火墙的定义 防火墙的本义原是指古代人们…

【蓝桥杯选拔赛真题11】C++求平方 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析

目录 C/C++求平方 一、题目要求 1、编程实现 2、输入输出 二、算法分析

基于.NET、Uni-App开发支持多平台的小程序商城系统 - CoreShop

前言 小程序商城系统是当前备受追捧的开发领域,它可以为用户提供一个更加便捷、流畅、直观的购物体验,无需下载和安装,随时随地轻松使用。今天给大家推荐一个基于.NET、Uni-App开发支持多平台的小程序商城系统(该商城系统完整开源…

前端框架Vue学习 ——(二)Vue常用指令

文章目录 常用指令 常用指令 指令: HTML 标签上带有 “v-” 前缀的特殊属性&#xff0c;不同指令具有不同含义。例如: v-if, v-for… 常用指令&#xff1a; v-bind&#xff1a;为 HTML 标签绑定属性值&#xff0c;如设置 href&#xff0c;css 样式等 <a v-bind:href"…

NLP入门——基础知识

生成式AI和AIGC&#xff1a; 生成式AI所生成的内容就是AIGC AI的Venn图&#xff1a; 注意&#xff1a; 监督学习&#xff08;训练数据带标签&#xff09;&#xff1a; 经典的监督学习任务包括分类&#xff08;划分类别&#xff09;和回归&#xff08;预测&#xff09;&#x…

基于葡萄串的采摘点定位方法

文章目录 概要所需设备方法基于RGB图像的YOLOV8目标检测基于深度图的区域种子生长利用峰值定位法来确定竖向位置核心代码演示效果概要 这里将介绍如何用图像识别方法来定位葡萄串采摘点,用于机器人自动采摘操作。 所需设备 深度相机,这里我用的是realsense-L515 方法 主…

python爬虫(数据获取——双R)

静态资源加载 静态资源给了请求头和url即可 动态资源加载 headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 } url "https://www.xinpianchang.com/api/xpc/comments/article…

【论文精读】PlanT: Explainable Planning Transformers via Object-Level Representations

1 基本信息 院校&#xff1a;德国的图宾根大学 网站&#xff1a;https://www.katrinrenz.de/plant 2 论文背景 2.1 现有问题 现在的基于学习的方法使用高精地图和BEV&#xff0c;认为准确的&#xff08;达到像素级的pixel-level&#xff09;场景理解是鲁棒的输出的关键。re…

SpringBoot案例(数据层、业务层、表现层)

1.创建项目 2.选择坐标 3.添加坐标 说明&#xff1a;为了便于开发&#xff0c;引入了lombak坐标。 <!--添加mybatis-plus坐标--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><ver…

JavassmMySQL宠物网站系统07183-计算机毕业设计项目选题推荐(附源码)

摘 要 在信息飞速发展的今天&#xff0c;网络已成为人们重要的信息交流平台。宠物网站每天都有大量的信息需要通过网络发布&#xff0c;为此&#xff0c;本人开发了一个基于B/S&#xff08;浏览器/服务器&#xff09;模式的宠物网站系统。 该系统以JJava编程语言、MySQL和SSM框…

【Mac环境搭建】JDK安装、多JDK安装与切换

文章目录 JDK下载与安装下载安装 配置环境变量安装多个JDK共存 JDK下载与安装 下载 Oracle官网提供了非常多个版本的JDK供下载&#xff0c;可以点击如下链接重定向到JDK下载页面 ORACLE官网JDK下载 安装 下面的官方文档可以点开收藏到浏览器的收藏夹&#xff0c;这样后续在开…

【算法】新年好(堆优化dijkstra)

题目 重庆城里有 n 个车站&#xff0c;m 条 双向 公路连接其中的某些车站。 每两个车站最多用一条公路连接&#xff0c;从任何一个车站出发都可以经过一条或者多条公路到达其他车站&#xff0c;但不同的路径需要花费的时间可能不同。 在一条路径上花费的时间等于路径上所有公路…

选择困难症的我,最终选择了Amazon EC2 云服务器

前言 作为一名开发者&#xff0c;如果要部署一个自己的网站&#xff0c;选择一个好的服务器是非常重要的。本文依据我个人使用服务器的经验&#xff0c;给大家在选择时一些建议。我非常推荐大家使用 Amazon EC2 云服务器。 Amazon EC2 云服务器 提供了最广泛、最深入的计算平…

yum提示Another app is currently holding the yum lock

打算centos 7配置一下docker&#xff0c;报错了&#xff0c;yum提示Another app is currently holding the yum lock; waiting for it to exit... 可能是系统自动升级正在运行&#xff0c;yum在锁定状态中。已经有一个yum进程在运行了&#xff0c;使用kill干掉它&#xff1a; …

【DevChat】智能编程助手,告别敲代码烦恼,从此爱上AI编程

&#x1f50e;官方网站&#xff1a;https://www.devchat.ai/ 文章目录 一、DevChat介绍&#x1f447;二、DevChat优势&#x1fa81;三、DevChat注册流程篇&#x1f380;四、DevChat使用教程篇&#x1f4e2;1. DevChat插件安装配置⚒️2. 与DevChat问答交流&#x1f523;3. DevC…

【Kotlin精简】第7章 泛型

1 泛型 泛型即 “参数化类型”&#xff0c;将类型参数化&#xff0c;可以用在类&#xff0c;接口&#xff0c;函数上。与 Java 一样&#xff0c;Kotlin 也提供泛型&#xff0c;为类型安全提供保证&#xff0c;消除类型强转的烦恼。 1.1 泛型优点 类型安全&#xff1a;通用允许…

分享68个工作总结PPT,总有一款适合您

分享68个工作总结PPT&#xff0c;总有一款适合您 PPT下载链接&#xff1a;https://pan.baidu.com/s/1juus0gmesBFxJ-5KZgSMdQ?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。知识付…

【数据结构】数组和字符串(十五):字符串匹配2:KMP算法(Knuth-Morris-Pratt)

文章目录 4.3 字符串4.3.1 字符串的定义与存储4.3.2 字符串的基本操作4.3.3 模式匹配算法0. 朴素模式匹配算法1. ADL语言2. KMP算法分析3. 手动求失败函数定义例1例2例3 4. 自动求失败函数&#xff08;C语言&#xff09;5. KMP算法&#xff08;C语言&#xff09;6. 失败函数答案…

思维模型 凡勃伦效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。为什么有些人愿意为高价商品买单&#xff1f;请看凡勃伦效应。 1 凡勃伦效应的应用 1.1 奢侈品市场中的凡勃伦效应 茅台酒&#xff1a;茅台酒是中国的一种高档白酒&#xff0c;价格非常昂…