Predis分片(一致散列)

时间:2010-01-26 13:30:06

标签: redis sharding predis

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

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

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

2 个答案:

答案 0 :(得分:7)

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

据我所知,此类共享不具备容错能力,存储在故障节点上的所有密钥都将丢失。同样,如果添加新节点,密钥空间的某些部分现在将丢失(因为密钥将存储在错误的节点上)。通常在一致的哈希系统中,当新节点加入时,它会复制现在从其邻居映射到它的所有键。 Redis服务器不支持这样做。

因此,如果您使用Redis作为缓存,一致的哈希工作正常,其中实际数据存储在Redis后面,但目前不要指望您的数据不会丢失。

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

答案 1 :(得分: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。