zoukankan      html  css  js  c++  java
  • Redis之集群知识点总结(二)-- 源码分析

    一 集群的数据结构

      ClusterNode 

      clusterNode 结构保存了一个节点的当前状态,比如节点的创建时间、节点的名字、节点 当前的配置纪元、节点的IP地址和端口号等等。除此之外,clusterNode结构的 link 属性是一个clusterLink结构,该结构保存了连接节点所需的有关信息,比如套接字描述符,输入缓冲区和输出缓冲区。clusterNode 还有一个 fail_report 的列表,用来记录疑似下线报告。

    typedef struct clusterNode {
        mstime_t ctime; /* 创建节点的时间 */
        char name[CLUSTER_NAMELEN]; /* 节点的名字 */
        int flags;      /* 节点标识,标记节点角色或者状态,比如主节点从节点或者在线和下线 */
        uint64_t configEpoch; /* 当前节点已知的集群统一epoch */
        unsigned char slots[CLUSTER_SLOTS/8]; /* slots handled by this node */
        int numslots;   /* Number of slots handled by this node */
        int numslaves;  /* Number of slave nodes, if this is a master */
        struct clusterNode **slaves; /* pointers to slave nodes */
        struct clusterNode *slaveof; /* pointer to the master node. Note that it
                                        may be NULL even if the node is a slave
                                        if we don't have the master node in our
                                        tables. */
        mstime_t ping_sent;      /* 当前节点最后一次向该节点发送 PING 消息的时间 */
        mstime_t pong_received;  /* 当前节点最后一次收到该节点 PONG 消息的时间 */
        mstime_t fail_time;      /* FAIL 标志位被设置的时间 */
        mstime_t voted_time;     /* Last time we voted for a slave of this master */
        mstime_t repl_offset_time;  /* Unix time we received offset for this node */
        mstime_t orphaned_time;     /* Starting time of orphaned master condition */
        long long repl_offset;      /* 当前节点的repl便宜 */
        char ip[NET_IP_STR_LEN];  /* 节点的IP 地址 */
        int port;                   /* 端口 */
        int cport;                  /* 通信端口,一般是端口+1000 */
        clusterLink *link;          /* 和该节点的 tcp 连接 */
        list *fail_reports;         /* 下线记录列表 */
    } clusterNode;

       clusterNodeFailReport 是记录节点下线报告的结构体, node 是报告节点的信息,而 time 则代表着报告时间。

    typedef struct clusterNodeFailReport {
        struct clusterNode *node;  /* 报告当前节点已经下线的节点 */
        mstime_t time;             /* 报告时间 */
    } clusterNodeFailReport;

      还有一个重要的数据结构,clusterLink

      

      最后,每个节点都保存着一个clusterState的结构,该结构记录着当前的节点的视角下,整个集群的状态。例如,当前集群都有哪些节点,每个节点分配的槽位。

      

      我刚开始看这里时候也是有点绕,后来就明白了。比如NodeA会保存NodeB的信息。把NodeB保存在dict * nodes中。在每个ClusterNode中所保存的Link,表示

      的是从NodeA到NodeB的socket链接。

    typedef struct clusterState {
       clusterNode *myself;  /* 当前节点的clusterNode信息 */
       ....
       dict *nodes;          /* name到clusterNode的字典 */
       ....
       clusterNode *slots[CLUSTER_SLOTS]; /* slot 和节点的对应关系*/
       ....
    } clusterState;

      在 clusterState中的slots数组,每一个元素都指向一个ClusterNode,表示该槽位应该由哪个node处理

      

      

       

  • 相关阅读:
    百度高级搜索技巧
    JRebel插件使用详解
    css3自适应布局单位vw,vh详解
    vue的MVVM原理
    JS实现全屏和退出全屏
    设置不定宽高的元素垂直水平居中
    微信小程序启动更新机制
    了解MVVM原理
    xss攻击和csrf攻击的定义及区别
    跨站脚本漏洞(XSS)基础讲解
  • 原文地址:https://www.cnblogs.com/juniorMa/p/14927600.html
Copyright © 2011-2022 走看看