Codis架构与实现-个人学习总结

本博客主要用于个人学习总结,主要内容借助网络及作者的博客。

1、Codis是什么?

Codis是豌豆荚开源的基于redis的集群解决方案,redis引擎在2.8的基础上增加了slot的功能,采用proxy进行数据路由,用zk保存proxy节点信息和基于slot的路由信息。config server接收并处理集群的控制命令,部分服务采用go语言开发。

2、架构图


Codis架构与实现-个人学习总结_第1张图片

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、总结

分布式和存储引擎分离,控制流和数据流分离。

你可能感兴趣的:(Codis架构与实现-个人学习总结)