分布式数据库方案。
127.0.0.1:7000> CLUSTER MEET 127.0.0.1 7001
如上将节点 7001 加入到集群中。
集群的整个数据库被分为 16384 个槽,每个节点负责一部分槽,每个节点最多负责 16384 个槽,最少 0 个。
所有槽都至少由一个节点负责。
127.0.0.1:7000> CLUSTER ADDSLOTS 0-5461 10922-16383
如上将槽 0 到 5461 和 10922 到 16383 指派给节点 7000。
int CLUSTER_SLOTS = 16384;
struct clusterNode {
// ...
unsigned char slots[CLUSTER_SLOTS/8]; // 每个字节表示 8 个槽
}
typedef struct clusterState {
// ...
struct clusterNode nodes[CLUSTER_SLOTS]; // 记录每个槽的指派信息
// ...
} clusterState;
节点计算键属于哪个槽,若不是本节点,则向客户端返回 MOVED
错误,指引客户端到正确的节点。
CRC16(key) & 16383
关键词: redis-trib
负责管理集群
客户端向源节点发送关于 key 的命令,若源节点正在迁移相关槽,且 key 可能处于源节点迁移的目标节点,则源节点会返回 ASK
错误,指引客户端到目标节点。
如上的 ASK 错误在 Redis 3.0 中未实现。
Gossip 协议,正文实现可见 cluster.h/clusterMsgDataGossip
。