实习面试准备——redis篇3

这次是redis的终篇,可能还有很多点没有提及吧,但就先这样吧。这篇设计的知识点有redis集群—主从同步、redis集群—哨兵模式、redis集群—分片集群、redis的I/O多路复用模型(redis的网络模型)

redis集群--主从同步(确保了高并发读)【重写、repl_backlog】

master负责写操作、slary负责读操作。一般采取一主多从的方式。同步的方式有两种
1.全量同步(一般用于启动时,redis预热、Slave初始化阶段)
salary建立连接,replaceof() --》 salary请求同步,发送自己的replicationID --》 master接收后,经行比较,若不同则表明salary是第一次同步,若是则master还将发送自己的repliID、offset ,salary接收并保存 --》 master 开启bqsave命令,生成rbd文件,在此期间master的所有命令,将写入log文件。备份完成后发送rdb文件和log给salary --》salary收受后,清空本地rdb文件、执行log中的命令

如果master收到了多个slave并发连接请求,它只会进行一次持久化,而不是每个连接都执行一次,然后再把这一份持久化的数据发送给多个并发连接的slave。
快照文件的大小可在配置文件中调整、若文件过大则停止复制,复制失败

2.增量同步(全量同步太消耗资源了)
建立连接 --》请求同步,发送repliID、offset --》master接收后,比较是否为第一次同步,若是则master还将发送自己的repliID、CONTINUE(开启增量同步),获取log中offset后的命令并发送--》slary执行命令完成同步

master-slave网络连接断掉后,slave重新连接master时,会触发全量复制,但是从2.8版本开始,slave与master能够在网络连接断开重连后,只从中断处继续进行复制,而不必重新同步,这就是所谓的断点续传。

3.无磁盘化复制
由master直接开启一个socket,在内存中创建RDB文件,再将rdb文件发送给slave服务器,不使用磁盘作为中间存储。

首先看slave的offset,如果为空就直接全局同步,如果不为空就去判断Replocation id是否一致,不一致就全局同步,一致就根据offset的位置来同步后边新的数据

https://blog.csdn.net/weixin_73077810/article/details/131122784

哨兵集群(高可用)
用于监控、自动故障恢复、通知

自动故障恢复,每隔一秒会对redis库进行一次ping,因为哨兵是有多个的,一个哨兵发现master库ping不通为主观,若超过一半哨兵发现ping不通则为客观
此时实施故障恢复。将一位slave升级位master,超过配置文件中的断开时间的slave直接排除、节点优先级、offset大小、id大小

脑裂
可能因为网络问题、将master与slave分成了不同网段。导致哨兵误以为master宕机。当网络恢复时,便会出现两个master,原先的master将降级为slave,
而新master对所有的slave的数据更新,会导致网络波动期间的线程对原master的所有命令操作便会失效。 设置最小节点数小于1、复制同步延迟不超过5秒。否则拒绝客户端请求。

分片集群(高并发读)
集群中有多个master,每个master保存不同数据
每个master都可以有多个slave节点
master之间通过ping监测彼此健康状态
客户端请求可以访问集群任意节点,最终都会被转发到正确节点
Redis会把每一个master节点映射到0~16383共16384个插槽(hash slot)上。redis会根据key的有效部分计算插槽值

https://b11et3un53m.feishu.cn/wiki/MWQIw4Zvhil0I5ktPHwcoqZdnec?from=from_copylink 笔记

redis是单线程为什么其速度还是这么快?

1.完全基于内存,代码由C语言编写

2.采用单线程,避免了不必要的上下文切换

3.采用多路I/O复用模型、非阻塞IO

谈到IO,就要先了解:用户空间、内核空间、硬件设备。用户空间权限较小是通过内核空间去访问硬件设备的。内核空间去查询硬件设备的数据,查询就绪后通知用户空间后、用户空间就能revform接收

多路I/O复用模型:一个线程监听多个Socket,并在Socket的可读、可写时,获取到通知,避免了重复的等待,充分的利用CPU资源。目前的多路I/O复用模型采用epoll的方式。在Socket就绪时,直接将Socket写入用户空间,不需要再次遍历每个Socket。

redis的网络模型便是多路I/O复用加上事件的触发器来处理多个Socket,如连接应答处理器、命令回复处理器、命令请求处理器。在redis 6之后,命令回复处理器和

命令请求处理器中的命令转化使用了多线程,增加速度,而命令的执行依旧是单线程

posted @ 2024-10-21 22:03  开放》  阅读(16)  评论(0)    收藏  举报