赞
踩
Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能
一个Redis集群通常由多个节点(node)组成,在刚开始的时候,每个节点都是相互独立的,它们都处于一个只包含自己的集群当中,要组建一个真正可工作的集群,则必须将各个独立的节点连接起来,构成一个包含多个节点的集群。连接各个节点的工作可以使用CLUSTER MEET命令来完成,该命令的格式如下:
CLUSTER MEET <ip> <port>
向一个节点node发送CLUSTER MEET命令,可以让node节点与ip和port所指定的节点进行握手(handshake),当握手成功时,node节点就会将ip和port所指定的节点添加到node节点当前所在的集群中。
举个例子。假设现在有三个独立的节点127.0.0.1:7000、127.0.0.1:7001、127.0.0.1:7002,首先使用客户端连接上节点7000,通过发送CLUSTER NODES命令可以看到,集群目前只包含7000自己一个节点
E:\redis>redis-cli -c -p 7000
127.0.0.1:7000> CLUSTER NODES
851197a1532c90ca60d91be5a6b95d3efc5a966f :7000 myself,master - 0 0 0 connected 246 5305 7629 11537 12291
通过向节点7000发送以下命令,我们可以将节点7001添加到节点7000所在的集群里面:
a29240fa8cb8b2ba154e9cb81faf5a3070c71966 127.0.0.1:7001 slave 352302bf0156372441c069247f984427cff506ff 0 1712586652533 1 connected
352302bf0156372441c069247f984427cff506ff 127.0.0.1:7000 myself,master - 0 0 1 connected 246 5305 7629 11537 12291
继续向节点7000发送以下命令,我们可以将节点7002也添加到节点7000和节点7001所在的集群里面:
127.0.0.1:7000> CLUSTER MEET 127.0.0.1 7002
OK
127.0.0.1:7000> CLUSTER NODES
ceb9e23e93e0aae13e5333f50d39336a97e5cba3 127.0.0.1:7002 slave 352302bf0156372441c069247f984427cff506ff 0 1712586757161 1 connected
a29240fa8cb8b2ba154e9cb81faf5a3070c71966 127.0.0.1:7001 slave 352302bf0156372441c069247f984427cff506ff 0 1712586756148 1 connected
352302bf0156372441c069247f984427cff506ff 127.0.0.1:7000 myself,master - 0 0 1 connected 246 5305 7629 11537 12291
现在,这个集群里面包含了7000、7001和7002三个节点,握手流程如图。
一个节点就是一个运行在集群模式下的Redis服务器,Redis服务器在启动时会根据cluster-enable配置选项是否为yes来决定是否开启服务器的集群模式,如图所示。节点(运行在集群模式下的Redis服务器)会继续使用所有在单机模式中使用的服务器组件,比如说:
cclusterNode结构保存了一个节点的当前状态,比如节点的创建时间、节点的名字、节点当前的配置纪元、节点的IP地址和端口号等等。每个节点都会使用一个clusterNode结构来记录自己的状态,并为集群中的所有其他节点(包括主节点和从节点)都创建一个相应的clusterNode结构,以此来记录其他节点的状态:
struct clusterNode { // 创建节点的时间 mstime_t ctime; // 节点的名字,由40个十六进制字符组成 // 例如ceb9e23e93e0aae13e5333f50d39336a97e5cba3 char name[REDIS_CLUSTER_NAMELEN]; // 节点标识 // 使用各种不同的标识值记录节点的角色(比如主节点或者从节点) // 以及节点目前所处的状态(比如在线或者下线) int flags; // 节点当前的配置纪元,用于实现故障转移 uint64_t configEpoch; // 节点的IP地址 char ip[REDIS_IP_STR_LEN]; // 节点的端口号 int port; // 保存连接节点所需的有关信息 clusterLink *link; // ... };
clusterNode结构的link属性是一个clusterLink结构,该结构保存了连接节点所需的有关信息,比如套接字描述符,输入缓冲区和输出缓冲区:
typedef struct clusterLink {
// 连接的创建时间
mstime_t ctime;
// TCP 套接字描述符
int fd;
// 输出缓冲区,保存着等待发送给其他节点的消息(message)
sds sndbuf;
// 输入缓冲区,保存着从其他节点接收到的消息
sds rcvbuf;
// 与这个连接相关联的节点,如果没有的话就为NULL
struct clusterNode *node;
}clusterLink;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。