前言

  Redis高可用的方案包括持久化、主从复制(及读写分离)、哨兵和集群。其中持久化侧重解决的是Redis数据的单机备份问题(从内存到硬盘的备份);而主从复制则侧重解决数据的多机热备。此外,主从复制还可以实现负载均衡和故障恢复。

 

概念 

  主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。

默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

 

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

  1. 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
  2. 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
  3. 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
  4. 高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

测试

1. 准备两个实例

  方便起见,测试所使用的主从节点是在一台机器上的不同Redis实例,其中主节点监听6379端口,从节点监听6380端口;从节点监听的端口号可以在配置文件中修改:

  Redis 主从复制_redis

  在cmd中输入: redis-server.exe redis.windows.conf

  启动后可以看到:

  Redis 主从复制_主从复制_02

  两个Redis节点启动后(分别称为6379节点和6380节点),默认都是主节点。

2.建立复制

  此时在6380节点执行slaveof命令,使之变为从节点:

  Redis 主从复制_主从复制_03

3.观察效果

  下面验证一下,在主从复制建立后,主节点的数据会复制到从节点中。

(1)首先在从节点查询一个不存在的key:

Redis 主从复制_主从复制_04

(2)然后在主节点中增加这个key:

Redis 主从复制_主从复制_05

(3)此时在从节点中再次查询这个key,会发现主节点的操作已经同步至从节点:

Redis 主从复制_数据_06

(4)然后在主节点删除这个key:

Redis 主从复制_高可用_07

(5)此时在从节点中再次查询这个key,会发现主节点的操作已经同步至从节点:

Redis 主从复制_服务器_08

(6) 从节点不能执行写操作和删除操作

Redis 主从复制_服务器_09

4.断开复制

  通过slaveof <masterip> <masterport>命令建立主从复制关系以后,可以通过slaveof no one断开。需要注意的是,从节点断开复制后,不会删除已有的数据,只是不再接受主节点新的数据变化。

Redis 主从复制_数据_10

 

全量复制和部分复制

  1. 全量复制:用于初次复制或其他无法进行部分复制的情况,将主节点中的所有数据都发送给从节点,是一个非常重型的操作。
  2. 部分复制:用于网络中断等情况后的复制,只将中断期间主节点执行的写命令发送给从节点,与全量复制相比更加高效。需要注意的是,如果网络中断时间过长,导致主节点没有能够完整地保存中断期间执行的写命令,则无法进行部分复制,仍使用全量复制。