我不是在谈论分布式键/值系统,例如通常与 memcached 一起使用的系统,它使用一致的散列使添加/删除节点成为一个相对便宜的过程。
我在谈论你的标准内存哈希表,比如 python 的 dict 或 perl 的哈希。
通过降低调整哈希表大小的成本,使用一致哈希的好处似乎也适用于这些标准数据结构。实时系统(和其他对延迟敏感的系统)将受益于/需要针对低成本增长进行优化的哈希表,即使整体吞吐量略有下降。
维基百科暗指“增量调整大小”,但基本上谈论调整大小的热/冷替换方法;有一篇关于“可扩展散列”的单独文章,它使用树进行桶查找来完成廉价的重新散列。
只是好奇是否有人听说过使用一致散列来降低增长成本的核内单节点散列表。或者使用其他方法(ala上面列出的两个维基百科位)更好地满足这个要求?
或者……我的整个问题都被误导了吗?内存分页考虑是否使复杂性不值得?也就是说,一致性散列的额外间接性让您只对总键的一小部分进行重新散列,但这可能无关紧要,因为您可能必须从每个现有页面读取,因此内存延迟是您的主要因素,以及与内存访问的成本相比,您重新哈希部分或全部键并不重要....与您的键重新映射到任何现有页面相比,内存抖动更少。
编辑:添加了“数据结构”标签,澄清了最后一句说“页面”而不是“桶”。
这可能特定于我正在查看的实现(node-hashring),但是虚拟节点(vnode)和一致哈希环中的副本之间有什么区别?
最初的Akamai 论文似乎没有明确描述 vnode,并且各种其他来源似乎可以互换使用这两个术语(例如“虚拟节点”,它们是来自来源的循环中缓存点的副本)。
节点散列的文档给出了示例40 个散列(vnode)和每个散列 4 个副本 = 每个服务器 160 个点。尽管阅读了源代码,我还是不太清楚这两个不同参数的作用。
我想知道我是否走在正确的轨道上.我正在构建(实时)统计/分析服务,我使用redis来存储一些集合和哈希.
现在让我们假设我取得了一些成功,我需要扩展.哈希环技术看起来不错,但我的印象是它只适用于缓存场景.
如果节点发生故障怎么办?理论上,它的密钥现在由其他节点拥有.实际上,他们没有数据.它丢了,对吗?与添加/删除节点相同.
我错过了一些基本的东西吗?这可能是一个穷人的集群吗?
只是想知道为什么 Elasticsearch 仍然使用这种简单的路由值方法来决定数据必须存储到哪个分片。实际上这种方法限制了我们未来改变分片的数量。如果elasticsearch使用一致性哈希之类的方法(甚至更好的技术),它可以让我们有机会在未来更改分片数量。有人对此有解释或想法吗?
当负载均衡器可以使用循环算法将传入的请求平均分配给节点时,为什么我们需要使用一致性哈希来分配负载?使用一致散列和 RR 分配负载的最佳方案是什么?
我正在使用hash_ring包在服务器之间分配对象.我假设分布是统一的,因为它基于MD5哈希.不幸的是情况并非如此.
我正在使用使用生成的随机密钥uuid.uuid4().我已经证实,MD5本身实际上确实提供了均匀分布.然而,当我使用时hash_ring.HashRing,大多数和最少人口的桶之间存在20-30%的差异.
hash_ring通过调整一些设置可以改善分布的均匀性吗? 我用来测试分布均匀性的代码:
ring = hash_ring.HashRing(range(8))
for _ in range(10):
counters = [0]*8
for _ in range(100000):
counters[ring.get_node(str(uuid.uuid4()))] += 1
print counters
Run Code Online (Sandbox Code Playgroud)
打印出来的:
[11115, 11853, 14033, 11505, 13640, 12292, 12851, 12711]
[11164, 11833, 14024, 11562, 13365, 12302, 13002, 12748]
[11354, 11756, 14017, 11583, 13201, 12231, 13135, 12723]
[11182, 11672, 13936, 11441, 13563, 12240, 13129, 12837]
[11069, 11866, 14045, 11541, 13443, 12249, 12894, 12893]
[11196, 11791, 14158, 11533, 13517, 12319, 13039, …Run Code Online (Sandbox Code Playgroud) 我们在一个环中有 N 个具有基本一致性散列的缓存节点。
问题:
非常感谢。
我想在上传之前在浏览器端对文件进行校验和,然后在服务器端进行校验和比较,以确保一致性。但是,如何获取文件的纯二进制数据并对其进行校验和?我尝试了下面的方法,但是不起作用:
let fileSelect = document.getElementById('file')
let files = fileSelect.files
let file = files[0]
var r = new FileReader();
r.onload = function(){ console.log(r.result); };
r.readAsArrayBuffer(file);
var file_sha1 = sha1(r.result)
Run Code Online (Sandbox Code Playgroud) 我正在尝试找到一个解决方案,其中包含特定键值对的AKKA Actor实例作为实例数据.我需要的是能够通过使用它具有的键来定位实例数据来更新实例数据.一个Actor将有一个键,它是唯一的.我看到一致的hashing将能够路由到包含可能是一千个演员的特定节点,但是如何传递给特定的演员呢?
我需要在java中知道.