Redis主从工作原理

前言

接前面讲到的《redis主从架构搭建》,来讲一下Redis主从架构的工作原理到底是怎么运作的

Redis工作原理

在上个博客中我们搭建了Redis主从架构;在过程中我们为master主节点配置了三个slave从节点。在这三个slave从节点启动的时候,不管是否第一次连接上master主节点,他们都会发送改一个PSYNC命令给master请求同步数据。

master主节点接收到PSYNC命令后,会在后台进行数据持久化,通过bgsave生成最新的快照文件;在持久化期间,master主节点还会继续接受客户端的请求,并且他会把这些可能修改数据的请求命令缓存在一块内存中。当持久化进行完毕之后,master会把这份rdb文件数据集发送给slave从节点,slave从节点会把接收到的数据进行持久化生成rdb,然后再加载到内存中。然后master主节点再将之前缓存在内存中的命令发送给slave从节点,从节点根据这些请求指令重放数据到redis中。

当master主节点和slave从节点之间的连接由于一些原因断开时,slave从节点能够自动重连master主节点,如果master收到了多个slave从节点并发连接的请求时,他会进行一次持久化,而不是一个一个连接一次,然后把这份持久化的数据发送给多个并发连接的slave从节点。以上整个流程可以用下图来表示

主从复制(全量复制)流程图

主从部分数据复制

当master和slave断开重连后,一般都会对整份数据进行复制。但是从redis2.8版本开始,redis改用可以支持部分数据复制的命令PSYNC去master同步数据,slave与master能够在网络连接断开重连后只进行部分数据复制(端点续传)。

master会在其内存中创建一个复制数据用的缓存队列,缓存最近一段时间的数据,master和他所有的slave都维护了复制的数据下标offset和master的进程id,因此,当网络连接断开后,slave会请求master继续进行未完成的复制,从所记录的数据下标开始,如果master进程id变化了,或者从节点数据下标offset太旧,已经不再master的缓存队里中,那么将会进行一次全量数据的复制

主从复制(部分复制,端点续传)流程图

如果有很多从节点,为了缓解主从复制风暴(多个从节点同时复制主节点数据导致主节点压力过大),可以做如下结构调整,让部分从节点与从节点(与主节点同步)同步数据

主从复制风暴架构解决方案

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信