1

Predis 声称拥有客户端分片(支持一致的键散列)。http://github.com/nrk/predis

我可以使用连接到一组配置文件(节点)进行分片,但它不是一致的散列。当我将另一个节点添加到池中时,找不到某些键。有人有这方面的经验吗?

使用 php 5.2(和 redis 的 php 5.2 版本)。

4

2 回答 2

7

Redis 官方网站称“Redis 通过一致性哈希支持客户端分片。目前不支持容错,也不支持在运行时添加或删除集群。”

据我目前了解,这种共享不是容错的,存储在故障节点上的所有密钥都将丢失。同样,如果您添加一个新节点,现在将丢失部分密钥空间(因为密钥将存储在错误的节点上)。通常在一致的散列系统中,当一个新节点加入时,它会复制现在从其邻居映射到它的所有键。Redis 服务器不支持执行此操作。

因此,如果您使用 Redis 作为缓存,则一致的散列可以正常工作,实际数据存储在 Redis 后面,但目前不要期望您的数据不会丢失。

更新:可以通过一个名为ketama的一致哈希库来实现真正的分片。

于 2010-03-30T18:33:16.560 回答
2

解决方案是使用虚拟分片。我不知道 Predis 框架是否有效,但我预测它使用某种数组 - 您可能会在启动时用每个分片的信息填充它。

假设您将拥有最多 10 个分片(这个数字应该不太可能达到)。然后,创建仅指向 3 个真实服务器的分片阵列。将来当您添加新节点时,您会将相关数据迁移到新的分片并更改映射。这种方法保留了形式变化的散列函数。

初始映射:

0 => 0 //node #0
1 => 0
2 => 0
3 => 1 //node #1
4 => 1
5 => 1
6 => 2 //node #2
7 => 2
8 => 2
9 => 2

添加新节点时,您只需更改映射:

0 => 0
1 => 0
2 => 3 // new node #3
3 => 1
4 => 1
5 => 3 // new node #3
7 => 2
8 => 2
9 => 3 // new node #3

所以你必须将 h(x) = 9 或 5 或 2 的数据移动到节点 #3。

于 2011-05-26T16:08:13.283 回答