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 分片(一致哈希)的主要内容,如果未能解决你的问题,请参考以下文章

安装redis 客户端predis

Predis \ Connection \ ConnectionException

lumen 下安装predis及使用

redis cluster php 客户端 predis

laravel5.4安装predis

我在 Laravel 5.2 中收到错误“找不到类 'Predis\Client'”