标签:标识 节点 通过 ica sds cat 错误 enable 迁移
Redis集群是Redis提供的分布式数据库方案,集群通过分片(Sharding)来进行数据共享,并提供复制和故障转移功能。
一个节点就是一个运行在集群模式下的Redis服务器,Redis服务器在启动的时候会根据cluster-enabled
配置项来决定是否开启服务器的集群模式。
typedef struct clusterNode {
// 创建节点时间
mstime_t ctime;
// 节点的名字,40个十六进制字符组成
char name[CLUSTER_NAMELEN];
// 节点标识
// 使用各种不同的标识值记录节点的角色(比如:主节点、从节点)
// 以及节点目前所处的状态(比如:在线或者下线)
int flags;
// 节点当前的配置纪元,用于实现故障转移
uint64_t configEpoch;
// 记录节点的槽指派信息
unsigned char slots[CLUSTER_SLOTS/8];
// 记录节点负责处理的槽的数量
int numslots;
// 主节点的slave节点数量
int numslaves;
// 从节点信息
struct clusterNode **slaves;
// ……
// 节点的ip地址
char ip[NET_IP_STR_LEN];
// 节点的端口号
int port;
// 保存连接节点所需的有关信息
clusterLink *link;
// ……
} clusterNode;
clusterNode
的扩展信息用clusterNode.link
来存储typedef struct clusterLink {
// 连接的创建时间
mstime_t ctime;
// 输出缓冲区
sds sndbuf;
// 输入缓冲区
sds rcvbuf;
// 与这个连接相关联的节点
struct clusterNode *node;
} clusterLink;
typedef struct clusterState {
// 指向当前节点的指针
clusterNode *myself;
// 集群当前的配置纪元,用于实现故障转移
uint64_t currentEpoch;
// 集群当前的状态:是在线还是下线
int state;
// 集群中至少处理着一个槽的节点的数量
int size;
// 集群节点名单(包括myself节点)
// 字典的键为节点的名字,字典的值为节点对应的clusterNode结构
dict *nodes;
// ……
} clusterState;
通过发送CLUSTER MEET命令,可以让发送命令的节点A和接收命令的节点B彼此都添加到clusterNode.nodes
中,然后节点A将节点B的信息通过Gossip协议传播给集群中的其他节点,让其他节点也与节点B进行握手,最终,经过一段时间后,节点B会被集群中的所有节点认识。
Redis集群通过分片的方式来保存数据库中的键值对:集群的整个数据库被分为16384
个槽,集群中的每个节点可以处理0
个或者最多16384
个槽。所有的槽都有节点处理时,集群就属于上线状态,否则下线状态。
当数据库中的16384
个槽都进行了指派后,集群就会进入上线状态,客户端就可以向集群中的节点发送数据命令了,具体步骤如下:
clusterNode.nodes[i]
等于clusterNode.myself
,那就说明i
是由当前节点负责,节点可以执行客户端发送的命令MOVED <slot> <ip>:<port>
),引导客户端转向至正在负责槽的节点Redis集群的重新分片操作可以将任意数量已经指派给某个节点(源节点)的槽改为指派给另一个节点(目标节点),并且相关槽所属的键值对也会从源节点被移动到目标节点。
Redis集群的重新分片操作是由Redis的集群管理软件redis-trib
负责执行的,具体步骤如下:
redis-trib
对目标节点发送CLUSTER SETSLOT <slot> IMPORTING <source_id>
命令,让目标节点准备好从源节点导入属于槽slot的键值对redis-trib
对源节点发送CLUSTER SETSLOT <slot> MIGRATING <target_id>
命令,让源节点准备好将属于槽slot的键值对迁移至目标节点redis-trib
向源节点发送CLUSTER GETKEYSINSLOT <slot> <count>
命令,获得最多count
个属于槽slot的键值对的键名redis-trib
都向源节点发送一个MIGRATE <target_ip> <target_port> <key_name> 0 <timeout>
命令,将被选中的键原子地从源节点迁移至目标节点redis-trib
向集群中的任意一个节点发送CLUSTER SETSLOT <slot> NODE <target_id>
命令,将槽slot指派给目标节点,这一个指派信息会通过消息发送至整个集群,最终集群中的所有节点都会直到slot已经指派给了目标节点当被迁移槽的一部分键值对保存在源节点里面,而另一部分键值对保存在目标节点里时,如果客户端向源节点发送一个与数据库键有关的命令,且要处理的键正好在迁移的槽时:
ASK错误和MOVED错误都会导致客户端转向,它们的区别在于:
Redis集群中的节点分为主节点(master)和从节点(slave),其中master用于处理槽,而slave用于复制某个master,并在被复制的master下线时,代替下线master继续处理命令请求
向一个节点发送CLUSTER REPLICATE <node_id>
命令,可以让接收命令的节点成为node_id
所指定节点的从节点,并开始对主节点进行复制
集群中每个节点都会定期地向集群中的其他节点发送PING消息,以此来检测对方是否在线。
当一个节点发现自己正在复制的主节点已下线时,从节点将开始对下线主节点进行故障转移,步骤如下:
SLAVEOF no one
命令,成为新的主节点标签:标识 节点 通过 ica sds cat 错误 enable 迁移
原文地址:https://www.cnblogs.com/pinxiong/p/13288104.html