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: