致性哈希算法的优化----关于如何保正在环中增加新节点时,命中率不受影响

2023-11-09

背景

 

09年初,我们做了一个memcached的智能客户端库,业务只要将这个库链上,就能跟memcached服务器通信。并且实现了一致性哈希的分布式算法,后端memcached服务器可以无限制扩展,而且客户端能对memcached做自动故障转移以及恢复。

我们知道,在没有对数据做冗余存储的情况下,无论是一致性哈希还是求余数分布式算法,在新增或删除memcached节点时,命中率都会不同程度的降低。本文旨在解决当新增memcached节点时,如何保证命中率不变。

 

 

基本原理

 

当新增一个memcached节点时,将该新节点的下一个节点的且属于该新节点的数据迁移过来。

 

上面的这个基本原理读起来可能会比较拗口,容我下面详细说明。

 

 

原理描述

 

如图1所示,假设当前哈希环上有n个memcached节点,记为M1~Mn,存储到这些节点上的数据的有效期都是一致的,记为Te。因此从图1可以看出,从M1到Mk区间的数据均从Mk上存取。比如数据K1,K2,Kn。

         
                  
    

                                                                            图1

当新增节点Mx时,如图2所示。

                  
                     
                   

                                                                              图2

此时数据K1,K2从新节点Mx读取不到的,但节点Mk存储了这些数据,我们需要做的就是将这些数据迁移到新节点Mx。

 

具体做法是:将新加入的节点Mx标记为N(New)状态,表示该节点是新增的。在N状态下读取数据K1的步骤为:

1)从Mx读取数据,如果读取得到,则返回,否则进行2);

2)从Mk读取数据,如果读取不到,则返回,否则进行3);

3)将读取到的数据K1写入Mx;

4)将K1从Mk删除;

 

在N状态下,不断进行上面的4个步骤

 

因为数据的有效期是Te,所以在经过Te时间后,Mk上的数据随之自动失效了,此时将Mx标记为O(Old)状态,在O状态下,如果读取不到数据也立即返回,无需再次到它下一个节点尝试读取。

 

 

 

http://scottina.iteye.com/blog/650380

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

致性哈希算法的优化----关于如何保正在环中增加新节点时,命中率不受影响 的相关文章

  • 确定解决迷宫问题的最小线段数

    我有一个问题 我需要定义一个具有最少数量的顶点的多边形 该多边形与不透明的图像中的每个像素相交或包含每个像素 令 N 为图像中的像素数 我唯一的假设是图像的边界 孔 内不能包含透明像素 并且至少有两个像素是不透明的 举个例子 假设我有以下图
  • 如何从一组重叠的圆计算多边形集?

    这个问题是一些计算细节的扩展这个问题 https stackoverflow com questions 1667310 combined area of overlapping circles 假设有一组 可能重叠的 圆 并且希望计算这组
  • 如何将无向图转换为 DAG?

    The 维基页面 http en wikipedia org wiki Directed acyclic graph Relation to other kinds of graphs says 任何无向图都可以通过为其顶点选择总顺序并将每
  • 高维最近邻搜索的最佳数据结构

    我实际上正在处理高维数据 50 000 100 000 个特征 并且必须对其执行最近邻搜索 我知道随着维度的增长 KD 树的性能很差 而且我还了解到 一般来说 所有空间分区数据结构都倾向于对高维数据执行详尽的搜索 此外 还有两个重要事实需要
  • 我需要一个支持高效随机访问和 O(k) 插入和删除的容器

    我再次尝试问同样的问题question https stackoverflow com questions 3808708 delete parts of a dynamic array and grow other 但我最终提出了一个不同
  • 点集子集的最小周长凸包

    给定平面上的 n 个点 没有 3 个共线 给定数字 k 找到 k 个点的子集 使得 k 个点的凸包在 k 个点的子集的任何凸包中具有最小周长 我可以想到一个简单的方法 运行时间为 O n k k log k 找到大小为 k 的每个子集的凸包
  • 寻找将集合映射到整数的双射函数

    对于任意两个序列 a b 其中 a a1 a2 an 且 b b1 b2 bn 0a b具有相同的元素 而不关心它们的顺序 例如 如果 a 1 1 2 3 b 2 1 3 1 c 3 2 1 3 则 f a f b f a f b 我知道有
  • 时间复杂度和运行时间有什么区别?

    时间复杂度和运行时间有什么区别 它们是一样的吗 运行时间是指程序运行所需的时间 时间复杂度是对输入大小趋于无穷大时运行时间渐进行为的描述 您可以说运行时间 是 O n 2 或其他什么 因为这是描述复杂性类和大 O 表示法的惯用方式 事实上
  • 用 C++ 生成 AST

    我正在用 C 制作一个解释器 到目前为止我已经有了词法分析器来生成标记 问题是我不确定如何生成 行走 解析树 我正在考虑使用数组数组来制作解析树 但我不确定如何以正确的顺序将标记实际插入到解析树中 我不确定是自上而下 左右还是自下而上 左右
  • 使用并集查找(又名不相交集)检测图是否是二分图

    我正在 Spoj 上做一个问题 基本上可以简化为检测图是否是二分图 我正在尝试使用 dfs 为图表着色 但它太慢了 有人评论这个 没有 bfs 没有 dfs 没有二部图 简单的并查集就可以做到 确实速度很快 提示 1 偶数长度的环不会影响两
  • 如何有效地找到距给定点最远的点(从一组点中)?

    我正在寻找一种算法或数据结构来解决以下问题 给你一组点 S 然后你会得到另一个点形式的 Q 查询 对于每个查询 找到集合中距离给定点最远的点 集合中最多有 10 5 个点和 10 5 个查询 所有点的坐标都在 0 到 10 5 范围内 我想
  • 直接选择排序与交换选择排序

    有什么区别直接选择排序 vs 交换选择排序 今天我陷入了一场争论 我的教授在他的讲义中使用了这两个术语 维基百科和任何教科书或网站都会为您提供的选择排序就是他所说的 交换选择排序 我以前从未听说过 交换选择排序 这个术语 仅 选择排序 并且
  • 用于开始和/或包含搜索的最快字符串集合结构/算法是什么

    我有以下情况 我有一个大的字符串集合 比如说 250 000 平均长度可能是 30 我要做的就是在这些搜索中进行许多搜索 大多数搜索都是 StartsWith 和 Contains 类型的 该集合在运行时是静态的 这意味着选择的集合的初始读
  • 在java中使用BUBBLE SORT对二维字符串数组进行排序

    类似的问题已经被问过 但从来没有关于二维字符串数组 因此在尝试了很长时间之后我找不到我想要的 我正在尝试使用 BubbleSort 对 java 中的 2D 字符串数组进行排序 作为输入 我收到一个二维字符串数组 一个表 以及您应该排序的
  • 有没有时间复杂度为O(N)的排序算法?

    大多数排序算法的复杂度为 O NN 或 O NlogN 来实现结果 但是 对于特定的输入集 有些算法的复杂度为 O N 我想知道是否有一种排序算法在所有情况下都具有 O N 的复杂度 如果您只能比较 检查两个项目是否为 正在排序的值 那么您
  • 数学/算法使图像适合屏幕保留纵横比

    我需要数学 算法方面的帮助来拍摄已知尺寸的图像并适合两个屏幕尺寸之一 720 x 480 或 1280 x 1024 图像尺寸来自 XML 文件 但这些尺寸是 Web 尺寸 我还从 XML 中选择了一些图像 这些图像的分辨率可能比 Web
  • 数量重新分配逻辑 - 具有外部数据集的 MapGroups

    我正在研究一种复杂的逻辑 需要将数量从一个数据集重新分配到另一个数据集 在例子中我们有Owner and Invoice 我们需要从数量中减去Invoice准确地Owner匹配 在给定汽车的给定邮政编码处 减去的数量需要重新分配回同一辆车出
  • 我正在尝试寻找“调酒师算法”

    我正在解决旧编程竞赛中的一些示例问题 在这个问题中 我们输入了我们有多少调酒师以及他们知道哪种配方 每杯鸡尾酒的制作时间为 1 分钟 我们需要计算是否可以在 5 分钟内使用所有调酒师完成订单 解决这个问题的关键是尽可能高效地分配鸡尾酒 这就
  • 从 1 到 20 亿,像 (23,29) 这样相差 6 的连续素数对的数量

    如何在考虑时间复杂度的情况下从 1 到 20 亿 使用任何编程语言且不使用任何外部库 找到像 23 29 这样相差 6 的连续素数对的数量 尝试过埃拉托色尼筛 但获得连续素数是一个挑战 使用了生成器 但时间复杂度非常高 代码是 def ge
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选

随机推荐

  • C++异常处理try和throw以及catch的使用

    异常捕获的基本构成方式 try c 异常的处理方式 包含可能抛出异常的语句 catch 类型名 形参名 捕获特定类型的异常 处理异常的语句 条件是抛出的异常类型是与catch参数类型匹配 try捕获异常并不能保证程序就不会崩溃 通常还需要做
  • python中关于requests里的timeout()

    timeout 超时 首先是 为防止服务器不能及时响应 大部分发至外部服务器的请求都应该带着 timeout 参数 在默认情况下 除非显式指定了 timeout 值 requests 是不会自动进行超时处理的 如果没有 timeout 你的
  • Oracle identified by values

    有时候需要使用user的密码 却不知道user密码是什么 我常常使用如下把戏 1 记录密码hash值 2 更改为自己的密码 3 使用完后 利用identified by values 更改回原来的密码 在oracle 10g的时候 密码是h
  • opencv图像灰度重心算法

    原文 http blog csdn net moses1213 article details 44679603 导师交给的项目 其中一步就是求光斑的重心 网上有很多关于重心的代码 大体是利用cvFindContour函数找出图像的轮廓 然
  • 开源项目 xijia-plus 启动教程 (通用后管理系统)

    一 说明 xijia plus 是什么 xijia plus 是一个 通用后管理系统 脚手架 采用 springboot vue 进行开发 可以在该脚手架进行业务的快速开发 xijia plus 可以做什么 如果你想快速开发一个项目 可以用
  • Graphpad Prism9.5.1 安装教程 (含Win/Mac版)

    GraphPad Prism GraphPad Prism是一款非常专业强大的科研医学生物数据处理绘图软件 它可以将科学图形 综合曲线拟合 非线性回归 可理解的统计数据 数据组织结合在一起 除了最基本的数据统计分析外 还能自动生成统计图 安
  • 【程序员必须要掌握哪些算法】

    一个程序员一生中可能会邂逅各种各样的算法 但总有那么几种 是作为一个程序员一定会遇见且大概率需要掌握的算法 今天就来聊聊这些十分重要的 必抓 算法吧 你可以从以下几个方面进行创作 仅供参考 一 引言 算法作为程序员的核心技能之一 在软件开发
  • 安卓面试之轻松战胜内存优化问题

    熟悉如何内存优化 无疑是安卓工程师进阶的一个必要条件 同时也是面试的重点和难点 面试常见问题 1 如何优化内存 2 如何加载10M大小的图片 3 如何线上监控内存 为什么要优化内存 移动设备中 内存是非常重要的资源 如果内存使用不当 轻则出
  • 利用短时傅里叶变换(STFT)对信号进行时频谱分析和去噪声

    利用短时傅里叶变换 STFT 对信号进行时频谱分析和去噪声 1 背景 傅里叶变换 TF 对频谱的描绘是 全局性 的 不能反映时间维度局部区域上的特征 人们虽然从傅立叶变换能清楚地看到一整段信号包含的每一个频率的分量值 但很难看出对应于频率域
  • 基于Spring Gateway路由判断器实现各种灰度发布场景

    文章目录 1 灰度发布实现 1 1 按随机用户的流量百分比实现灰度 1 2 按人群划分实现的灰度 1 2 1 通过Header信息实现灰度 1 2 2 通过Query信息实现灰度 1 2 3 通过RemoteAdd判断来源IP实现灰度 2
  • django中models field详解

    本文参考自 django官方文档models field 在model中添加字段的格式一般为 field name field type field options 一 field options 所有字段共用 1 null 默认为Fals
  • 滤波器拓扑结构:Sallen-key和Multiple Feedback

    在一些关于滤波器设计的地方 总可以看到Sallen key和Multiple Feedback这两个词组 但不清楚什么意思 查了查资料 顺带在此处记录一下 Sallen key 麻省理工学院林肯实验室的R P Sallen and E L
  • Android Studio第一次安装虚拟机时报错Emulator:ERROR: Unknown AVD name[ ], use -list-avds to see valid list.

    安装完虚拟机后点击启动报错 虚拟化已开启 解决办法 1 修改环境变量ANDROID SDK HOME路径指到platforms路径下 例如 D androidSDK platforms 2 重启Android Studio 3 重新安装虚拟
  • 学习笔记:CentOS7安装Docker

    一 检查CentOS 系统的内核版本 Docker 要求 CentOS 系统的内核版本高于 3 10 通过 uname r 命令查看当前的内核版本 二 检查并清除系统残余项 并安装Docker依赖环境 1 卸载Docker 可选 如果之前安
  • 百度新闻资讯类信息爬虫--统计一年内关键词新闻的条数

    背景 通过百度词条搜索 来查找300个关键词 在一年内发布新闻的条数 最终效果实现如下 实现思路 实现思路依然是 先根据多页的url 来找到规律 构建起一页的url def format url url params dict None g
  • [转]信息安全相关理论题(三)

    21 静态分析是运行程序后进行调试 A 对 B 错 您的答案 标准答案 B 22 安卓反编译后会出现 符号字节码表示是匿名内部类 A 对 B 错 您的答案 标准答案 A 23 反编译安卓应用后 一般应该先查看哪一个smali文件的代码 A
  • JAVA反射机制及应用场景

    往往当我们面对一项新的知识时 我们往往需要知道三个方面 它是什么 它能做什么 它比原有知识强在哪里 我们该怎么使用它 当你能够解决这些问题时 便意味着你已经对这项知识入门了 一 是什么 Java Reflaction in Action有这
  • TOGAF9.2第I部分 第2章核心概念

    本章提供的核心概念适用TOGAF标准 2 1 什么是TOGAF标准 TOGAF标准是一个架构框架 它提供了协助接受 生产 使用和维护企业架构的方法和工具 它基于支持最佳实践和可重用的现有架构资产集的迭代过程模型 2 2 TOGAF标准中的架
  • 学习笔记——机器学习(第二章)

    机器学习 第二章 还有很多细节部分 我正在完善和补充 Emmm 若有不足 还请包涵 1 2 3 4 5 6 7 8 9 10 11 12 13 14
  • 致性哈希算法的优化----关于如何保正在环中增加新节点时,命中率不受影响

    背景 09年初 我们做了一个memcached的智能客户端库 业务只要将这个库链上 就能跟memcached服务器通信 并且实现了一致性哈希的分布式算法 后端memcached服务器可以无限制扩展 而且客户端能对memcached做自动故障