Redis集群的总结
主从复制的面试点:
1. 主从复制核心原理:
全量复制:
1)主节点通过bgsave 命令fork子进程进行RDB持久化,该过程非常消耗资源
2)主节点通过网络将RDB文件发送给从节点,对主从节点的带宽带来很大消耗
3)从节点清空老数据,载入新RDB数据的过程是阻塞的,无法响应客户端的命令;
增量复制:
1)复制偏移量:执行复制的双方,主从节点,分别维护一个复制偏移量offset
2)复制积压缓冲区:主节点内部维护了一个固定长度的、先进先出(FIFO)队列作为复制积压缓冲区,
当主节点offset的差距过大超过缓冲区长度时(主节点offset不在缓冲区内),将无法执行部分复制,只能执行全量复制。
3)服务器运行ID(runid):每个Redis节点,都有其运行ID,运行ID由节点在启动时自动生成,主节点会将自己的运行ID发送从节点,
从节点会将主节点的ID运行ID存起来。从节点Redis断开重连的时候,就是根据运行ID来判断同步的进度:
如果从节点保存的runid与主节点现在的runid相同,说明主从节点之前同步过,主节点会继续尝试使用部分复制(到底能不能部分复制还要看offset和复制积压缓冲区的情况);
如果从节点保存的runid与主节点现在的runid不同,说明从节点在断线前同步的Redis节点并不是当前的主节点,只能进行全量复制。
核心就三个:
1. 是不是第一次复制:如果是就全量同步
2. runid是不是一致的,如果不一致就全量同步
3. offset在不在复制积压缓冲区:如果不在就全量同步
哨兵模式面试点:
主观下线和客观下线:
主观下线:每个Sentinel节点会每隔1秒对主节点、从节点、其他Sentinel节点发送心跳,当这些节点超时时,Sentinel节点就会对该节点做失败判定
这个行为叫做主观下线。
客观下线:当Sentinel主观下线是主节点时,该Sentinel节点会询问其他主节点的判断,当判断超过个数(quorum),Sentinel节点认为主节点确实有问题,
这时该Sentinel节点做出客观下线的决定。
集群模式面试点:
为什么不用一致性hash而用哈希槽:
1. 虚拟节点少的话数据分配不均匀,并且不能够按照机器性能分配资源
2. 有雪崩的风险,当一台机器挂了,这台机器上承载的并发会传导到下一个机器上去,就会导致接下来的机器崩掉。