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处理

      

      

       

  • 相关阅读:
    C# 操作配置文件
    C# Excel操作类
    没有找到 mspdb100.dll 的解决办法
    工厂方法模式
    .Net互操作2
    The certificate used to sign “AppName” has either expired or has been revoked. An updated certificate is required to sign and install the application解决
    手机抓包xcode自带命令行工具配合wireshark实现
    expecting SSH2_MSG_KEX_ECDH_REPLY ssh_dispatch_run_fatal问题解决
    使用ssh-keygen设置ssh无密码登录
    远程复制文件到服务器
  • 原文地址:https://www.cnblogs.com/juniorMa/p/14927600.html
Copyright © 2011-2022 走看看