使用redis处理大量数据,一定会用到集群,一般有三种实现方式:
- 官方clusters:无中心化设计,不好升级,缺乏最佳实践。
- proxy分片:Codis是代表,通过Proxy节点对redis的访问进行路由。扩容容易,性能有开销。
- 客户端分片:实现简单,没有额外开销,扩容和缩容需要手动调整分片规则,运维复杂。比如:Redis-rb 和 Predis。
谈谈codis的实现。
怎样分片?
Pre-Sharding,hash算法是crc32(key)%1024。为每个redis-group提供slots和redis的映射关系,这些信息保存在zk中(Proxy没有状态)。这样hash路由只和slots有关,这样扩容无需rehash,只需部分slots迁移,然后更新slots 和redis-group的映射关系。
slots迁移
Codis支持的MGET/MSET无法保证原本单点时的原子语义的原因?
image.png
感谢:
Proxy-Style Redis集群设计
Codis作者黄东旭:细说分布式Redis架构设计和那些踩过的坑
Redis技巧:分片技术和Hash Tag
网友评论