《redis 设计与实现》 part3 多机数据库实现

chapter 15 复制
旧版:同步(主RDB)——命令传播
缺陷:RDB阻塞,网络中断重启整个过程

新版:完整同步(RDB)——部分同步(维护复制缓冲区&&偏移量)
网络中断&&缓冲区复制偏移量不足——重启复制过程
缓冲区控制:total = 重连时间X主写命令速度
心跳:网络连接检查(延迟)、min-slaver检测、命令丢失(复制偏移量)

chapter 16 哨兵
哨兵 主从服务器监视:主下线、从复制进度、故障转移(主选举)、从添加(重新上线)
初始化:连接主列表
维护:主服务器name——struct{IP:port、主观下线时间、客观下线票数、从服务器个数、}
哨兵——主server连接:1.命令连接INFO——主server信息、发现从服务器;2.订阅连接,发送哨兵自身信息,发现(&更新)其他哨兵
哨兵——从server连接:1.命令连接INFO——主server信息、从服务器复制偏移量、主从连接状态;2.订阅连接
哨兵——哨兵命令连接
维护信息:
master{
slavers{
}
sentinels{
}
}
主观下线:哨兵——主(从)server Ping——pong 不同主-哨兵,不同超时
客观下线:哨兵——哨兵 is-master-down 不同哨兵-主,不同票数

选举哨兵,故障转移
纪元:一次选举(选举结束共识)
一人一票,先到先得,超过半数,选举时限
选择主服务器:在线、配置连接时间内、从-主断开时长、从服务器优先级、复制偏移量、ID

chapter 17 集群
clusterState{
Node* myself { slots(bit array) num_slots }
Node* importing_from { slots(point array) }
Node* migrating_to { slots(point array) }
集群纪元、状态、有slot的节点数
dict{
name:node* { slots(point array) num_slots }
}
}
meet命令,获取clusternode信息,握手确认信息记录(???pong-pingpingpong?)

db dict{key:slot} slot分配算法
集群上线:所有slot被指派
slot指派:{slot:node}
slots(bit array):[index(slot_index)]: bool

client(key)——node(slot)——data || MOVE(node)
多个key:多个slot slot2key跳表

重新分片:集群管理软件
部分迁移:ASK错误:当前节点查找——ASK目标节点

故障转移:
主节点作为哨兵&&
从节点得知下线,向其他主节点拉票(主投从)
slot指向自己,广播pingpong
故障转移完成,处理请求

消息
MEET加入集群
PING,在线判断&&消息更新
PONG:回应PING;广播主动刷新自身认知
Gossip协议???

Fail:广播(Gossip传播过慢?)

复制:广播PUBLISH
集群:节点通过频道传递消息,不选择广播

posted @ 2020-12-07 19:12  qmchao  阅读(58)  评论(0)    收藏  举报