美文网首页
redis cluster

redis cluster

作者: 老杜振熙 | 来源:发表于2021-05-25 08:56 被阅读0次

    初始

    1. 作用
      集群是redis提供的一种分布式数据库方案,可以提供数据共享、复制、故障转移的功能。通过CLUSTER MEET <IP> <PORT>完成集群中各个节点间的连接;通过cluster-enable配置选项来配置某个redis服务器是否转为集群模式;


    2. 槽(slot)就是分片的单位,所谓分片,就是将所有的数据进行切分,不同的节点负责不同的数据。集群将整个数据库的所有数据划分为16384个槽,每个槽由某一个节点来处理,而各个节点负责多个槽。当所有的槽都有对应的节点来处理时,该集群才是上线状态

    底层数据结构

    1. struct clusterNode
      用来保存节点的各个基本信息,包括:创建时间、节点名、角色(主节点还是从节点)、状态(在线还是下线)、IP及端口、和该节点相连接的其他节点的信息(clusterLink *);

    2. struct clusterLink
      保存着连接节点的信息,包括:连接的创建时间、套接字、输入缓冲区、输出缓冲区、和该节点相连接的其他节点的信息(clusterNode *)(即节点在某个时刻正在相互通信的另一个节点的信息)

    3. struct clusterState
      每个节点都会持有一个clusterState结构体,它保存着在该节点的视角下,其所处的集群的状态信息,包括:当前集群状态(在线还是下线),集群中的节点数、配置纪元等等;clusterNode和clusterLink都体现在clusterState之中;

    4. clusterNode.slots vs clusterState.slots
      clusterNode结构体侧重于描述单个节点的信息,而clusterState结构体侧重于描述整个集群的整体信息。 clusterNode.slots存储了的是某个节点负责处理哪些槽(类型为unsigned char [16384/8]),而clusterState.slots存储的是集群的各个槽分别由哪个节点来处理(类型为clusterNode * [16384]);16384是一个集群的槽的总个数。

    命令

    1. CLUSTER MEET <ip> <port>
      让当前节点把另一个节点添加到它所处的集群之中。(对应于clusterState.nodes字典以及MEET、PING、PONG命令)

    2. CLUSTER ADDSLOTS <slot> [slot ...]
      将命令中所指定的槽添加到当前节点中(也就是所谓的槽指派)。注意,单个槽只能由一个节点负责!如果某个槽被重复分配,则返回错误。当所有的槽都被指派完毕之后,集群进行上线状态。

    3. CLUSTER GETKEYSINSLOT <slot> <count>
      返回某个槽里的最多count个键值对。内部原理是通过一个跳表来实现的,跳表的score是slot number,而value就是属于该slot的各个键值对;

    其他

    • redis集群通过对键值对的键计算CRC16,来确定它属于哪一个槽(假设是第n个槽),并通过clusterState.slots[n]得知它是由哪一个节点来进行处理。

    相关文章

      网友评论

          本文标题:redis cluster

          本文链接:https://www.haomeiwen.com/subject/rjqyjltx.html