本博客主要用于个人学习总结,主要内容借助网络及作者的博客。
1、Codis是什么?
Codis是豌豆荚开源的基于redis的集群解决方案,redis引擎在2.8的基础上增加了slot的功能,采用proxy进行数据路由,用zk保存proxy节点信息和基于slot的路由信息。config server接收并处理集群的控制命令,部分服务采用go语言开发。
2、架构图
3、主要技术点
(1)存储和分布式逻辑分离 (2)用户数据基于slot做切分 (3)zk维护元数据 (4)config server处理控制面命令 (5)proxy做数据路由
4、负载均衡
数据被hash到1024个slot上,采用crc32(key) % 1024方法。
zk中保存相关的元数据。
proxy上缓存元数据信息,并依据该信息路由数据到后端的redis上。
扩缩容的时候slot会进行迁移,每次迁移会先通知proxy修改slot的状态。
5、动态扩容
(1)config-server首先向zk注册一个lock,发起迁移指令 pre_migrate slot_1 to group 2 给所有proxy
(2)config-server 标记slot_1的状态为 migrate, 将slot_1的服务指向group 2
(3)config-server不断向 group 1 发送migrate slot_1命令,每个命令将原子地迁移一个key
(4)迁移过程中收到属于这个slot的命令,将先迁移这个key到group 2,然后在group 2上处理命令。
(5)迁移完成标记slot_1状态为online,删除lock。
6、与社区集群解决方案比较
社区版:
(1)P2P模型,性能好。
(2)服务少,省虚机,成本低。
(3)很多功能集成到redis里,实现复杂。
(4)依赖smart client,现有服务升级困难。
Codis版:
(1)服务节点多,有性能和成本的问题。
(2)分布式和存储引擎分离,架构清晰。
(3)不需要smart client,升级容易。
(4)故障处理需要人工介入。
(5)迁移过程中数据访问需要与控制命令协调处理,没有很好的解耦控制和数据。
7、总结
分布式和存储引擎分离,控制流和数据流分离。