redis集群之Codis( 三 )


何管理的呢?Codis 将所有的 key 默认划分为 1024 个槽位(slot) , 它首先对客户端传过来的 key 进行 crc32 运算计算哈希值 , 再将 hash 后的整数值对 1024 这个整数进行取模得到一个余数 , 这个余数就是对应 key 的槽位 。

每个槽位都会唯一映射到后面的多个 Redis 实例之一 , Codis 会在内存维护槽位和Redis 实例的映射关系 。 这样有了上面 key 对应的槽位 , 那么它应该转发到哪个 Redis 实例

就很明确了 。
hash = crc32(command.key)
slot_index = hash % 1024
redis = slots[slot_index
.redis
redis.do(command)
槽位数量默认是 1024 , 它是可以配置的 , 如果集群节点比较多 , 建议将这个数值配置大
一些 , 比如 2048、4096 。
不同的 Codis 实例之间槽位关系如何同步?
  如果 Codis 的槽位映射关系只存储在内存里 , 那么不同的 Codis 实例之间的槽位关系就无法得到同步 。 所以 Codis 还需要一个分布式配置存储数据库专门用来持久化槽位关系 。

Codis 开始使用 ZooKeeper , 后来连 etcd 也一块支持了 。

推荐阅读