分布式与集群

Redis 主从复制

2019-03-22  本文已影响0人  Lin_Shao

概述

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

主从复制的作用主要包括:

主从复制的流程

建立连接阶段

image.png

数据同步阶段

主从节点之间的连接建立以后,便可以开始进行数据同步,该阶段可以理解为从节点数据的初始化。具体执行的方式是:从节点向主节点发送psync命令(Redis2.8以前是sync命令),开始同步。

数据同步阶段是主从复制最核心的阶段,根据主从节点当前状态的不同,可以分为全量复制部分复制

需要注意的是,在数据同步阶段之前,从节点是主节点的客户端,主节点不是从节点的客户端;而到了这一阶段及以后,主从节点互为客户端。原因在于:在此之前,主节点只需要响应从节点的请求即可,不需要主动发请求,而在数据同步阶段和后面的命令传播阶段,主节点需要主动向从节点发送请求(如推送缓冲区中的写命令),才能完成复制。

全量 or 部分

由于全量复制在主节点数据量较大时效率太低,因此Redis2.8开始提供部分复制,用于处理网络中断时的数据同步。部分复制的实现,依赖于三个重要的概念:

判断流程

image.jpeg
全量复制
image.png

1、主节点接收到全量同步的请求时,fork一个子进程进行bgsave,同时将接下来的写操作保存至复制缓冲区;
2、RDB保存完毕后,向从服务器发送;
3、从服务器清除当前的内存数据
4、阻塞客户端请求,拒绝服务
5、从RDB加载数据,执行这些写命令,将数据库状态更新至主节点的最新状态
6、若开启了AOF,则会触发bgrewriteaof的执行,从而保证AOF文件更新至主节点的最新状态

部分复制

在部分复制阶段,从服务器只要拉取并执行部分主服务的写命令即可。

命令传播阶段

当从服务器完成了对主服务器的同步操作,就进入了命令传播阶段。在这个阶段,主服务器会将自己的写命令同步给从服务器,从而保持数据一致性

除了发送写命令,主从节点还维持着心跳机制:PING和REPLCONF ACK。心跳机制对于主从复制的超时判断、数据安全等有作用。

主 -> 从:PING

每隔指定的时间,主节点会向从节点发送PING命令,这个PING命令的作用,主要是为了让从节点进行超时判断。

PING发送的频率由repl-ping-slave-period参数控制,单位是秒,默认值是10s。

从 -> 主:REPLCONF ACK

在命令传播阶段,从节点会向主节点发送REPLCONF ACK命令,频率是每秒1次。

命令格式为:REPLCONF ACK {offset},其中offset指从节点保存的复制偏移量。

REPLCONF ACK命令的作用包括:

问题

数据一致性问题
连接超时

意义

判断机制
主从复制超时判断的核心,在于repl-timeout参数,该参数规定了超时时间的阈值(默认60s),对于主节点和从节点同时有效;主从节点触发超时的条件分别如下:

问题
连接超时会使主从进入重连阶段,若超时时间较短,而进入部分同步阶段,此时从服务器阻塞;若超时时间较长,则进入全量同步阶段,主服务器需要消耗大量的内存和cpu时间用于bgsave,同时rdb的传输会占据主服务器的大部分带宽,直接影响了主服务器的吞吐量。在加载RDB阶段,从服务器会阻塞客户端请求,拒绝服务。所以我们应该尽量避免超时问题。

实际问题:

上一篇下一篇

猜你喜欢

热点阅读