redis的复制是在主节点(master)和从节点(slave)间进行的。默认情况下,redis都是主节点,每一个主节点可以同时具有多个从节点,而每个从节点只能有一个主节点。redis复制是单向数据流,即复制只能由主节点复制给从节点。
一、配置
1、建立复制
redis提供了三种配置方式:
1)在配置文件中加入slaveof{masterHost}{masterPort}随Redis启动生效。
2)在redis-server启动命令后加入--slaveof{masterHost}{masterPort}生效。
3)直接使用命令:slaveof{masterHost}{masterPort}生效。
主从节点复制成功建立后,可以使用info replication命令查看复制相关状态。默认情况下,从节点使用slave-read-only=yes配置为只读模式,因为数据只能由主节点复制给从节点,修改从节点数据会导致主从数据不一致,所以一般不建议修改slave-read-only这个参数。
2、断开复制
在从节点上执行slaveof no one命令将会断开复制,同时从节点晋升为主节点。
二、拓扑
redis复制图谱图大致可以分为以下三种:一主一从、一主多从、树状主从结构
1、一主一从
作用:1)用于主节点出现宕机时从节点提供故障转移支持。
2)高并发场景下,需要持久化时,可以只在从节点上开启AOF,避免主节点AOF对性能的影响。
当主节点关闭持久化功能时,需要避免自动重启操作。由于主节点上的数据集为空,重启后从节点也会清空自身数据集。因此,安全的做法是首先在从节点上执行slaveof no one命令,再重启主节点。
2、一主多从
优点:1)在读占比比较大的场景下,可以把读命令发送到从节点执行,降低主节点的压力。
2)一些比较耗时的读命令可以在从节点上执行,避免线上主节点阻塞。
缺点:在写占比比较大的场景下,多个从节点会导致主节点写命令多次发送而过度消耗网络带宽,影响主节点性能。
3、树状主从结构
树状主从结构中,从节点不但可以复制主节点数据,同时可以作为其他从节点的主节点继续向下层复制。该结构可以有效
降低主节点负载和需要传送给从节点的数据量。因此当需要挂载多个从节点时,为了避免对主节点的性能干扰,可以使用树状主从结构。
三、原理
1、复制过程
复制过程大致可分为6个步骤:保存主节点信息 、主从建立socket连接、发送ping命令、权限验证、同步数据集、命令持续复制。具体流程如下:
1)从节点执行slaveof命令,只保存主节点的地址信息便直接返回。
2)从节点(slave)内部通过每秒运行的定时任务维护复制相关逻辑,当定时任务发现存在新的主节点后,会尝试与该节点建立
网络连接
3)连接建立成功后从节点发送ping请求进行首次通信,如果此时从节点没有收到返回消息,则会断开连接待下次定时任务会发起重连。
4)如果主节点设置了requirepass参数,则需要密码验证。
5)主从复制连接正常通信后,对于首次建立复制的场景,主节点会把持有的数据全部发送给从节点。
6)命令持续复制。当主节点把当前的数据同步给从节点后,便完成了复制的建立流程。接下来主节点会持续地把写命令发送给
从节点,保证主从数据一致性。
2、数据同步
全量复制:一般用于初次复制场景,主节点将全部数据一次性的发给从节点,数据量较大时会对主从节点和网络造成很大开销。
部分复制:用于处理在主从复制中因网络闪断等原因造成的数据丢失场景,当从节点再次连上主节点后,如果条件允许,主
节点会补发丢失数据给从节点。
redis从2.8版本之后使用psync命令进行复制,该命令主要依靠主从节点复制偏移量、主节点积压缓冲区、主节点id来完成。
psync{runId}{offset}
主从节点复制偏移量:参与主从复制的节点都会维护自身的复制偏移量,如下图所示主节点通过info replication可以查看主从节点的复制偏移量offset。通过对比主从节点的复制偏移量,可以判断主从节点数据是否一致。
复制积压缓冲区:复制积压缓冲区是保存在主节点上的一个固定长度的队列,默认大小为1MB,当主节点有连接的从节点
(slave)时被创建,这时主节点(master)响应写命令时,不但会把命令发送给从节点,还会写入复制积压缓冲区。
主节点id:主节点唯一表示id,重启后会,ID会随之改变。(debug reload命令重启可以保证id不变)
全量复制过程:
部分复制过程: