⼀、主从模式配置
Redis主从大家不陌生,但不会经常配置主从,所以先简单看下主从配置。
1、主从模式
Redis中设置主从的方式很简单,有两种:
配置文件redis.conf中设置slaveof方式(永久)。
直在客户端执⾏slaveof ip port的方式(临时)。
2、主-从-从模式
主-从-从的模式的配置也与上边操作类似,在这里就不赘述了。
⼆、主从⼀致性原理
了解主从配置后咱们进入正题。
主从中,通常是主库写数据,从库读数据,避免所有请求压力都打在主库,系统的伸缩性也得到很大提升。
接下来就考虑主从库数据一致问题,这时需要主库数据写入后同步到从库。
1、全量复制
这一步是第一次主从同步所发生的传递关系,这时主库把所有数据都发给从库。
看下过程:
图中同步流程很清晰,分为三部分:
(1)主从节点建⽴联系
当从节点与主节点第⼀次建立连接时,从节点会向主节点发送psync命令,请求进行数据同步。
psync命令后有两个参数,⼀是runID,⼀是偏移量offset,含义如下:
runID:各Redis实例生成的随机唯⼀的ID,在这里表示主节点的ID。
offset:复制偏移量。
上图第一次复制因从库不知道主库ID和偏移量,因此⽤“?”和“-1”分别来表示runID和offset,之后当主节点收到psync命令后,会使⽤FULLSYNC命令向从节点发送runID及offset两个参数,从节点将其信息保存下来,到这一步,主从关系建立完成。
(2)主节点同步RDB⽂件
RDB文件,大家都知道是持久化时用的二进制文件,在这里起着主从数据同步的作用,也就是说主从同步是依赖RDB文件来实现的。
从节点收到RDB文件后,在本地完成数据加载,算是完成了第一次主从同步。
再看下RDB文件是如何生成?
父进程fork⼀个子进程来进行生成RDB文件,父进程不阻塞接收处理客户端的命令。
这时就会产生另外一个问题了,主节点把RDB文件发送给从节点时,主节点同时接收的命令又是怎么处理的?
(3)主节点同步缓冲区命令
这是解决RDB文件生成后,父进程又收到写命令进行主从同步的问题的。
为保证主从节点数据的⼀致,主节点中会使用缓冲区来记录RDB文件生成后接收到的写操作命令,在RDB文件发送完成后会把缓冲区的命令发送给从节点来执⾏。
到这,主从节点的数据同步算是完成了。
2、级联操作
完整主从同步流程:从建立关系,到生成RDB文件传输给从节点,最后将缓冲区命令发送给从节点。
再考虑另外一种场景:当有多个从节点,也就是一主多从时,第一次连接时都要进行全量复制,但是在生成RDB文件时,父进程fork子进程时可能会出现阻塞,同时在传输RDB文件也会占用带宽,浪费资源。
这该怎么办呢?
我们可以通过对从节点再建立从节点,同步数据时从级联的从节点上进行同步,就减轻了主节点的压⼒。
三、网络开小差
这里有个【增量复制】名词,与全量复制不同,它表示根据主从节点偏移量来进行数据同步。
我们把全量复制里存储生成RDB文件后的写命令的缓冲区简称为缓冲区A,主从节点断开连接后,除了会将后续接收到的写命令写入缓冲区A的同时,还会写⼊到另一个缓冲区B里。
缓冲区B里,主从节点分别会维护⼀个偏移量offset,开始时,主节点的写位置与从节点的读位置在同⼀起点,随着主节点的不断写⼊,偏移量也会逐渐增⼤,同样从节点复制完后偏移量也会不断增加。
当网络断开时,从节点不再进行同步,此时主节点由于不断接收新的写操作的偏移量会大于从节点的偏移量,当连接恢复时,从节点向主节点发送带有偏移量的psync命令,主节点根据偏移量来进行⽐较,只将未同步写命令同步给从节点。
四、总结
主从⼀致性原理
(1)从节点首次连接时,主节点会生成RDB文件进行全量复制,同时将新写⼊的命令存进缓冲区,发给从节点,从而保证数据一致性。
(2)为减少数据同步给主节点带来的压力,可通过从节点级联方式进行同步。
网络开小差
(1)网络断连重连后,主从节点通过各自维护的偏移量同步写命令。
以上为个人认知,如有侵权请联系删除。