Redis主从架构


Redis主从架构

主从架构,一从多主,主负责写,并且将数据复制到其他的slave节点。从节点负责读。所有的读请求全部走从节点。

主从复制的核心机制

  • Redis采用异步方式复制数据到slave节点,2.8之后,slave node会周期性确认自己复制的数据量;
  • 一个master node 可以配置多个slave node;
  • slave node复制的时候,不会bolck master node的正常工作;
  • slave node复制的时候,不会block 对自己的查询操作,会用旧数据来提供服务;但是完成复制后,需要删除旧数据,记载新数据,这个时候就会暂停对外服务;
  • slave node主要用来进行横向扩容,做读写分离,提高读的吞吐量。

注意:如果采用主从架构,建议必须开启master node的持久化,不建议用slave node作为master node的数据热备。如果关掉master的持久化,可能在master宕机重启的时候数据是空的,slave node一复制数据也是空的。

主从复制的核心原理

当启动一个salve node的时候,会发送一个PSYNC命令给master node。

如果slave node初次连接到master node,会触发一次全量复制,此时master 会启动一个后台县城,开始生成一份RDB快照,同时还会将新收到的命令缓存到内存中。RDB文件生成完毕后,master会将这个RDB发送给slave,slave会先写入到本地磁盘,然后从本地磁盘加载到内存中,之后master会将内存中的缓存命令发送给slave,slave也会同步这些数据。如果slave与master有网络故障,断开了连接,会自动重连,连接后master仅会复制给slave缺少的数据。

主从复制的断点续传

Redis2.8开始,支持主从复制的断点续传,如果主从复制过程网络连接中断,那么可以从上次复制的地方继续复制下去。

master 会在内存中维护一个backlog,master与slave都会保存一个offset与master run id,offset保存在backlog中。如果master和slave网络连接中断,slave会让master从上次的offset开始复制,如果没有找到对应的,就会执行全量复制。

无磁盘化复制

master内存中创建RDB,发送给slave,不会落地在本地的磁盘。只需要在配置文件中开启以下命令

repl-diskless-sync yes

# 等待 5s 后再开始复制,因为要等更多 slave 重新连接过来
repl-diskless-sync-delay 5

过期key处理

slave不会过期key,只会等待master过期key。如果master过期了key,或者通过LRU淘汰了一个key,就会模拟一条del命令发送给slave。

复制完整的流程

slave node启动时,会在本地保存master node信息,但是复制流程还没开始。

slave内部有个定时任务,每秒检查是否有新的master node连接和复制,如果发现,就跟master建立socket连接。然后slave发送ping命令给master。faster 第一次执行全量复制,将所有数据发送给slave node。后续,master持续将写命令,异步复制给slave。

heartbeat

主从节点互相都会发送心跳信息

master默认10s发送一次heartbeat,slave每隔1s发送一个heartbeat




Enjoy Reading This Article?

Here are some more articles you might like to read next:

  • 2379. Minimum Recolors to Get K Consecutive Black Blocks
  • 2471. Minimum Number of Operations to Sort a Binary Tree by Level
  • 1387. Sort Integers by The Power Value
  • 2090. K Radius Subarray Averages
  • 2545. Sort the Students by Their Kth Score