【问题标题】:Predis sharding (consistent hashing)Predis 分片(一致哈希)
【发布时间】:2011-01-09 12:34:30
【问题描述】:

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

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

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

【问题讨论】:

    标签: redis sharding predis


    【解决方案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。

      【讨论】:

        猜你喜欢
        • 2017-04-01
        • 2013-02-16
        • 2017-04-01
        • 2011-05-27
        • 1970-01-01
        • 2013-08-10
        • 1970-01-01
        • 1970-01-01
        • 2010-12-19
        相关资源
        最近更新 更多