优雅求模,一致性哈希算法

传统哈希局限性

求模,/* by 01130.hk - online tools website : 01130.hk/zh/htaccess2nginx.html */ 也就是 key % 节点数 N, 当节点数量变化时(如服务器扩容 / 下线),几乎所有数据的映射关系都会失效,导致大量数据需要重新迁移,引发 “哈希雪崩”。

image

key的hash值节点数求模
10310 % 3 = 1
11311 % 3 = 2
12312 % 3 = 0
10410 % 4 = 2
11411 % 4 = 3
12412 % 4 = 0

此时可以看到之前分配到1,2,0节点的key,需要被重新移动到2,3,0。也就是/* by 01130.hk - online tools website : 01130.hk/zh/htaccess2nginx.html */ 75%的数据需要移动。
如果这个总数是20亿呢?这会是一场灾难

关于哈希可以参考此文 https://www.cnblogs.com/lmy5215006/p/18748028

理论支撑:一致性哈希

那如何解决这个问题呢?
正所谓头痛医头,脚痛医脚。既然是因为分母发生变化导致,那我想个办法让分母不变不就解决这个问题了?
聪明的小伙伴已经想到了,把分母设为int最大值2³²-1即可。
这时候新的问题又来了,2³²-1=4294967295 这么大的一个分母(节点数),任何数求模余数都是他自己,这就失去了求模的意义,求模的本质是为了对hash瘦身,你倒好又绕回来了,因此这条路走不通,但也提供了灵感。

哈希环(hash ring)

因此,在1997年,consistent hash算法被提出,它结合了环形数组与上述的灵感。将hash算法的输出范围抽象成一个圆环,并hash值限定为0-2³²-1。

image

节点映射到哈希环

把每一个节点(Node)算出一个hash值,放在hash ring对应的位置上

假设有3个节点
image

数据映射到哈希环

将要存储的数据(key)也通过相同的算法计算出hash值,放在hash ring对应的位置上

假设有1000个key,数据映射到环后,顺时针方向寻找第一个遇到的节点,该节点就是存储key的节点
image

节点动态增删

当要动态增删节点时,一致性hash只会影响hash ring上相邻节点的部份数据,而不是迁移所有数据,这极大减少了数据迁移量
image
image

删除结节也同理,就是一个在hash ring上此消彼长的过程。

进一步优化:虚拟节点

image
让我们再回到此图,在最初的3个节点中,我们会发现一丝丝不和谐的因素,蓝色节点中keys的数量为103,绿色节点keys的数量为572,红色节点的keys数量为325,他们之间的分配并不均衡。

当节点较少时,keys可能集中分布在某一个特定节点,导致旱的旱死,涝的涝死,这便是数据倾斜
那如何优化呢?在计算机中,没有什么是不能通过增加一层中间层能解决的。

为每个物理节点创建多个"虚拟节点",由虚拟节点代替物理节点,映射到hash ring上

image

具体落地:Hash Slot

有了理论支撑,在具体落地的过程中,发生了细微变化。但核心目标依旧不变:当节点变化时,数据最小化迁移

Consistend HashHash Slot
空间初始化构建 0~2³²-1 的hash ring。划分固定数量的Hash Slot,比如Redis的16384个槽。
数据映射通过hash(key)映射到ring上的某个点,顺时针找到最近节点通过hash(key)得到hash,再通过hash%槽总数得到槽编号,最后通过槽编号与节点的映射关系得到所属节点。
节点映射计算节点的hash值,比如(IP+端口),直接映射到环上节点不直接映射,而是通过维护与槽位的映射关系,如节点 A 负责槽 0~5460,节点 B 负责槽 5461~10922

Hash Slot解决了什么痛点?

Consisten hash痛点Hash Slot方案
数据倾斜槽的数量足够大,且槽数量在节点之间均匀分配,比如Redis有16384个槽,假设3个节点,每个节点分配5461个槽,因为槽的数量很大,所以天然避免数据倾斜
数据迁移颗粒度大迁移粒度从 “节点级” 缩小到 “槽级”—— 节点扩容 / 缩容时,仅需迁移 “待分配 / 释放的槽”(而非整个节点的数据)

事实上,Hash Slot与Consistend Hash在思想上没有本质上的差别。你也可以创建16384个虚拟节点来对标Hash Slot,只是工程化难度不同的选择而已

内容概要:本文介绍了一个基于MATLAB实现的多目标粒子群优化算法(MOPSO)在无人机三维路径规划中的应用。该代码实现了完整的路径规划流程,包括拟数据生成、障碍物随机生成、MOPSO优化解、帕累托前沿分析、最优路径选择、代理型训练以及丰富的可视化功能。系统支持用户通过GUI界面设置参数,如粒子数量、迭代次数、路径节点数等,并能一键运行完成路径规划与评估。代码采用块化设计,包含详细的注释,同时提供了简洁版本,便于理解和二次开发。此外,系统还引入了代理型(surrogate model)进行性能预测,并通过多种图表对结果进行全面评估。 适合人群:具备一定MATLAB编程基础的科研人员、自动化/控制/航空航天等相关专业的研究生或高年级本科生,以及从事无人机路径规划、智能优化算法研究的工程技术人员。 使用场景及目标:①用于教学演示多目标优化算法(如MOPSO)的基本原理与实现方法;②为无人机三维路径规划提供可复现的仿真平台;③支持对不同参数配置下的路径长度、飞行时间、能耗与安全风险之间的权衡进行分析;④可用于进一步扩展研究,如融合动态环境、多无人机协同等场景。 其他说明:该资源包含两份代码(详细注释版与简洁版),运行结果可通过图形界面直观展示,包括Pareto前沿、收敛曲线、风险热图、路径雷达图等,有助于深入理解优化过程与结果特性。建议使用者结合实际需调整参数,并利用提供的型导出功能将最优路径应用于真实系统。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值