05.简单了解redis replication核心原理/断点续传/无磁盘化复制以及master持久化的意义

一、redis replication核心原理


(1) 当启动一个 slave node 的时候,它会发送一个 PSYNC 命令给 master node。
(2) 如果这是 slave node 初次连接到 master node,那么会触发一次 full resynchronization 全量复制。
(3) 此时 master 会启动一个后台线程,开始生成一份 RDB 快照文件,同时还会将从客户端 client 新收到的所有写命令缓存在内存中。
(4) master 会将这个 RDB 发送给 slave,slave 会先写入本地磁盘,然后再从本地磁盘加载到内存中
(5) 接着 master 会将内存中缓存的写命令发送到 slave,slave 也会同步这些数据。
(6) slave node 如果跟 master node 有网络故障,断开了连接,会自动重连,连接之后 master node 仅会复制给 slave 部分缺少的数据。
在这里插入图片描述


二、redis replication的核心机制


  • redis采用异步方式复制数据到slave节点,不过redis 2.8开始,slave node会周期性地确认自己每次复制的数据量
  • 一个master node是可以配置多个slave node的
  • slave node也可以连接其他的slave node
  • slave node做复制的时候,是不会block master node的正常工作的
  • slave node在做复制的时候,也不会block对自己的查询操作,它会用旧的数据集来提供服务;
    但是复制完成的时候,需要删除旧数据集,加载新数据集,这个时候就会暂停对外服务了
  • slave node主要用来进行横向扩容,做读写分离,扩容的slave node可以提高读的吞吐量


三、replication的断点续传


如果主从复制过程中,网络连接中断,那么可以接着上次复制的地方,继续复制下去,而不是从头开始复制一份

原理:

master node 会在内存中维护一个 backlog,master 和 slave 都会保存一个 replica offset和一个 master run id,offset 就是保存在 backlog 中的。如果 master 和 slave 网络连接断掉了,slave 会让 master 从上次的offset 开始继续复制,如果没有找到对应的 offset,那么就会执行一次 resynchronization


四、无磁盘化复制


master在内存中直接创建rdb,然后发送给slave,不会在自己本地落地磁盘了

适用情况:因为磁盘传输性能比较低,网络带宽允许的情况下可以考虑使用diskless模式。
配置如下:

repl-diskless-sync no
repl-diskless-sync-delay 5

开启diskless模式,在主机开始同步之前需要等待所有slave的到来,并将传输任务缓存到传输队列。默认主机等待时间是5秒,如果设置为0时候,传输就不会等待所有从机的到来。


五、过期key处理


  • slave不会过期key,只会等待master过期key。

  • 如果master过期了一个key,或者通过LRU淘汰了一个key,那么会模拟一条del命令发送给slave。


六、master持久化对于主从架构的安全保障的意义


如果采用了主从架构,那么建议必须开启master node的持久化!不建议用slave node作为master node的数据热备。

原因分析
  1. 如果你关掉master的持久化,那么master的数据都存储在内存中,此时master宕机后是没有本地数据可以恢复的,然后就会直接认为自己的数据是空的,重启后master就会将空的数据集同步到slave上去,所有slave的数据全部清空,这样所有slave数据都丢失了。
  2. 即使采用了哨兵模式,slave node可以自动接管master node,但是也可能sentinal还没有检测到master failure,master node就自动重启了,还是可能导致上面的所有slave node数据清空故障
总结

master节点,必须要使用持久化机制,master的各种备份方案,还要考虑本地文件丢失的情况; 从备份中挑选一份rdb去恢复master; 这样才能确保master启动的时候,是有数据的

posted @ 2020-08-29 22:03  MrMirror  阅读(555)  评论(1编辑  收藏  举报