初始
-
作用
集群是redis提供的一种分布式数据库方案,可以提供数据共享、复制、故障转移的功能。通过CLUSTER MEET <IP> <PORT>
完成集群中各个节点间的连接;通过cluster-enable
配置选项来配置某个redis服务器是否转为集群模式; -
槽
槽(slot)就是分片的单位,所谓分片,就是将所有的数据进行切分,不同的节点负责不同的数据。集群将整个数据库的所有数据划分为16384个槽,每个槽由某一个节点来处理,而各个节点负责多个槽。当所有的槽都有对应的节点来处理时,该集群才是上线状态。
底层数据结构
-
struct clusterNode
用来保存节点的各个基本信息,包括:创建时间、节点名、角色(主节点还是从节点)、状态(在线还是下线)、IP及端口、和该节点相连接的其他节点的信息(clusterLink *); -
struct clusterLink
保存着连接节点的信息,包括:连接的创建时间、套接字、输入缓冲区、输出缓冲区、和该节点相连接的其他节点的信息(clusterNode *)(即节点在某个时刻正在相互通信的另一个节点的信息) -
struct clusterState
每个节点都会持有一个clusterState结构体,它保存着在该节点的视角下,其所处的集群的状态信息,包括:当前集群状态(在线还是下线),集群中的节点数、配置纪元等等;clusterNode和clusterLink都体现在clusterState之中; -
clusterNode.slots
vsclusterState.slots
clusterNode结构体侧重于描述单个节点的信息,而clusterState结构体侧重于描述整个集群的整体信息。clusterNode.slots
存储了的是某个节点负责处理哪些槽(类型为unsigned char [16384/8]),而clusterState.slots
存储的是集群的各个槽分别由哪个节点来处理(类型为clusterNode * [16384]);16384是一个集群的槽的总个数。
命令
-
CLUSTER MEET <ip> <port>
让当前节点把另一个节点添加到它所处的集群之中。(对应于clusterState.nodes字典以及MEET、PING、PONG命令) -
CLUSTER ADDSLOTS <slot> [slot ...]
将命令中所指定的槽添加到当前节点中(也就是所谓的槽指派)。注意,单个槽只能由一个节点负责!如果某个槽被重复分配,则返回错误。当所有的槽都被指派完毕之后,集群进行上线状态。 -
CLUSTER GETKEYSINSLOT <slot> <count>
返回某个槽里的最多count个键值对。内部原理是通过一个跳表来实现的,跳表的score是slot number,而value就是属于该slot的各个键值对;
其他
- redis集群通过对键值对的键计算CRC16,来确定它属于哪一个槽(假设是第n个槽),并通过clusterState.slots[n]得知它是由哪一个节点来进行处理。
网友评论