介绍
Redis丰富的数据结构、超高的性能和简单的协议,使其非常适合作为数据库的上游缓存层,不过受限于单点的内存容量,Codis是一个分布式redis解决方案
Redis
Codis/Redis协议
集群架构
codis采用一层无状态的proxy层,将分布式逻辑写在proxy上,底层的存储引擎还是Redis,数据的分布状态存储于zookeeper(etcd)中
读写分离
Redis本身的replication模型是主从异步复制,在master上写成功后,在slave上是否能读到这个数据是没有保证的,而让业务方处理一致性的问题还是蛮麻烦的。而且Redis单点的性能还是蛮高的,不像mysql之类的真正的数据库,没有必要为了提升一点点读QPS而让业务方困惑
数据迁移
codis-config 管理工具中, 每次迁移任务的最小单位是 slot
如: 将slot id 为 [0-511] 的slot的数据, 迁移到 server group 2上, –delay 参数表示每迁移一个 key 后 sleep 的毫秒数, 默认是 0, 用于限速.
$ ../bin/codis-config slot migrate 0 511 2 --delay=10
我们在 Codis/Redis 中添加了一些指令, 实现基于key的迁移, 如 SLOTSMGRT等 (命令列表), 每次会将特定 slot 一个随机的 key 发送给另外一个 codis redis 实例, 这个命令会确认对方已经接收, 同时删除本地的这个 k-v 键值, 返回这个 slot 的剩余 key 的数量, 整个操作是原子的.
codis将所有的数据预分配为1024个slot,迁移的过程典型的二阶段提交
1、在pre_migrate阶段,proxy如果收到这个slot的请求,会block住直到migrate状态了才开始处理.
2、在migrate阶段,如果新的处理该slot的proxy接收到了该slot的请求,首先会同步一份该slot的数据过来,再返回给客户端.