Codis 集群
-
Codis 集群的架构和关键组件图
-
codis server
- 进行了二次开发的 Redis 实例,其中增加了额外的数据结构,支持数据迁移操作,主要负责处理具体的数据读写请求
-
codis proxy
- 接收客户端请求,并把请求转发给 codis server
-
Zookeeper 集群
-
保存集群元数据,例如数据位置信息和 codis proxy 信息
-
也可以换用 etcd 或本地文件系统保存元数据信息
- etcd 是一个分布式键值对存储
-
-
codis dashboard 和 codis fe
- 共同组成集群管理工具
- codis dashboard 负责执行集群管理工作,包括增删 codis server、codis proxy 和进行数据迁移
- codis fe 负责提供 dashboard 的 Web 操作界面,便于进行集群管理
Codis 处理请求
-
- 先使用 codis dashboard 设置 codis server 和 codis proxy 的访问地址
-
- 客户端直接和 proxy 建立连接,不用修改客户端,和访问单实例 Redis 没区别
-
- proxy 接收到请求,查询请求数据和 codis server 的映射关系,转给相应的 server 处理,最后通过 proxy 把数据返回给客户端
- 处理流程图
Codis 关键技术原理
集群里的数据分布
-
-
-
集群一共有 1024 个 Slot,编号依次是 0 到 1023
- 可以手动,也可以通过 codis dashboard 进行自动分配
-
-
-
客户端要读写数据时,使用 CRC32 算法计算数据 key 的哈希值,把哈希值对 1024 取模得到对应 Slot 的编号
- CRC32(key) % 1024 = n
-
-
- 即可知道数据保存在哪个 server 上
数据路由表
- 指 Slot 和 codis server 的映射关系
- 在 codis dashboard 分配好路由表后会把路由表发送给 codis proxy,同时也会保存在 Zookeeper 中,codis proxy 会把路由表缓存在本地
- 路由表的分配和使用过程
集群扩容和数据迁移
-
增加 codis server
-
- 启动新的 codis server,将它加入集群
-
-
把部分数据迁移到新的 server
-
Codis 集群按照 Slot 的粒度进行数据迁移
-
- 在源 server 上,Codis 从要迁移的 Slot 中随机选择一个数据,发送给目的 server
-
- 目的 server 确认收到数据后,会给源 server 返回确认消息。这时,源 server 会在本地将刚才迁移的数据删除
-
- 第一步和第二步就是单个数据的迁移过程。Codis 会不断重复这个迁移过程,直到要迁移的 Slot 中的数据全部迁移完成
-
支持两种迁移模式
-
同步迁移
- 阻塞,此时源 server 无法处理新的请求操作
-
异步迁移
-
非阻塞,迁移的数据会被设置为只读,不会出现数据不一致的问题
-
对于 bigkey,采用拆分指令的方式进行迁移:对 bigkey 的每个元素,用一条指令进行迁移
- 会给目的 server 上被迁移中的 bigkey 设置临时过期时间,如果迁移过程发生故障,不会影响迁移的原子性,完成迁移后删除设置的临时过期时间
-
可以通过异步迁移命令 SLOTSMGRTTAGSLOT-ASYNC 的参数 numkeys 设置每次迁移的 key 数量
-
-
-
-
增加 codis proxy
-
-
- 启动新的 proxy
-
- 通过 codis dashboard 把 proxy 加入集群即可
-
Codis 集群可靠性
-
codis server
- 给每个 server 配置从库,并使用哨兵机制进行监控
- 此时每个 server 成为一个 server group,都是一主多从
- server group 的 Codis 集群架构图
-
codis proxy
- 和 Zookeeper 搭配使用
- 有超过半数的 Zookeeper 实例可以正常工作,Zookeeper 集群就可以提供服务
- proxy 故障只需重启,然后通过 codis dashboard 从 Zookeeper 集群获取路由表即可恢复服务
切片集群方案选择建议
- Codis 和 Redis Cluster 的区别
-
-
- 从稳定性和成熟度,选 Codis
-
- 从业务应用客户端兼容性,选 Codis
-
- 从数据迁移性能纬度看,选 Codis
-
-
从使用 Redis 新命令和新特性,选 Redis Cluster
- Codis server 是基于开源的 Redis 3.2.8 开发的,已经不再维护
-
-