什么是 Codis
- 一个分布式 Redis 解决方案,多个 Redis 节点构成的集群
- 上层应用可以像使用单机的 Redis 一样使用,Codis 底层会处理请求的转发,不停机的数据迁移等工作
- Redis 实例的 CPU 计算能力汇集到一起,从而完成关于大数据和高并发量的的读写操作
组成部分
- Codis Proxy (codis-proxy),处理客户端请求,支持 Redis 协议,因此客户端访问 Codis Proxy 跟访问原生 Redis 没有什么区别;
- Codis Dashboard (codis-config),Codis 的管理工具,支持添加 / 删除 Redis 节点、添加 / 删除 Proxy 节点,发起数据迁移等操作。codis-config 本身还自带了一个 http server,会启动一个 dashboard,用户可以直接在浏览器上观察 Codis 集群的运行状态;
- Codis Redis (codis-server),Codis 项目维护的一个 Redis 分支,基于 2.8.21 开发,加入了 slot 的支持和原子的数据迁移指令;
- ZooKeeper/Etcd,Codis 依赖 ZooKeeper 来存放数据路由表和 codis-proxy 节点的元信息,codis-config 发起的命令都会通过 ZooKeeper 同步到各个存活的 codis-proxy;
- codis-ha,通过 codis 开放的 api 实现自动切换主从的工具。该工具会在检测到 master 挂掉的时候将其下线并选择其中一个 slave 提升为 master 继续提供服务
有赞 Codis 架构
生产环境部署:
- 1024 个 slot,落到 64 个 group,每台服务器包含 8 个 group
- 一个 codis 集群 = 8 台物理机 = 8 台物理机 (每台:8 个 group)= 64 个 group (每个 group:16 个 slot) = 1024 个 slot
分片
- Codis 会把所有的 key 分成 1024 个槽,这 1024 个槽对应着的就是 Redis 的集群,这个在 Codis 中是会在内存中维护着这 1024 个槽与 Redis 实例的映射关系。这个槽是可以配置,可以设置成 2048 或者是 4096 个
- key 的分配算法,先是把 key 进行 CRC32 后,得到一个 32 位的数字,然后再 hash%1024 后得到一个余数,这个值就是这个 key 对应着的槽,这槽后面对应着的就是 redis 的实例
//Codis 中 Key 的算法
hash = crc32(command.key)
slot_index = hash % 1024
redis = slots[slot_index].redis
redis.do(command)