Predis 声称拥有客户端分片(支持一致的键散列)。http://github.com/nrk/predis
我可以使用连接到一组配置文件(节点)进行分片,但它不是一致的散列。当我将另一个节点添加到池中时,找不到某些键。有人有这方面的经验吗?
使用 php 5.2(和 redis 的 php 5.2 版本)。
Predis 声称拥有客户端分片(支持一致的键散列)。http://github.com/nrk/predis
我可以使用连接到一组配置文件(节点)进行分片,但它不是一致的散列。当我将另一个节点添加到池中时,找不到某些键。有人有这方面的经验吗?
使用 php 5.2(和 redis 的 php 5.2 版本)。
Redis 官方网站称“Redis 通过一致性哈希支持客户端分片。目前不支持容错,也不支持在运行时添加或删除集群。”
据我目前了解,这种共享不是容错的,存储在故障节点上的所有密钥都将丢失。同样,如果您添加一个新节点,现在将丢失部分密钥空间(因为密钥将存储在错误的节点上)。通常在一致的散列系统中,当一个新节点加入时,它会复制现在从其邻居映射到它的所有键。Redis 服务器不支持执行此操作。
因此,如果您使用 Redis 作为缓存,则一致的散列可以正常工作,实际数据存储在 Redis 后面,但目前不要期望您的数据不会丢失。
更新:可以通过一个名为ketama的一致哈希库来实现真正的分片。
解决方案是使用虚拟分片。我不知道 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。