主从
主从数据同步,当主节点宕机时手动启用从节点作为主节点做灾难转移。
工作机制
salve向master发起同步请求,master收到后生成RDB并将期间命令存在buffer中(还有offset偏移量),salve节点同步初始化后根据偏移量向master节点继续同步,由于master节点buffer环状写入如果salve找不到offset则从新同步。
哨兵sentinel
主从失效不能实现自动选主,所以引入哨兵监控Redis主从集群,当master宕机后哨兵自动从salve中选出一个作为新master。那为了保证集群高可用sentinel也不是单点机器而是集群。
sentinel既然是集群那么选主结果就要一直否则会出现多个master的情况。sentinel集群通过raft协议实现节点选择,当一个sentinel联系不上master会认定主观下线,sentinel之间交流信息,如果超过一半sentinel认为master节点下线则触发选举机制,先选举leader哨兵,leader哨兵再将优先级最高、偏移量最大的从服务器选为主服务器。
选举过程
选举可能失败但任期都会加一
每个哨兵在发现自己于主节点断开后会自身从跟随着转为候选人,等待一个随机时间后,向其他节点发起选票拉取,如果得到超过半数机器选票则自身转为leader并向其他节点发送心跳。
任期情况
如果一个server的编号小于另一个的,那么它会将自己的编号更新为较大的那一个;如果leader或者candidate发现自己的编号不是最新的了,就会自动转变为follower;如果接收到的请求的term编号小于自己的当前term将会拒绝执行
日志进度
Raft通过投票过程确保只有拥有全部已提交日志的candidate能成为leader,在投票的时候会阻止落后的服务器成为leader,follower只有在确保candidate的日志至少不比自己落后的情况下才会投赞成票。
日志同步
新主节点向跟随着发送日志同步心跳,携带任期与log,如果没有找到此log,follower将拒绝此消息,那么leader端对应follower的nextIndex会减一然后对此follower进行AppendEntries操作。如果再次失败那么再进行自减并执行AppendEntries操作。循环直到成功。
日志提交
leader判断当前term的AppendEntries消息复制成功数量是否超过半数,超过半数那么标记此log为已提交,并且应用此log和之前未提交的所有log到本地状态机
分片集群
Redis将整个存储内容分为16384个slot分配在集群中每个节点上,每个key通过crc16得到16bit值再对16384取模。集群中节点也会向其他节点发送自己所载的slot,如果数据不在自己节点上则通过该映射告知客户端向其他节点请求数据。如果增删节点slot进行转移返回move命令客户端向其他节点请求并客户端更新映射缓存,如果正在迁移则返回ask命令请求转移但不跟新缓存映射。
master之间分片,各自的slave还保持复制,当master节点宕机时选举新节点(raft协议)。
|