1.redis主从架构的核心原理
redis主从架构依赖于主从复制,redis支持主从架构,当我们使用slaveof 命令(slaveof 192.168.0.0.255)对redis服务器进行设置后,即可将一个redis服务器设置为从服务器。从服务器默认为只读模式,不接收写请求,当对从服务器发起写请求时会报错。
redis主从复制包括依赖于三个机制:全量复制和增量复制两个过程。当服务器初始化启动时,从服务器会主从根据配置的master的ip和端口信息发起socket请求,建立连接。
1.全量复制(full resynchonization):服务器第一次启动,初始化时执行,master和slave第一次同步数据是全量同步。但要注意,全量复制是指redis的一种复制机制,不是特指redis初始化第一次执行的复制操作,在redis运行过程中也可以执行全量复制,可以通过命令触发。
2.当一个 master 实例和一个 slave 实例连接正常时, master 会发送一连串的命令流来保持对 slave的更新,以便于将自身数据集的改变复制给 slave :包括客户端的写入、key 的过期或被逐出等等。
3.增量复制:master在与salve的主从复制过程中,如果因网络等问题导致断开连接,重新连接后会执行增量复制过程,仅复制上次未同步的数据给slave。注意:增量复制是指redis断线重连后执行的操作,不是指redis正常运行中master往slave同步数据的过程。而且增量同步只有redis2.8以后的版本才支持,2.8以前的redis是不支持的,2.8以前的redis如果断线,重连后只会进行全量复制。
2、redis主从复制之全量复制
当启动一个slave node的时候,它会发送一个PSYNC命令给master node
如果这是slave node重新连接master node,那么master node仅仅会复制给slave部分缺少的数据; 否则如果是slave node第一次连接master node,那么会触发一次full resynchronization
开始full resynchronization的时候,master会启动一个后台线程,开始生成一份RDB快照文件,同时还会将从客户端收到的所有写命令缓存在内存中。RDB文件生成完毕之后,master会将这个RDB发送给slave,slave会先写入本地磁盘,然后再从本地磁盘加载到内存中。然后master会将内存中缓存的写命令发送给slave,slave也会同步这些数据。
slave node如果跟master node有网络故障,断开了连接,会自动重连。master如果发现有多个slave node都来重新连接,仅仅会启动一个rdb save操作,用一份数据服务所有slave node。
2、主从复制的断点续传(也叫部分复制)
redis2.8之前是不支持断点续传,
从redis 2.8开始,就支持主从复制的断点续传,如果主从复制过程中,网络连接断掉了,那么可以接着上次复制的地方,继续复制下去,而不是从头开始复制一份
master node会在内存中常见一个backlog,master和slave都会保存一个replica offset还有一个master id,offset就是保存在backlog中的。如果master和slave网络连接断掉了,slave会让master从上次的replica offset开始继续复制
但是如果没有找到对应的offset,那么就会执行一次resynchronization
3、无磁盘化复制
master在内存中直接创建rdb,然后发送给slave,不会在自己本地落地磁盘了
通过配置repl-diskless-sync
repl-diskless-sync-delay,等待一定时长再开始复制,因为要等更多slave重新连接过来
4、过期key处理
slave不会过期key,只会等待master过期key。如果master过期了一个key,或者通过LRU淘汰了一个key,那么会模拟一条del命令发送给slave。