Hash 如何跨多台服务器可靠地共享数据

Hash 如何跨多台服务器可靠地共享数据,hash,distributed-computing,scalability,consistent-hashing,Hash,Distributed Computing,Scalability,Consistent Hashing,我目前正在阅读一些分布式系统设计模式。当您必须处理大量数据(数十亿个entires或多个PB)时,其中一种设计模式是将数据分布到多个服务器或存储单元 解决方案之一是使用一致的散列。这将导致散列中的所有服务器均匀分布 这个概念相当简单:我们可以只添加新服务器,只有范围内的服务器会受到影响,如果您丢失了服务器,则一致哈希中的其余服务器将接管。这是指哈希中的所有服务器都具有相同的数据(内存、磁盘或数据库中) 我的问题是,如果有太多数据无法存储在单个主机上,我们如何处理从一致散列中添加和删除服务器的问题

我目前正在阅读一些分布式系统设计模式。当您必须处理大量数据(数十亿个entires或多个PB)时,其中一种设计模式是将数据分布到多个服务器或存储单元

解决方案之一是使用一致的散列。这将导致散列中的所有服务器均匀分布

这个概念相当简单:我们可以只添加新服务器,只有范围内的服务器会受到影响,如果您丢失了服务器,则一致哈希中的其余服务器将接管。这是指哈希中的所有服务器都具有相同的数据(内存、磁盘或数据库中)

我的问题是,如果有太多数据无法存储在单个主机上,我们如何处理从一致散列中添加和删除服务器的问题。他们如何确定要存储哪些数据,哪些不太需要

例如:

假设我们有两台机器在运行,“0”和“1”。它们开始达到最大容量的60%,因此我们决定增加一台机器“2”。现在,计算机0上的大部分数据必须迁移到计算机2。 我们将如何实现自动化,以便在不停机且可靠的情况下实现这一点

我自己建议的方法是,使用一致散列的服务和机器应该知道如何在彼此之间传输数据。添加新机器时,一致性哈希服务将计算受影响的哈希范围。然后通知影响机器 受影响的哈希范围,并且需要将受影响的数据传输到计算机2。一旦受影响的计算机完成了数据传输,它们就会返回到一致散列服务。一旦所有受影响的服务完成数据传输,一致性哈希服务将开始向机器2发送数据,并通知受影响的机器,它们现在可以删除传输的数据。如果我们在每台服务器上都有PB字节,那么这个过程可能需要很长时间。我们需要跟踪哪些实体在传输过程中发生了更改,以便确保在传输后同步这些更改,或者我们可以在传输过程中向计算机0和2提交写入/更新


我的方法是可行的,但我觉得来回都有点冒险,所以我想听听是否有更好的方法。

我们如何实现自动化,使其在不停机的情况下可靠地实现?

这取决于用于存储数据的技术,但例如在卡桑德拉(Cassandra)
中,没有“中心”实体来管理该过程,而且几乎与其他任何东西一样;通过节点之间的闲聊。当新节点加入集群时,不会出现停机(不过性能可能会受到轻微影响)

程序如下:

The new node joining the cluster is defined as an empty node without system tables or data.

When a new node joins the cluster using the auto bootstrap feature, it will perform the following operations

- Contact the seed nodes to learn about gossip state.
- Transition to Up and Joining state (to indicate it is joining the cluster; represented by UJ in the nodetool status).
- Contact the seed nodes to ensure schema agreement.
- Calculate the tokens that it will become responsible for.
- Stream replica data associated with the tokens it is responsible for from the former owners.
- Transition to Up and Normal state once streaming is complete (to indicate it is now part of the cluster; represented by UN in the nodetool status).
取自

因此,当加入节点处于加入状态时,它正在接收来自其他节点的数据,但在过程完成之前(启动状态)尚未准备好读取

DataStax对此也有一些资料