1. 什么是主从复制
在Redis客户端通过info replication可以查看与复制相关的状态,对于了解主从节点的当前状态,以及解决出现的问题都会有帮助。
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。
默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
2. 主从复制的作用
- 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
- 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
- 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
- 读写分离:可以用于实现读写分离,主库写、从库读,读写分离不仅可以提高服务器的负载能力,同时可根据需求的变化,改变从库的数量;
- 高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
3. 主从复制开启三种方式
- 配置文件: 在从服务器的配置文件中加入:
slaveof <masterip> <masterport>
- 启动命令:redis-server启动命令后加入
--slaveof <masterip> <masterport>
- 客户端命令: Redis服务器启动后,直接通过客户端执行命令:
slaveof <masterip> <masterport>
,则该Redis实例成为从节点
4. 主从复制关闭方式
- 队于一个正在运行的Redis服务器,用户可以通过
SLAVEOF ON ONE
命令来让服务器终止复制 - 也可以通过
SLAVEOF <masterip> <masterport>
来让服务器开始复制新的主服务器
5. 主从复制的过程
- 从服务器连接到主服务器,发送SYNC命令.
- 主服务器开始执行BGSAVE,并使用缓冲区记录BGSAVE之后执行的所有命令,从服务器根据配置选项来决定继续使用现有的数据来处理客户端的命令请求还是想发送请求的客户端返回错误.
- BGSAVE执行完成,向从服务器发送快照文件,并在发送期间继续使用缓存区记录被执行的写命令.从服务器丢弃所有旧数据,开始载入主服务器发来的快照文件
- 主服务器快照文件发送完成,开始向从服务器发送存储再缓冲区的写命令,从服务器完成对快照文件的解析操作,开始接受命令请求
- 主服务器缓冲区存储的写命令发送完成,并且每执行一条写命令都会向从服务器发送相同的写命令.从服务器执行主服务器发来的所有存储在缓冲区里的写命令,并且接受并执行主服务器发来的每个写命令
当多个从服务器尝试连接同一个主服务器时**,如果主服务器未开始执行完BGSAVE向从服务器发送快照文件时,所有的从服务器都会接收到相同的快照文件和相同的缓冲区写命令;当主服务器正在执行或已经执行完毕BGSAVE向从服务器发送快照文件时,主服务器会和较早连接的从服务器执行完复制所需的步骤,之后再与新连接的从服务器执行一次新的复制步骤.
大部分情况下,Redis都会尽可能的减少复制所需要的工作,但是如果从服务器连接的时间不凑巧,那么主服务器就会多做一些额外的工作.另外同步多个从服务器需要的带宽可能会是其他命令请求难以传递给主服务器,与主服务器位于同一网络中的其他硬件网速可能会降低.
6.全量复制和部分复制
在Redis2.8以前,从节点向主节点发送sync命令请求同步数据,此时的同步方式是全量复制;
在Redis2.8以后,从节点可以发送psync命令请求同步数据,此时根据主从节点当前状态的不同,同步方式可能是全量复制或部分复制。
全量复制:用于初次复制或其他无法进行部分复制的情况,将主节点中的所有数据都发送给从节点,是一个非常重型的操作。
部分复制:用于网络中断等情况后的复制,只将中断期间主节点执行的写命令发送给从节点,与全量复制相比更加高效。需要注意的是,如果网络中断时间过长,导致主节点没有能够完整地保存中断期间执行的写命令,则无法进行部分复制,仍使用全量复制。
如果多个Slave断线了,需要重启的时候,因为只要Slave启动,就会发送sync请求和主机全量同步,当多个同时出现的时候,可能会导致Master IO剧增宕机。
7.部分复制过程
- 如果网络抖动(连接断开 connection lost)
- 主机master 还是会写 replbackbuffer(复制缓冲区)
- 从机slave 会继续尝试连接主机
- 从机slave 会把自己当前 runid 和偏移量传输给主机 master,并且执行 pysnc 命令同步
- 如果 master 发现你的偏移量是在缓冲区的范围内,就会返回 continue 命令
- 同步了 offset 的部分数据,所以部分复制的基础就是偏移量 offset。