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.hqwc.cn/news/169849.html

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

相关文章

【C语言】【数据结构】【环形链表判断是否带环并返回进环节点】有数学推导加图解

1.判断是否带环&#xff1a; 用快慢指针 slow指针一次走一步&#xff0c;fast指针一次走两步 当两个指针相遇时&#xff0c;链表带环&#xff1b;两个指针不能相遇时&#xff0c;当fast走到倒数第一个节点或为空时&#xff0c;跳出循环返回空指针。 那么slow指针一次走一步&a…

Python进行多线程爬取数据通用模板

首先&#xff0c;我们需要导入所需的库&#xff0c;包括requests和BeautifulSoup。requests库用于发送HTTP请求&#xff0c;BeautifulSoup库用于解析HTML文档。 import requests from bs4 import BeautifulSoup然后&#xff0c;我们需要定义一个函数来发送HTTP请求并返回响应。…

Spring Security使用总结五,加密用户密码,不再使用明文保存密码

上一章我们成功的注册了一个新用户&#xff0c;按照正常逻辑来说&#xff0c;这一章应该是登录了&#xff0c;但是我们也看到了&#xff0c;这数据库保存的居然是明文密码&#xff0c;这谁受得了&#xff0c;这要是用户信息泄露了&#xff0c;这不让人一锅端了啊&#xff0c;还…

SpringBootWeb案例——Tlias智能学习辅助系统(3)——登录校验

前一节已经实现了部门管理、员工管理的基本功能。但并没有登录&#xff0c;就直接访问到了Tlias智能学习辅助系统的后台&#xff0c;这节来实现登录认证。 目录 登录功能登录校验(重点)会话技术会话跟踪方案一 Cookie&#xff08;客户端会话跟踪技术&#xff09;会话跟踪方案二…

ablation study

文章目录 ablation study1、消融实验思想是什么&#xff1f;2、消融实验意义3、消融实验应用场景举例 ablation study 1、消融实验思想是什么&#xff1f; “消融实验”&#xff08;ablation study&#xff09;通常指的是通过逐步移除系统的一部分来评估该系统的贡献。这种方法…

qemu 之 uboot、linux 启动

目录 编译uboot、kernel 编译启动从 uboot 中引导启动 linux注参考 本文主要说明 arm64 在 qemu 上的相关启动。 编译 使用的是 qemu-8.1.1 版本&#xff0c;编译命令如下: ../configure --cc/usr/local/bin/gcc --prefix/home/XXX/qemu_out --enable-virtfs --enable-slir…

Liunx命令汇总

一.用户相关命令 1.1账号管理 创建用户&#xff1a; useradd &#xff08;选项&#xff09; 用户名用户口令&#xff1a; passwd &#xff08;选项&#xff09; 用户名修改用户&#xff1a; usermod 选项 用户名删除用户&#xff1a; userdel &#xff08;选项&#xff09; 用…

【JVM系列】- 寻觅·方法区的内容

寻觅方法区的内容 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f31d;分享学习心得&#xff0c;欢迎指正&#xff0c;大家一起学习成长&#xff01; 文章目录 寻觅…

基于springboot实现桥牌计分管理系统项目【项目源码】计算机毕业设计

基于springboot实现桥牌计分管理系统演示 JAVA简介 JavaScript是一种网络脚本语言&#xff0c;广泛运用于web应用开发&#xff0c;可以用来添加网页的格式动态效果&#xff0c;该语言不用进行预编译就直接运行&#xff0c;可以直接嵌入HTML语言中&#xff0c;写成js语言&#…

【可解释AI】Alibi explain: 解释机器学习模型的算法

Alibi explain: 解释机器学习模型的算法 可解释人工智能简介Alibi特点算法Library设计展望参考资料 今天介绍Alibi Explain&#xff0c;一个开源Python库&#xff0c;用于解释机器学习模型的预测(https://github.com/SeldonIO/alibi)。该库具有最先进的分类和回归模型可解释性算…

55基于matlab的1.高斯噪声2.瑞利噪声3.伽马噪声4.均匀分布噪声5.脉冲(椒盐)噪声

基于matlab的1.高斯噪声2.瑞利噪声3.伽马噪声4.均匀分布噪声5.脉冲&#xff08;椒盐&#xff09;噪声五组噪声模型&#xff0c;程序已调通&#xff0c;可直接运行。 55高斯噪声、瑞利噪声 (xiaohongshu.com)

55. 右旋字符串(第八期模拟笔试)

55. 右旋字符串&#xff08;第八期模拟笔试&#xff09; 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a;错误经验吸取 原题链接&#xff1a; 55. 右旋字符串&#xff08;第八期模拟笔试&#xff09; https://kamacoder.com/problempage…