Redis主从架构
原创大约 2 分钟
Redis主从架构
工作原理
主从复制(全量复制)
- 如果你为 master 节点配置了一个 slave ,不管这个 slave 是否第一次连接上 master ,它都会发送一个 PSYNVC 命令给 master 请求复制数据。
- master 节点收到 PSYNC 命令后,会在后台通过 bgsave 进行数据持久化生成最新的rdb快照文件,持久化期间, master 会继续接收客户端的请求,他会把这些可能修改数据集的请求缓存在内存中。
- 当持久化进行完毕后, maser 会把这份rdb文件数据集发送给 slave , slave 会把己收到的数据进行rdb持久化,然后加载到内存中。若 master 内存中存在后续修改的数据集,再将之前缓存的命令发送给 slave 。
- 当 master 与 slave 之间的链接由于某种原因断开连接时, slave 能够自动链接 master ,如果 master 收到多个 slave 并发链接请求,它只会进行一次持久化,而不是一次链接持久化一次,会把这一份持久化的数据发送给多个并发连接的 slave 。
主从复制(部分复制)
- 当 master 和 slave 断开连接,一般都会对正分数据进行复制。但是从2.8版本开始,redis改用可以支持部分数据复制的命令 PSYNC 去 master 同步数据,slave 与 master 能够在网络连接断开重连后进行部分数据复制(断电续传);
- master 会在内存中创建一个缓存队列,缓存最近一段时间的数据,master 和它所有的 slave 都维护了缓存的数据下标 offset 和 master 的 进程id ;
- 当网络断开,slave 请求 master 继续进行未完成的复制,从所记录的数据下标开始,如果 master 进程ID变了或者 slave 节点数据下标 offset 已经不在 master 缓存队列中时,会进行一次 全量复制 。
⚠️注意:repl buffer中存的数据是先进先出的,当偏移量(offset)已经找不到,则全量复制
问题
主从复制风暴
从上述可以看到我们redis主从同步的执行流程,当我们一个主节点存在很多从节点,从节点同时复制主节点会导致主节点压力过大。这就是我们所说的主从复制风暴。
对于主从复制风暴,我们可以通过让部分的从从节点不再从主节点同步数据,而是跟从节点同步数据,具体结构如下: