Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Redis 预失真分片(一致散列)_Redis_Sharding_Predis - Fatal编程技术网

Redis 预失真分片(一致散列)

Redis 预失真分片(一致散列),redis,sharding,predis,Redis,Sharding,Predis,Predis声称拥有客户端分片(支持密钥的一致散列) 我可以使用连接到一组配置文件(节点)进行切分,但它不是一致的散列。当我向池中添加另一个节点时,无法找到某些键。有人有这方面的经验吗 使用PHP5.2(以及redis的PHP5.2版本)。redis官方网站称“redis支持通过一致散列进行客户端分片。目前不支持容错,也不支持在运行时添加或删除集群。” 据我目前所知,这种共享不是容错的,存储在故障节点上的所有密钥都将丢失。同样,如果添加新节点,部分密钥空间现在将丢失(因为密钥将存储在错误的节点上

Predis声称拥有客户端分片(支持密钥的一致散列)

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


使用PHP5.2(以及redis的PHP5.2版本)。

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

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

因此,如果您使用Redis作为缓存,一致性散列可以很好地工作,其中实际数据存储在Redis后面,但目前不要期望您的数据不会丢失


更新:可以通过一个名为的一致散列库实现真正的分片。

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

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

因此,如果您使用Redis作为缓存,一致性散列可以很好地工作,其中实际数据存储在Redis后面,但目前不要期望您的数据不会丢失


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

解决方案是使用虚拟分片。我不知道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框架是否有效,但我预测它使用某种数组——您可能会在启动时将每个碎片的信息填入其中

假设最多有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