redis多机数据库
一、主从同步
第一次同步:
1:收到 psync?-1命令,bgsave生成RDB发送到从库
2:复制积压缓冲区数据进行同步
3:命令传播
后续同步
1:收到 psync runid offset,runid是用来判断之前的主库是不是目前的库,offset是为了确定复制偏移量是否在主库的复制积压缓冲区(是一个先入先出的队列)中,如果符合条件,直接将复制积压缓冲区的数据同步过去,然后进行命令传播,否则进行全量备份
从库对主库还有一个心跳机制
二、哨兵机制
哨兵状态的维持
代码如下(示例):
struct sentiealState{
dict*masters;//被监视的主库,sentialRedisInstance类型
};
struct sentialRedisInstance{
int seconds;//主官下线的时间
int nums;//客观下线的数目
dict*salves;//复制主库的从库
dict*sentials;//监视主库的哨兵
};
哨兵每隔一段时间向主库发送info消息,主库用从库的信息进行回应,哨兵更新自己的状态。哨兵并与主库建立命令连接以及订阅连接。
哨兵同时也会向从库发送info消息,获取从库目前复制偏移量等信息。哨兵并与主库建立命令连接以及订阅连接。
哨兵通过订阅链接获取其他哨兵信息,并与其他哨兵建立命令连接。
2.故障转移
2.1主官下线
2.2客观下线
2.3选取哨兵leader
2.4 选取从库
2.5.修改复制目标
2.6.旧主库复活后升级为从库
三、集群
3.1 集群状态维持
struct clustersatate{
clusterNode*myself;
dict*node;//全部节点
clusterNode*nodes[16384];//槽节点指派
zskiplist*slots_to_keys;//由key获得slots;
//针对于槽的搬移
clusterNode*importing_slot_from;
clusterNode*importing_slot_to;
};
clusterNode{
//一些节点信息
int slots[16384/4];//槽节点指派
clusterlink*node;
clusterNode*salve;
fail_reports;//用来判断是否下线
}
3.2 move与ask错误
3.3 故障转移
1:错误链表超过1/2;
2:广播下线信息
3:从库广播竞争
4:从库代替主库pong消息告知
3.3 节点如何进行信息交互
ping,pong,meet:在发送当前节点信息的同时还会附带其他两个节点(gossip协议)