- codis是选用了一系列已证明靠谱的方案来构建(如zk选主/存放元数据;采用无状态proxy,而不是smart client等)
- 为方便运维提供了一系列工具/接口
- 再加上公司内部的一定规模应用
所以大家用它更多。
链接:https://www.zhihu.com/question/30857837/answer/169207128
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
![](https://i-blog.csdnimg.cn/blog_migrate/52690ec7c90e04bcb91fb2b35aa224e9.png)
redis cluster的原理,是基于分片。一个 Redis cluster集群包含 16384 个哈希槽, 任意一个key都可以通过 CRC16(key) % 16384 这个公式计算出应当属于哪个槽。每个槽应当落在哪个节点上,也是事先定好。这样,进行任一操作时,首先会根据key计算出对应的节点,然后操作相应的节点就可以了。
所以说,其实cluster跟单点相比,只是多了一个给key计算sharding值的过程,并没有增加多少复杂度,个人认为完全可以放心使用。像增删节点、重启这些对redis本身的操作,和client端对数据的操作,是两套流程,可以做到互不干扰。关于节点故障,一是有slave,二是即便这一个节点完全挂掉,也只是落在这个节点上的数据不可用,不会有类似“雪崩”这样的问题影响整个集群。数据的恢复之类的逻辑,也与单点完全一致,是独立于集群其他部分的。
redis cluster的整个设计是比较简单的,并没有引入太多新问题,大部分操作都可以按照单点的操作流程进行操作。至于cluster最终的易用性,其实很大程度上取决client端的代码可靠性,而jedis现在的代码也已经很完善了,用起来也比较方便。
关于运维,可以看一下搜狐的cacheCloud, 对cluster的管理现在也比较完善了。
所以,个人觉得,目前cluster完全可以取代codis,tweemproxy在生产环境使用。
codis中的各个组件:
1. 先看 ServerGroup 和 Slot。
一个 Proxy 可以对应多个 ServerGroup;
ServerGroup 是一组 Codis Server,一个 ServerGroup 只有一个 Master(Codis Server),而且虽然有多个 Codis Server,Proxy 只访问 ServerGroup 中的 Master,Slave 可用作故障切换;
Slot 是一个逻辑概念,一共 1024 个,使用 crc32(key) % 1024 计算 Slot id,而且一个(或多个) Slot 属于一个 ServerGroup,1024 个 Slot 一起分用多个 ServerGroup 资源;
当 Slot 所在 ServerGroup 内存不够的时候可以把此 Slot 迁移到另一个内存使用少的 ServerGroup,实现扩容的目的,而当所有 ServerGroup 内存不够的时候增加新的 ServerGroup 即可。
ServerGroup 数据结构:
Slot 数据结构: