1、主从架构的核心原理
主从架构的复制同步主要有两种,一种是全量复制,一种是增量复制。
(1)slave node启动,仅仅保存master node的信息,包括master node的host和ip,但是复制流程没开始
master host和ip是从哪儿来的,redis.conf里面的slaveof配置的
(2)slave node内部有个定时任务,每秒检查是否有新的master node要连接和复制,如果发现,就跟master node建立socket网络连接
(3)slave node发送ping命令给master node
(4)口令认证,如果master设置了requirepass,那么salve node必须发送masterauth的口令过去进行认证
(5)master node第一次执行全量复制
,将所有数据发给slave node,到这里才是开始全量复制
(6)master node后续持续将写命令,异步复制给slave node
1.1 全量复制
一般发生在slave
初始化的时候,也就是刚刚连接上master
,这个时候需要同步所有数据。
- 1.
slave
启动的时候,第一次请求全量复制,会给master
发送一个PSNYC
- 2.
msater
接收到PSYNC命令之后,由于是全量复制,所以是触发一次full resynchronization,使用BGSAVE命令(启动另一个后台线程)生成RDB文件,同时也会接收新的命令,把之后所有的写命令都放到缓冲区,也就是内存中。 - 3.
master
执行完BGSAVE命令之后,会将这个RDB快照文件发送给slave,如果rdb复制时间超过60秒(repl-timeout),那么slave node就会认为复制失败,可以适当调节大这个参数,对于千兆网卡的机器,一般每秒传输100MB,6G文件,很可能超过60s。发送期间继续接收数据,也是写到缓冲区。 - 4.
slave
接收到快照文件之后,会丢掉之前的旧数据,加载新的快照文件到内存中。 - 5.
master
发送完快照之后,会将内存中缓存的写命令发送给slave,slave也会同步这些数据。 - 6.
slave
加载完RDB快照文件之后,开始接收命令请求,同时会执行master
缓存区的写命令。如果slave node开启了AOF,那么会立即执行BGREWRITEAOF,重写AOF
master如果发现有多个slave node都来重新连接,仅仅会启动一个rdb save操作,用一份数据服务所有slave node。
master node有一个backlog,默认是1MB大小
master node给slave node复制数据时,也会将数据在backlog中同步写一份
backlog主要是用来做全量复制中断的增量复制的
1.2 增量复制
增量复制一般指slave和master已经稳定正常工作了,master会不断把自己的写操作,同步到slave上。
slave node如果跟master node有网络故障,断开了连接,会自动重连。重连会接着之前的地方继续复制,master直接从自己的backlog中获取部分丢失的数据,发送给slave node,默认backlog就是1MB,msater就是根据slave发送的psync中的offset来从backlog中获取数据的。
2、主从复制的断点续传
从redis 2.8开始,就支持主从复制的断点续传,如果主从复制过程中,网络连接断掉了,那么可以接着上次复制的地方,继续复制下去,而不是从头开始复制一份
master node会在内存中常见一个内存缓冲区(in-memory backlog),master和slave都会保存一个复制偏移量(replication offset)和master run id
,当连接断开时,slave会重新连接上master,然后请求继续复制,假如主从服务器的两个master run id
相同,并且指定的偏移量在内存缓冲区中还有效,复制就会从上次中断的点开始继续。如果其中一个条件不满足,就会进行完全重新同步(在2.8版本之前就是直接进行完全重新同步)。
因为主运行id不保存在磁盘中,如果从服务器重启了的话就只能进行完全同步了。
master会在自身不断累加offset,slave也会在自身不断累加offset
slave每秒都会上报自己的offset给master,同时master也会保存每个slave的offset
3、无磁盘化复制
2.8.18版本以及之后,支持无磁盘复制,主要考虑有些磁盘速度比较慢,复制会给master造成很大压力,所以master在内存中直接创建rdb,然后发送给slave,不会在自己本地落地磁盘了。
repl-diskless-sync repl-diskless-sync-delay,等待一定时长再开始复制,因为要等更多slave重新连接过来
4、过期key处理
slave不会过期key,只会等待master过期key。如果master过期了一个key,或者通过LRU淘汰了一个key,那么会模拟一条del命令发送给slave。
5、heartbeat和异步复制
主从节点互相都会发送heartbeat信息,master默认每隔10秒发送一次heartbeat,salve node每隔1秒发送一个heartbeat。
master每次接收到写命令之后,现在内部写入数据,然后异步发送给slave node。