当前位置: 首页 > news >正文

《分布式技术原理与算法解析》学习笔记Day22

哈希与一致性哈希

在分布式系统中,哈希和一致性哈希是数据索引或者数据分布的常见实现方式。

数据分布设计原则

在分布式数据存储系统中,做存储方案选型时,一般会考虑以下因素:

  • 数据均匀
  • 数据稳定
  • 节点异构性
  • 隔离故障域
  • 性能稳定性

数据均匀有两重含义:

  • 不同存储节点中存储的数据要尽量均衡,避免让某一个或者某几个节点存储压力过大,而其他节点几乎没有什么数据。
  • 用户访问也要做到均衡,避免出现某一个或者某几个节点的访问量很大,但其他节点却无人问津的情况。

数据稳定是指当存储节点出现故障需要移除或者扩增时,数据按照分布规则得到的结果应该尽量保持稳定,不要出现大范围的数据迁移。

节点异构性是指不同存储节点的硬件配置可能差别很大,这样平均分配数据就是一种不均衡。

隔离故障域是指为了保证数据的可用和可靠性,需要做数据备份,但是如果主数据和备份数据都放到了同一个硬盘或者节点,就违背了备份的初衷。一个好的数据分布算法,应该为每个数据映射一组存储节点,这些节点应该尽量在不同的故障域。

性能稳定是指数据存储和查询的效率要有保证,不能因为节点的添加或者删除,造成存储或者访问性能的严重下降。

数据分布方法

我们会涉及4种不同的数据分布方法。

哈希

哈希是指将数据按照提前规定好的函数映射到相应的存储节点,即进行一个哈希计算,得到的结果就是数据应该存储的节点。

它是一种非常常用的数据分布方法,核心思想是:1)确定一个哈希函数,2)通过计算得到数据对应的存储节点。

哈希算法的一个优点是只要哈希函数设置得当,可以很好的保证数据均匀性,但缺点是稳定性差,当节点数量发生变化时,需要大规模数据迁移。

哈希方法适用于同类型节点且节点数量比较固定的场景。

一致性哈希

一致性哈希也是采取哈希函数,但是进行两步哈希:

  1. 对存储节点进行哈希计算,即对存储节点进行哈希映射。
  2. 当对数据进行存储或者访问时,首先对数据进行映射得到一个结果,然后找到比该结果大的第一个存储节点,就是该数据应该存储的节点。

一致性哈希将存储节点和数据都映射到一个首尾相连的哈希环上,存储节点可以根据IP地址进行哈希,数据通常按照顺时针方向寻找的方式,来确定自己所属的存储节点,即从数据映射在环上的位置开始,顺时针方向找到的第一个存储节点。

一致性哈希是对哈希方法的改进,在数据存储时采用哈希方式确定存储位置的基础上,又增加了一层哈希,也就是在数据存储前,对存储节点预先进行了哈希映射。

这种改进很好的解决哈希方法存在的稳定性问题,当节点加入或退出时,仅影响该节点在哈希环上顺时针相邻的后继节点。

一致性哈希带来的主要问题是均匀性问题,即对后继节点的负载会变大,当有节点退出时,该节点的后继节点需要承担该节点的所有负载,如果后继节点承受不住,便会出现节点故障,导致后继节点的后继节点也面临同样的问题。

一致性哈希方法比较适合同类型节点、节点规模会发生变化的场景。

带有限负载的一致性哈希

带有限负载的一致性哈希方法的核心原理是:给每个存储节点设置一个存储上限值,来控制存储节点添加或者删除造成的数据不均匀。当数据按照一致性哈希算法找到相应的存储节点后,要先判断该存储节点是否达到了存储上限,如果已经达到了上限,则需要继续寻找该存储节点顺时针方向之后的节点进行存储。

带有限负载的一致性哈希方法适合同类型节点、节点规模会发生变化的场景。

带虚拟节点的一致性哈希

带虚拟节点的一致性哈希方法的核心思想是:根据每个节点的性能,为每个节点划分不同数量的虚拟节点,并将这些虚拟节点映射到哈希环中,然后再按照一致性哈希算法进行数据映射和存储。

带虚拟节点的一致性哈希方法比较适合异构节点、节点规模会发生变化的场景。

这种方法不仅解决了节点异构性问题,还提高了系统稳定性,当节点发生变化时,会有多个节点共同分担系统的变化。但是这种方法需要维护虚拟节点,增加了维护和管理的复杂度,同时,节点变化带来的数据迁移等操作也会变得复杂。

下面是4种不同的数据分片方法的详细比较。
在这里插入图片描述

数据分区和数据分片的区别

数据分区是从数据存储块的维度进行划分,不同的分区在物理上归属于不同的节点。数据分区中可以存储不同的数据,也可以存储相同的数据来实现数据备份。

数据分片是从数据维度进行划分,它将一个数据结合按照一定的方式划分成多个数据子集,不同的数据子集存储在不同的存储块上,这些存储块可以在不同的节点上,也可以在同一个节点上。

数据分区和数据分片是两个不同的概念,属于分布式存储系统中不同角色的技术。数据分区是“数据存储”相关的技术,数据分片是“数据索引”相关的技术。

相关文章:

《分布式技术原理与算法解析》学习笔记Day22

哈希与一致性哈希 在分布式系统中,哈希和一致性哈希是数据索引或者数据分布的常见实现方式。 数据分布设计原则 在分布式数据存储系统中,做存储方案选型时,一般会考虑以下因素: 数据均匀数据稳定节点异构性隔离故障域性能稳定…...

[MySQL]MySQL数据类型

文章目录数据类型分类数值类型tinyint类型bit类型float类型decimal类型字符串类型char类型varchar类型char和varchar对比日期和时间类型enum和set类型数据类型分类 MySQL中,支持各种各样的类型,比如表示数值的整型浮点型,文本、二进制类型、…...

利用steam搬砖信息差赚钱,单账号200+,小白也能轻松上手!

现在很多人在做互联网而且也赚到钱了,但还是有很多人赚不到钱,这是为什么? 这里我不得不说一个词叫做赛道,也就是选择,选择大于努力,项目本身大于一切,90%的人都觉得直播带货赚钱,但…...

树与二叉树与森林的相关性质

文章目录树的度树的性质二叉树的性质二叉树与森林树的度 树的度指的是树内所有节点的度数的最大值。 节点的度:节点所拥有的子树的数量。简单来说,我们直接数分支即可,例如下图: 在这颗二叉树中,节点2的度为2&#…...

MySQL面试题

文章目录MySQL索引Mysql索引分类InnDB索引与MyISAM索引实现有什么区别一个表中如果没有创建索引,那么还会创建B树么?B树原理B树怎么来的B树 叶子节点和非叶子节点B树能存储多少数据?MySQL索引 Mysql索引分类 mysql 索引分为三类&#xff1a…...

【蓝桥OJ—C语言】高斯日记、马虎的算式、第39级台阶

文章目录高斯日记马虎的算式第39级台阶总结高斯日记 题目: 大数学家高斯有个好习惯:无论如何都要记日记。 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210。 后来人们知道&am…...

基于深度学习的三维重建网络PatchMatchNet(二):dtu数据集介绍及PatchMatchNet中加载数据部分代码解析

目录 1.dtu数据集介绍 2. PatchMatchNet中数据加载模块详解(dtu_yao_eval.py) 1.dtu数据集介绍 dtu数据集下载地址:dtu...

一文3000字从0到1实现基于requests框架接口自动化测试项目实战(建议收藏)

requests库是一个常用的用于http请求的模块,它使用python语言编写,在当下python系列的接口自动化中应用广泛,本文将带领大家深入学习这个库 Python环境的安装就不在这里赘述了,我们直接开干。 01、requests的安装 windows下执行…...

【RockerMQ】001-RockerMQ 概述

【RockerMQ】001-RockerMQ 概述 文章目录【RockerMQ】001-RockerMQ 概述一、MQ 概述1、MQ 简介2、MQ 用途限流削峰异步解耦数据收集3、常见 MQ 产品概述对比4、MQ 常见协议二、RocketMQ 概述1、简介2、发展历史一、MQ 概述 1、MQ 简介 MQ,Message Queue&#xff0…...

阿里是如何做Code Review的?

作为卓越工程文化的一部分,Code Review其实一直在进行中,只是各团队根据自身情况张驰有度,松紧可能也不一,这里简单梳理一下CR的方法和团队实践。 一、为什么要CR 提前发现缺陷 在CodeReview阶段发现的逻辑错误、业务理解偏差、性…...

内核调试:一次多线程调试与KASAN检测实例

内核调试:一次多线程调试与KASAN检测实例1. 环境说明2. 问题描述3. 问题排查与定位3.1 线程并发问题(减少线程数)3.2 轻量地跟踪对象的分配与释放3.3 检查空指针与潜在修改者3.4 KASAN检查4. 总结博主最近遇到一个非常顽固的多线程BUG&#x…...

Java - 数据结构,队列

一、什么是队列 普通队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(FirstIn First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列&#xf…...

ccc-pytorch-感知机算法(3)

文章目录单一输出感知机多输出感知机MLP反向传播单一输出感知机 内容解释: w001w^1_{00}w001​:输入标号1连接标号0(第一层)x00x_0^0x00​:第0层的标号为0的值O11O_1^1O11​:第一层的标号为0的输出值t:真实…...

LeetCode 225.用队列实现栈

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类:void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int top() …...

【面试】spring控制反转IOC

目录一.说明二.ioc的概念和作用三.优点四.实现机制五.IOC和DI的区别六.设计原则一.说明 1.ioc的概念2.ioc的作用3.ioc的优点4.ioc的实现机制 二.ioc的概念和作用 1.全称Inversion of Control2.控制:创建对象的控制权3.反转:以前对象是程序员主动去new…...

Spring 事务管理详解及使用

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...

LeetCode 232.用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元…...

go面向对象思想封装继承多态

go貌似都没有听说过继承,当然这个继承不像c中通过class类的方式去继承,还是通过struct的方式,所以go严格来说不是面向对象编程的语言,c和java才是,不过还是可以基于自身的一些的特性实现面向对象的功能,面向…...

【网络原理9】HTTP响应篇

在前两篇文章当中,已经分别介绍了HTTP是什么,以及常见的请求头当中的属性。【网络原理7】认识HTTP_革凡成圣211的博客-CSDN博客HTTP抓包,Fiddler的使用https://blog.csdn.net/weixin_56738054/article/details/129148515?spm1001.2014.3001.…...

SpringCloud之Seata(二)

4.Seata如何应用于项目? 安装seata及修改配置 4.1 官网下载Seata安装包 4.2 修改seata/config.txt 4.2.1 修改存储方式 store.db.dbTypemysql store.db.driverClassNamecom.mysql.jdbc.Driver store.db.urljdbc:mysql://你的IP:3306/seata?useUnicodetrue sto…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性&#xf…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题:安全。文章将详细阐述认证(Authentication) 与授权(Authorization的核心概念,对比传统 Session-Cookie 与现代 JWT(JS…...