啥是redis集群
redis集群是redis提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能。一个集群通常由多个节点组成,刚开始的时候,每个节点都是互相独立的,它们都处于一个只包含自己的集群当中,要组建一个真正可工作的集群,我们必须将各个独立的节点连接起来,构成一个包含多个节点的集群。
像上面这样,通过握手,可以把一个节点“拉进”集群。具体命令:CLUSTER MEET ip:port
可以通过CLUSTER NODES 查看当前集群的节点情况。
Redis服务器在启动时,会根据cluster-enabled配置是否为yes, 来决定是否开启集群模式。
集群数据结构
clusterNode保存了一个节点的当前状态,每个节点都有一个clusterNode
struct clusterNode {
// 创建节点的时间
mstime_t ctime;
// 节点的名字
char name[REDIS_CLUSTER_NAMELEN];
// 节点标记,主节点,从节点,以及目前所处的状态
int flags;
// 节点当前的配置纪元,用于故障转移
unit64_t configEpoch;
// 节点ip
char ip[REDIS_IP_STR_LEN];
// 节点端口
int port;
// 连接节点所需的有关信息
clusterLink *link;
// 二进制位数组,一共16384个二进制位,根据二进制位的值来判断节点是否处理槽i
unsigned char slots[2048];
// ...
}
每个节点都保存了一个clusterState结构,这个结构记录了在当前节点的视角下,集群目前所处的状态。
struct clusterState {
// 指向当前节点
clusterNode *myself;
// 当前的配置纪元,用于故障转移
uint64_t currentEpoch;
// 集群当前状态,在线还是下线
int state;
// 集群中至少处理着一个槽的节点的数量
int size;
// 集群中的节点名单
dict *nodes;
}
以前面三个节点为例,下面是一个clusterState例子
从这个图就可以看出握手的过程,就是两个节点彼此互相构建起clusterNode,和clusterState的过程。A与B握手之后,A会通知集群其他的节点,和B一一握手。
槽指派
Redis集群通过分片的方式保存数据库的键值对:集群的整个数据库被分为16384个槽,数据库中的每个键都属于其中一个槽,集群中的每个节点可以处理若干个槽。
数据库每个槽都有节点在处理时,集群处于上线,否则处于下线。