Codis vs redis 集群

我们将跳过表面的功能列表,直接进入源码和架构的核心深水区。

Slots 分布

Codis 和 Redis Cluster 最本质的区别在于元数据(Slots 分布)的管理方式。这决定了它们在源码层面的差异。

Codis:Centralized) Codis 中,有一个中心管理节点——ZooKeeper。 Codis 的源码(主要是 Go 语言编写的 codis-proxycodis-dashboard),Topom(Topology Manager)是核心结构。Dashboard 负责把 Slot 的映射关系写入 ZK。 codis-proxy 启动时,会通过 Watch 机制监听 ZK 的变化。这意味着 Proxy 本身是“无状态”的,它的内存里缓存了一份从 ZK 拉取下来的路由表(Slots Map)。

Redis Cluster:邻里八卦(Gossip / P2P) Redis Cluster 没有上帝,只有邻居。 在 Redis 源码 cluster.c 中,核心是 Gossip 协议。每个节点都维护了一个 clusterNode 结构体,里面包含了一个巨大的 Bitmap(myself->slots),标记自己负责哪些 Slot(总共 16384 个)。


2. I/O 路径与“聪明”的代价

Codis:把复杂留给自己(Proxy-based) Codis 的设计哲学是“对客户端透明”。 在 codis-proxy 的源码中,使用了大量的 Go Channel 和 Goroutine 来处理并发。

Redis Cluster:把麻烦甩给客户端(Smart Client) Redis Cluster 的 Server 端代码极其“傲慢”。 当一个请求发给 Redis 节点,节点在 processCommand 中会检查 key 所在的 Slot 是否由自己负责。如果不是?


3. 数据迁移:最精彩的博弈

这是两者差异最巨大的地方,也是运维最头疼的环节。

Codis:侵入式修改(codis-server) 你可能不知道,Codis 的后端 Redis 并不是官方 Redis,而是被修改过的 codis-server。 Codis 团队在 Redis 源码中硬塞了一组自定义命令,最核心的是 SLOTSMGRTTAGSLOT

Redis Cluster:原生状态机(MIGRATE) Redis Cluster 的迁移完全依赖原生的 MIGRATE 命令和两个特殊状态:IMPORTINGMIGRATING


4. 2022 年的运维现实:时代的眼泪

如果将时间定格在 2022 年,这场战争的胜负已定。

Codis 的致命伤:版本停滞

Redis Cluster 的胜利:标准化

总结

在源码级别,Codis 是一个精密的路由器,配合了一群被“改造过”的 Redis 节点,依靠 ZK 这个大脑指挥;而 Redis Cluster 是一群高智商的个体,通过八卦协议自组织,依靠客户端的配合来完成工作。

我的极简 emacs 配置
Redis 源代码学习