Predis 分片(一致哈希)
Posted
技术标签:
【中文标题】Predis 分片(一致哈希)【英文标题】:Predis sharding (consistent hashing) 【发布时间】:2011-01-09 12:34:30 【问题描述】:Predis 声称拥有客户端分片(支持一致的键散列)。 http://github.com/nrk/predis
我可以使用连接到一组配置文件(节点)进行分片,但它不是一致的散列。当我将另一个节点添加到池中时,找不到某些键。有人有这方面的经验吗?
使用 php 5.2(和 redis 的 php 5.2 版本)。
【问题讨论】:
【参考方案1】:Redis 官方网站说“Redis 通过一致性哈希支持客户端分片。目前不支持容错,也不支持在运行时添加或删除集群。”
据我目前的理解,这种共享是不能容错的,存储在故障节点上的所有密钥都将丢失。同样,如果您添加一个新节点,现在将丢失部分密钥空间(因为密钥将存储在错误的节点上)。通常在一致的散列系统中,当一个新节点加入时,它会复制现在从其邻居映射到它的所有键。 Redis 服务器不支持这样做。
因此,如果您使用 Redis 作为缓存,则一致性哈希可以正常工作,实际数据存储在 Redis 后面,但目前不要指望您的数据不会丢失。
更新:可以通过称为ketama 的一致哈希库实现真正的分片。
【讨论】:
【参考方案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。
【讨论】:
以上是关于Predis 分片(一致哈希)的主要内容,如果未能解决你的问题,请参考以下文章