本文的分析主要介绍集群中的槽和集群中命令的执行。
一、集群中的槽
1、槽的基本结构信息
redis集群通过分片的方式来存储数据库中的键值对:集群的整个数据库被分为16384个槽,
数据库中的每个键属于这16384个槽的一个,每个节点可以处理0~16384个槽。当数据库中只有
所有的槽都有节点处理是,集群才是上线状态;反之,只要有一个槽没有节点处理,那集群就处
于下线状态。
struct clusterNode{
……
unsigned char slots[CLUSTER_SLOTS/8];
int numslots;
……
};
clusterNode的slots是一个bit array,共包含16384个二进制位,以0为起始索引,16383为终止索引对slots编码,并根据索引i上的二进制位判断是否处理槽i。
typedef struct clusterState {
……
clusterNode *slots[CLUSTER_SLOTS];
……
} clusterState;
clusterState的slots记录集群中所有槽的指派信息。
1)slots[i]为NULL,则该槽未进行指派
2)slots[i]为clusterNode指针,则该槽指派给clusterNode指针对应的节点
2、槽的指派
槽的相关处理主要有槽指派和重新分片。命令如下所示:
CLUSTER ADDSLOTS <slot> [slot] ...
void clusterCommand(client *c) {
……
if ((!strcasecmp(c->argv[1]->ptr,"addslots") ||
!strcasecmp(c->argv[1]->ptr,"delslots")) && c->argc >= 3)
{
int j, slot;
unsigned char *slots = zmalloc(CLUSTER_SLOTS);
int del = !strcasecmp(c->argv[1]->ptr,"delslots");
memset(slots,0,CLUSTER_SLOTS);
……//判断槽是否可处理,不可处理直接返回
f