我目前正在阅读一些分布式系统设计模式。当您必须处理大量数据(数十亿个整体或多个 PB 字节)时,其中一种设计模式是将其分散到多个服务器或存储单元中。
解决方案之一是使用一致哈希。这应该会导致散列中的所有服务器均匀分布。
这个概念相当简单:我们可以只添加新服务器,并且只有范围内的服务器会受到影响,如果您丢失服务器,一致性哈希中的剩余服务器将接管。这是哈希中的所有服务器都具有相同数据(在内存、磁盘或数据库中)的情况。
我的问题是我们如何处理从一致的哈希中添加和删除服务器,其中有太多的数据无法存储在单个主机上。他们如何确定要存储哪些数据以及不存储哪些数据?
例子:
假设我们有 2 台机器正在运行,“0”和“1”。它们开始达到最大容量的 60%,因此我们决定增加一台机器“2”。现在机器 0 上的大部分数据必须迁移到机器 2。我们将如何实现自动化,以便在不停机且可靠的情况下实现这一点。
我自己建议的方法将是具有一致哈希的服务和机器将知道如何在彼此之间传输数据。添加新机器时,一致性哈希服务是否会计算受影响的哈希范围。然后通知受影响的机器受影响的哈希范围,并且他们需要将受影响的数据传输到机器 2。一旦受影响的机器完成数据传输,他们将 ACK 回一致的哈希服务。一旦所有受影响的服务完成传输数据,一致性哈希服务将开始向机器 2 发送数据,并通知受影响的机器他们现在可以删除传输的数据。如果我们在每台服务器上都有 peta 字节,这个过程可能需要很长时间。我们在那里需要跟踪在传输过程中发生了哪些变化,这样我们就可以确保在之后同步它们,
我的方法会奏效,但我觉得来来回回有点冒险,所以我想听听是否有更好的方法。