nber1994



redis集群

January 8, 2019

redis集群

节点

clusterNode

struct clusterNode {
    //创建时间
    mstimer_t ctime;
    //节点的名字
    char name[REDIS_CLUSTER_NAMELEN];
    //节点标识
    //主从节点,上线下线
    int flags;
    //当前配置纪元,用于故障转移
    uint64_t configEpoch;
    //节点IP
    char ip[REDIS_IP_STR_LEN];
    //节点端口
    int port;
    //保存连接节点所需的信息
    clusterLink *link;
    //保存节点的槽指派信息
    unsigned char slots[16384/8];
    //槽指派的个数
    int numslots
    //复制的节点
    struct clusterNode *slaveof;
}
typedef struct clusterLink {
    //连接创建时间
    mstime_t time;
    //TCP套接字描述符
    int fd;
    //输出缓冲区,保存待发给其他节点的消息
    sds sndbuf;
    //输入缓冲区,保存着从其他节点接收到的消息
    sds revbuf;
    //与这个连接相关联的节点,没有就为null
    struct clusterNode *node;
} clusterLink;

clusterState

typedef struct clusterState {
    //指向当前节点的指针
    clusterNode *self;
    //集群当前的配置纪元,用于实现故障转移
    uint64_t currentEpoch;
    //集群当前状态:上线还是下线
    int state;
    //集群中至少处理一个槽的节点的数量
    int size;
    //集群单节点名单(包括自己)
    dict *nodes;
    //记录了集群中槽的指派情况
    clusterNode *slot[16384];
    //正在导入的槽的节点
    clusterNode importing_slots_from[16384];
} clusterState;

集群

cluster meet实现

槽指派

节点槽指派信息的记录

struct clusterNode {
    unsigned char slots[16384/8];
    int numslots;
}

集群槽指派信息的记录

typedef struct clusterState {
    clusterNode *slots[16384];
} clusterState;

在集群中执行命令

计算键属于哪个槽

判断槽是否由当前节点处理

moved命令

节点数据库的实现

typedef struct clusterState {
    ziplist *slot_to_keys;
}
- slot_to_keys是一个跳跃表,表节点的分值对应一个槽号,而成员变量则指向数据库键
- 每当新增键时,都会讲这个键和键的槽号关联到slot_to_keys
- 通过slot_to_keys结构,可以很方便的对某个或者某些槽的所有键进行批量操作
    - 例如cluster getkeyinslot slot count命令,返回最多count个属于slot的键1

重新分片

分片步骤

    typedef struct clusterState {
        clusterNode *migrating_slots_to[16384];
    } clusterState;

ASK错误

asking命令

ask和moved命令的区别

复制与故障转移

设置从节点

struct clusterNode {
    strutc clusterNode *slaveof;
} 
- 从节点也会更新clusterState.self.flags属性,变为redis_node_slave
- 从节点对主节点进行复制操作,该操作和单机复制操作一样
- 从节点成为某个节点的从节点的消息会发送给集群的其他节点

故障检测

struct clusterNode{
    //一个链表,记录了所有其他节点对该节点的下线报告
    list *fail_reports;
}
struct clusterNodeFailReport {
    //报告目标节点下线的节点
    struct clusterNode *node;
    //最后一次被报告的时间
    mstime_t time;
}

故障转移

选取新的主节点

消息

publish消息的实现

重点回顾