10-Docker-分布式存储算法

01-哈希取余算法分区

哈希取余分区(Hash Modulus Partitioning)是一种在分布式计算和数据存储中常用的分区策略,其目的是将数据或计算任务分配到多个节点或服务器上,以实现负载均衡和提高性能。这种分区策略的核心思想是使用哈希函数来将数据或任务的标识(通常是键或标签)映射到一个固定范围的分区中,然后使用取余运算来确定应该分配给哪个分区。

使用 Python 进行哈希取余算法运行代码及结果如下:

def hash_partition(data, num_partitions):partitions = [[] for _ in range(num_partitions)]for item in data:# 计算数据的哈希值,这里使用内置的哈希函数hash()hash_value = hash(item)# 取余以确定数据应该分配到哪个分区partition_index = hash_value % num_partitions# 将数据添加到相应的分区partitions[partition_index].append(item)return partitions# 示例数据
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]# 分成3个分区
num_partitions = 3result = hash_partition(data, num_partitions)for i, partition in enumerate(result):print(f'Partition {i}: {partition}')

程序运行后,代码输入如下内容:
image.png
哈希取余分区的优点:

  • 负载均衡:通过使用哈希函数,可以确保相同标识的数据或任务始终分配到相同的分区,从而分散负载并减少不均匀分布的可能性。
  • 易于扩展:当需要增加或减少节点或服务器时,只需重新计算哈希并将数据或任务重新分配到新的分区,而不需要改变哈希函数本身。
  • 确定性:相同的标识将始终映射到相同的分区,这对于缓存和数据复制等应用非常有用。

哈希取余分区的缺点:

  • 数据倾斜(某些分区可能会处理更多的数据或任务)
  • 节点增减可能需要重新分配大量数据的问题,需要重新计算哈希分区,造成计算量上的增加。

02-一致性哈希算法分区

一致性哈希分区是一种在分布式系统中用于数据分布和负载均衡的技术。它的原理基于哈希函数和环形哈希环,主要用于确定数据在分布式系统中的存储位置。
一致性哈希算法必然有个 hash 函数并按照算法产生 hash 值,这个算法的所有可能的哈希值会构成一个全量集,这个集合可以成为一个 hash 空间 [0,2^32-1],这个是一个线性空间,但是在逻辑上我们把它视为环形空间。

一致性哈希分区是在分布式数据库、缓存系统和负载均衡器等场景中广泛使用的技术,它可以有效地分散数据存储负担,提高系统的性能和容错性。
使用 Python 进行哈希取余算法运行代码及结果如下:

import hashlibclass ConsistentHash:def __init__(self, num_replicas=3):self.num_replicas = num_replicasself.ring = {}  # 一致性哈希环self.nodes = set()  # 节点集合def add_node(self, node):for i in range(self.num_replicas):# 为每个节点创建多个虚拟节点virtual_node = f"{node}-{i}"hash_value = self._hash(virtual_node)self.ring[hash_value] = nodeself.nodes.add(node)def remove_node(self, node):for i in range(self.num_replicas):virtual_node = f"{node}-{i}"hash_value = self._hash(virtual_node)del self.ring[hash_value]self.nodes.remove(node)def get_node(self, key):if not self.ring:return Nonehash_value = self._hash(key)sorted_keys = sorted(self.ring.keys())for key in sorted_keys:if hash_value <= key:return self.ring[key]# 如果key的哈希值大于所有节点的哈希值,返回第一个节点return self.ring[sorted_keys[0]]def _hash(self, key):# 使用SHA-1哈希函数return int(hashlib.sha1(key.encode()).hexdigest(), 16)# 示例
ch = ConsistentHash()
ch.add_node("Node1")
ch.add_node("Node2")
ch.add_node("Node3")# 将数据分配到节点
data = ["Data1", "Data2", "Data3", "Data4", "Data5"]
for item in data:node = ch.get_node(item)print(f"Data '{item}' is assigned to Node '{node}'")# 移除一个节点
ch.remove_node("Node2")# 再次分配数据
print("\nAfter removing Node2:")
for item in data:node = ch.get_node(item)print(f"Data '{item}' is assigned to Node '{node}'")

程序运行后,代码输入如下内容:image.png
比起哈希取余算法,一致性哈希算法解决了哈希取余的容错性扩展性。如果某个节点失败,数据可以被映射到下一个最近的节点,而不会造成大规模的数据迁移。
扩展性指的是增加一台 Node X,X 的位置在 A 和** B 之间,那收到影响的也只是 A 到 X 之间的数据,不会导致 Hash 取余全部重新洗牌。
但是一致性 Hash 算法存在
数据倾斜**的问题,一致性Hash算法在服务节点太少时,容易因为节点分布不均匀而造成数据倾斜。
为了在节点数目发生改变时尽可能少的迁移数据
将所有的存储节点排列在收尾相接的Hash环上,每个key在计算Hash后会顺时针找到临近的存储节点存放而当有节点加入或退出时仅影响该节点在Hash环上顺时针相邻的后续节点。

03-哈希槽算法分区

哈希槽算法分区是大厂常用的算法,只有会哈希槽算法才会和大厂的认知匹配。
一致性哈希算法存在数据倾斜的问题,哈希槽算法本质上是一个数组,数组 [0,2^14-1] 形成 hash slot 空间。
哈希槽可以解决均匀分配的问题,在数据和节点之间又加入了一层,把这层称为哈希槽,用于管理节点和数据之间的关系,就相当于节点上放的是槽,槽上面放的是数据。
槽解决的是颗粒度的问题,相当于把颗粒度变大,便于数据的移动。
哈希解决的是映射的问题,使用 key 来计算所在的槽,便于数据的分配。

使用 Python 进行哈希槽算法运行代码及结果如下:

class HashSlot:def __init__(self, size):self.size = sizeself.slots = [None] * sizedef _hash_function(self, key):return hash(key) % self.sizedef insert(self, key, value):index = self._hash_function(key)if self.slots[index] is None:self.slots[index] = [(key, value)]else:for i, (existing_key, existing_value) in enumerate(self.slots[index]):if existing_key == key:self.slots[index][i] = (key, value)breakelse:self.slots[index].append((key, value))def get(self, key):index = self._hash_function(key)if self.slots[index] is not None:for existing_key, existing_value in self.slots[index]:if existing_key == key:return existing_valueraise KeyError(f"Key '{key}' not found")def delete(self, key):index = self._hash_function(key)if self.slots[index] is not None:for i, (existing_key, _) in enumerate(self.slots[index]):if existing_key == key:del self.slots[index][i]breakelse:raise KeyError(f"Key '{key}' not found")def __str__(self):return str(self.slots)# 示例
hash_slot = HashSlot(8)hash_slot.insert("apple", 5)
hash_slot.insert("banana", 10)
hash_slot.insert("cherry", 15)print(hash_slot)print("Value for 'apple':", hash_slot.get("apple"))
print("Value for 'banana':", hash_slot.get("banana"))
print("Value for 'cherry':", hash_slot.get("cherry"))hash_slot.delete("banana")
print("After deleting 'banana':", hash_slot)

·· 当运行这段代码后,以下事件将发生:

  1. 创建哈希槽对象:代码首先创建了一个名为hash_slot的哈希槽对象,这个哈希槽的大小被初始化为8个槽位。
  2. 插入键值对:接下来,代码使用insert方法向哈希槽中插入三个键值对:"apple"对应5,"banana"对应10,"cherry"对应15。这些键值对将被根据它们的键进行哈希,然后存储在合适的槽位中。
  3. 打印哈希槽:代码使用print(hash_slot)语句打印哈希槽的内容,显示存储在各个槽位中的键值对。
  4. 获取键值:代码使用get方法获取键"apple"、"banana"和"cherry"对应的值,分别为5、10和15。
  5. 删除键值:代码使用delete方法删除键"banana"对应的键值对。
  6. 打印更新后的哈希槽:最后,代码再次使用print(hash_slot)语句打印哈希槽的内容,显示删除了"banana"键值对后的哈希槽状态。

程序运行后,代码输入如下内容:image.png

04-总结与归纳

在本次学习中,我们一共学习了三种分布式存储常用的算法,它们分别是哈希取余算法一致性哈希算法哈希槽算法。这三个算法的优点和缺点后很明显,简单归类如下:
哈希取余算法:优点是负载均衡,易于扩展;缺点是删除增加大量计算量
一致性哈希算法:优点是容错性和扩展性好;缺点是容易出现数据倾斜。
哈希槽算法:优点是快速数据查找,高效的插入和删除操作,数据分布均匀;缺点是哈希冲突,不适合范围查询。

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

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

相关文章

HCIA-hybrid经典小实验

hybrid经典小实验 实验拓扑配置实现SW1SW2 配置验证PC1-PC3 不能通信PC1-PC2 正常通信其他自行测试 实验拓扑 配置实现 SW1 sysname SW1 # undo info-center enable # vlan batch 10 20 30 # interface Ethernet0/0/1 //接口发送该vlan-id的数据帧时&#xff0c;不剥离帧中的…

多级缓存之实现多级缓存

多级缓存的实现离不开Nginx编程&#xff0c;而Nginx编程又离不开OpenResty。 1. OpenResty快速入门 我们希望达到的多级缓存架构如图&#xff1a; 其中&#xff1a; windows上的nginx用来做反向代理服务&#xff0c;将前端的查询商品的ajax请求代理到OpenResty集群 OpenRest…

容器网络-Underlay和Overlay

一、主机网络 前面讲了容器内部网络&#xff0c;但是容器最终是要部署在主机上&#xff0c;跨主机间的网络访问又是怎么样的&#xff0c;跨主机网络主要有两种方案。 二、 Underlay 使用现有底层网络&#xff0c;为每一个容器配置可路由的网络IP。也就是说容器网络和主机网络…

三掌柜第2期赠书活动:《计算机考研精炼1000题》

引言 各位朋友大家好&#xff0c;我是三掌柜。今天&#xff0c;三掌柜赠书第2期启动&#xff0c;本次为大家精选了《计算机考研精炼1000题》这本书。关于这本书的内容&#xff0c;非常丰富&#xff0c;涵盖计算机考研的高频知识内容&#xff0c;不管是正在备考&#xff0c;还是…

Python Opencv实践 - 车牌定位(纯练手,存在失败场景,可以继续优化)

使用传统的计算机视觉方法定位图像中的车牌&#xff0c;参考了部分网上的文章&#xff0c;实际定位效果对于我目前使用的网上的图片来说还可以。实测发现对于车身本身是蓝色、或是车牌本身上方有明显边缘的情况这类图片定位效果较差。纯练手项目&#xff0c;仅供参考。代码中im…

科研检测机构服务预约小程序的效果如何

科研检测机构涵盖的业务比较广&#xff0c;比如水质检测、农产品检测、食品检测等&#xff0c;对相关从业者来说&#xff0c;可能需要频繁使用这些业务&#xff0c;或者个人偶尔需要一些东西检测。 对用户和检测机构来说&#xff0c;由于行业的特殊性&#xff0c;在实际发展中…

keepalived+Nginx+邮件

实验场景&#xff1a; 我使用keepalived保证nginx的高可用&#xff0c;我想知道什么时候ip发生漂移&#xff0c;可以让ip发生漂移的时候 我的邮箱收到消息. 如果对keepalived不了解&#xff0c;这有详细解释&#xff1a;keepalived与nginx与MySQL-CSDN博客https://blog.csdn.ne…

竞赛 行人重识别(person reid) - 机器视觉 深度学习 opencv python

文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习行人重识别(person reid)系统 该项目…

【Copilot】登录报错 Extension activation failed: “No auth flow succeeded.“(VSCode)

问题描述 Visual Studio Code 登录 GitHub Copilot 插件报错。 在浏览器中成功授权 GitHub 账户&#xff0c;返回 VSCode 后仍然报错。 [ERROR] [default] [2023-11-06T12:34:56.185Z] Extension activation failed: "No auth flow succeeded."原因分析 网络环境问…

山西电力市场日前价格预测【2023-11-12】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-11-12&#xff09;山西电力市场全天平均日前电价为224.59元/MWh。其中&#xff0c;最高日前电价为434.30元/MWh&#xff0c;预计出现在18:00。最低日前电价为0.00元/MWh&#xff0c;预计出…

SpringBoot 缓存之 @Cacheable 详细介绍

一、简介 1、缓存介绍 Spring 从 3.1 开始就引入了对 Cache 的支持。定义了 org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 接口来统一不同的缓存技术。并支持使用 JCache&#xff08;JSR-107&#xff09;注解简化我们的开发。&#xfeff; 其…

c语言,将奇数和偶数分类

题目&#xff1a;输入一个整数数组&#xff0c;实现一个函数&#xff0c;来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分&#xff0c;所有偶数位于数组的后半部分。 思路&#xff1a;像冒泡排序那样&#xff0c;相邻两个数比较&#xff0c;两个都是偶数则不…

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException:

错误描述如下所示&#xff1a; 我们将错误拉到最下面如下所示为导致异常的原因&#xff1a; Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type com.example.reviewmybatisplus.Service.UserService available: expec…

Perl语言用多线程爬取商品信息并做可视化处理

首先&#xff0c;我们需要使用Perl的LWP::UserAgent模块来发送HTTP请求。然后&#xff0c;我们可以使用HTML::TreeBuilder模块来解析HTML文档。在这个例子中&#xff0c;我们将使用BeautifulSoup模块来解析HTML文档。 #!/usr/bin/perl use strict; use warnings; use LWP::User…

班级新闻管理系统asp.net+sqlserver

班级新闻管理系统 附加功能 新闻图片&#xff0c;点击次数访问自增&#xff0c;每个人都只能增删改查自己发布的新闻&#xff0c;并可以看到所有人发布的新闻 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net架构和sql serve…

内存条选购注意事项(电脑,笔记本)

电脑内存条的作用、选购技巧以及注意事项详解 - 郝光明的个人空间 - OSCHINA - 中文开源技术交流社区 现在的电脑直接和内存条联系 电脑上的所有输入和输出都只能依靠内存条 现在买双条而不是单条 买两个相同的内存条最好 笔记本先分清是低电压还是标准电压&#xff0c;DD…

前端和空字符串、零比较时请务必使用===

在前端开发中遇到一个问题&#xff0c;以下两条语句的结果都是true。 console.log(0 ""); console.log(false ""); 这就导致了editingId为0的时候&#xff0c;if分支并没有执行&#xff0c;而我的本意是当editingId不是空也不是空字符串的时候执行分支…

可视化 | 3D文字球状标签云

文章目录 &#x1f4da;改编点&#x1f4da;final 改编自echarts 3d词云&#xff08;指向滑动、拖动、缩放、点击、自转 &#xff09; &#x1f4da;改编点 背景透明&#xff1a;background:rgb(0,0,0,0);不用链接&#xff0c;用span&#xff0c;重点span标class"star&q…

3d max软件中的缓存垃圾该如何清理?

使用3d max建模到渲染操作&#xff0c;来回对效果图调整的次数过多时&#xff0c;就会出现一下看不到的垃圾缓存&#xff0c;影响保存的速度&#xff0c;影响效率&#xff01; 对于这类的3d垃圾清理的有什么高效方法呢&#xff1f; 3dmax垃圾清理的常规操作如下&#xff1a; 1、…

跨镜头目标融合__追踪之目标重识别研究(跨镜头目标追踪)

文章目录 标题&#xff1a;跨镜头目标融合&#xff1b;目标重识别&#xff1b;跨镜头目标追踪&#xff1b; 1 目的&#xff1a;2 实现方法/策略&#xff1a;2.1 目标类型位置匹配&#xff08;或考虑结合目标轨迹&#xff09;2.2 目标重识别2.3 目标类型位置匹配(轨迹)目标重识别…