问题标签 [consistent-hashing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
architecture - 如何在服务器间均衡分配(牌桌)荷官?
我目前正在开发一款类似于二十一点的在线纸牌游戏,它将由一系列桌子组成,每张桌子都有一个“经销商”和多个人类玩家。庄家(计算机机器人)负责发牌和洗牌。这些表将存储在 PostgreSQL 数据库表中,并且人类管理员可以添加/删除/编辑表。
游戏将包含一个 Web 前端和一个 REST/websocket API 后端。我可能会使用 Kubernetes 和 Nginx 作为后端服务器的负载均衡器。
到我的问题上。假设我有一个服务器,我可以简单地让它从数据库中读取表列表并为每个表启动一个经销商进程/线程。但是,如果我有 2 台或更多服务器,事情就会变得更加混乱。
如何确保在所有服务器上以平衡的方式分配表(例如,如果有 10 个表和 3 个服务器,则分布应大致为 3-3-4)?
如何确保如果服务器出现故障,其表会重新分配给实时服务器?
我如何确保当新服务器上线时,一些现有的表被重新分配给它,以减少其他服务器的工作量?
load-balancing - 在扩展系统时,具有一致散列的负载分布是否比标准散列更有优势?
我知道,在缓存服务器或(分片)数据库服务器的情况下,使用一致的散列进行负载分配比通常的基于键的散列提供了显着优势,因为在添加/删除服务器时,由于重新散列而需要在服务器之间移动的数据被最小化.
但是,如果我们考虑应用程序服务器或 Web 服务器,它们通常被设计为无状态的,因此不存储任何与用户/会话相关的数据,那么一致性哈希在这里有什么优势吗?如果是,这里考虑的数据是什么,或者我遗漏了什么?
load-balancing - 当循环可以均匀分配流量时,为什么我们需要一致的哈希
当负载均衡器可以使用循环算法将传入的请求平均分配到节点时,为什么我们需要使用一致性哈希来分配负载?使用一致哈希和 RR 分配负载的最佳方案是什么?
django - 如何使用 redis 数据库在 django 中实现一致性哈希?
我想用 redis 作为我的缓存数据库在 django 中实现一致的散列。首先,我尝试利用 uhashing( https://pypi.org/project/uhashring/ ) 包来实现与 redis 的一致哈希,但我无法提供 django 和包之间的链接。我做的第二件事是在 django 本身中搜索使用一致散列配置 Redis,但我找不到任何相关内容。我只能找到使用 memcached 配置 redis。
有什么办法可以解决我的问题。任何小提示也会有所帮助,谢谢。
amazon-web-services - 动态地将分片添加到 DynamoDB 并重新映射旧数据
我知道 dynamoDB 支持分片。我想知道是否可以动态添加分片。假设我提供了 4 个分片,而 shardkey 将是 customerID。
- 现在将来我想再提供6个分片,可以添加吗?
- 假设如果我们可以再添加 6 个分片,旧数据将如何重新映射到新分片,可用性或一致性会受到影响吗?
对于重新映射,我的猜测是他们必须使用一致的哈希。
nginx - 多个上游的 Nginx 一致性哈希
上游服务器是 wowza。有两个上游
第一个上游指向 API,第二个指向缩略图 URI。
我将 hashKey 更改为查询参数,认为哈希将基于查询参数,并且它将为两个上游解析到同一服务器,但事实并非如此。
在某些情况下,第二个上游解析到不同的服务器,我认为这是由于端口的变化。
有没有办法使两个上游的一致哈希一致?
任何帮助,将不胜感激。
java - 在一致哈希中排除特定输入的特定节点?
如果我的输入密钥散列到圆圈之间的任何地方,machine1
并且machine2
我们的算法顺时针方向,那么我们知道machine2
将被返回。
如果我想避免怎么machine2
办myInput
?比如说,myInput
是一个帐户 ID,它已在machine2
. 有没有办法指定额外的信息并machine0
取而代之,即
我对算法解释和任何现有的实现/库(首选 Java)都感兴趣,如果它们存在的话。
(图片来源: http: //michaelnielsen.org/blog/consistent-hashing)
hash - 如何可靠地跨多个服务器分片数据
我目前正在阅读一些分布式系统设计模式。当您必须处理大量数据(数十亿个整体或多个 PB 字节)时,其中一种设计模式是将其分散到多个服务器或存储单元中。
解决方案之一是使用一致哈希。这应该会导致散列中的所有服务器均匀分布。
这个概念相当简单:我们可以只添加新服务器,并且只有范围内的服务器会受到影响,如果您丢失服务器,一致性哈希中的剩余服务器将接管。这是哈希中的所有服务器都具有相同数据(在内存、磁盘或数据库中)的情况。
我的问题是我们如何处理从一致的哈希中添加和删除服务器,其中有太多的数据无法存储在单个主机上。他们如何确定要存储哪些数据以及不存储哪些数据?
例子:
假设我们有 2 台机器正在运行,“0”和“1”。它们开始达到最大容量的 60%,因此我们决定增加一台机器“2”。现在机器 0 上的大部分数据必须迁移到机器 2。我们将如何实现自动化,以便在不停机且可靠的情况下实现这一点。
我自己建议的方法将是具有一致哈希的服务和机器将知道如何在彼此之间传输数据。添加新机器时,一致性哈希服务是否会计算受影响的哈希范围。然后通知受影响的机器受影响的哈希范围,并且他们需要将受影响的数据传输到机器 2。一旦受影响的机器完成数据传输,他们将 ACK 回一致的哈希服务。一旦所有受影响的服务完成传输数据,一致性哈希服务将开始向机器 2 发送数据,并通知受影响的机器他们现在可以删除传输的数据。如果我们在每台服务器上都有 peta 字节,这个过程可能需要很长时间。我们在那里需要跟踪在传输过程中发生了哪些变化,这样我们就可以确保在之后同步它们,
我的方法会奏效,但我觉得来来回回有点冒险,所以我想听听是否有更好的方法。
events - 如何为Kafka主题添加分区并将同键消息保存在同一个分区中?
通常需要在给定 Kafka 主题的同一分区中进行排序。也就是说,具有相同键的消息应该去同一个分区。现在,如果我想在正在运行的主题中添加新分区,如何制作并保持一致性?
据我了解,默认的分区策略是修改 num-of-partition 。当分区数发生变化时(例如从 4 到 5),一些消息可能会落入与先前具有相同键的消息不同的分区。
我可以想象实现一致的散列来自定义分区行为,但这可能是侵入性的。
或者,只是停止所有生产者,直到所有消息都被消耗完;然后部署新分区并重新启动所有生产者。
有更好的想法吗?
nginx - 基于 TCP 有效负载的动态服务器集的一致散列
我有一个场景,我需要通过像 HAProxy 或 nginx 这样的代理将 TCP 流量路由到一组动态的后端服务器(确切地说是 Kubernetes pod,但出于本文的目的,我们可以忽略它)。流量需要根据客户端在 TCP 有效负载中提供的密钥(称为routing_key )进行路由。
我看到 nginx 和 HAProxy 都支持一致的哈希。但是,根据我根据 HAProxy 的手册(参见“平衡”部分)可以看出,没有办法基于 TCP 有效负载执行一致的散列。基于负载的负载平衡似乎仅限于 L7 HTTP 参数,如 Header 和 URI 参数。这篇文章概述了一种基于与 TCP 有效负载匹配的字符串进行静态平衡的方法,但我的情况更加动态,因此更倾向于使用真正一致的散列方法。
Nginx 似乎提供了更多的灵活性,您可以将散列值设置为任意变量,如此处所示。这似乎适用于 L7(“后端”节)和 L4(“流”节)。但是,我对你是什么以及不允许对变量做什么有点模糊。有没有人有将变量设置为从 TCP 有效负载中提取的值并将其用于一致散列的示例?
最后的奖励问题:routing_key值实际上是一个 AES-GCM 加密值。代理服务器将有权访问用于解密此值的密钥。是否可以让 nginx 从 TCP 有效负载中获取路由密钥值,使用已知密钥对其进行解密,然后将其用于一致的散列?这会涉及创建一个 nginscript 模块吗?