本文主要介绍redis主从复制的原理和配置方式

更新于 2021-04-18


redis支持简单且易用的主从复制功能,该功能可以让从服务器成为主服务器的精确复制品。


redis主从复制重要方面

  • redis使用异步复制,redis从服务器会每秒一次向主服务器报告复制流处理进度;
  • 一个主服务器可以有多个从服务器,从服务器也可以有自己的从服务器;
  • 复制功能不会阻塞主服务器,即使有多个从服务器正在进行数据同步;
  • 复制功能不会阻塞从服务器,只要redis.conf进行了配置,即使从服务器进行初次数据同步,服务器也可以使用旧数据进行查询,但是在从服务器删除旧版数据载入新版数据期间会阻塞;
  • 复制功能可以单纯用于数据冗余,也可以通过让从服务器处理只读命令来提升扩展性;
  • 可以通过复制功能让主服务器不进行持久化操作,只要关闭主服务器持久化功能,让从服务器进行持久化即可;

在使用主从复制时如果关闭了主节点的持久化,则应该避免在主节点服务宕机后自动拉起,例如下面的例子:

  1. A节点作为主,关闭了持久化;B和C作为从,从A节点复制数据;
  2. 某时刻A宕机,然后自动或手动重启了A的服务,由于A没有持久化数据导致A的数据为空;
  3. B和C从A复制数据发现数据为空,于是B和C也删除了自己的数据;

所以在主节点关闭持久化的情况下自动拉起服务是非常危险的。


复制功能原理

  1. 当建立一个从服务器时,从服务器向主服务器发送PSYNC命令,接到该命令的主服务器开始执行BGSAVE,并在保存操作执行期间将所有新的写入命令保存到一个缓冲区;
  2. 执行完BGSAVE后,主将保存的rdb文件发送给从,从接受这个文件并将文件中的数据写入自己的内存;
  3. 之后主以redis命令协议的格式将命令缓冲区积累的内容发送到从服务器;

每次主从同步的时候都会比较一下和从的数据偏移量是否一致,不一致则全量数据同步,一致则进行部分数据同步。

如果是大内存并且在高频次写入时进行数据同步会有个问题:

  • 主将进行BGSAVE操作,并把操作期间的写入命令保存在缓冲区;由于缓冲区大小有限,如果写入量很大则可能超过缓冲区大小,会导致主从之间不停地进行全量数据同步;
  • 主进行BGSAVE操作产生的rdb文件很大,如果在传输期间有网络波动很可能导致传输失败,不得不重新进行全量同步;

配置主从复制

从服务器配置,修改配置文件,在配置文件中加入如下的一行,指定主服务器的地址和端口:

1
slaveof 10.10.99.100 6379

或者使用命令行的方式指定主服务器,在从服务器命令行输入下面的命令开始主从同步:

1
127.0.0.1:6379> SLAVEOF 10.10.99.100 6379

生产建议使用命令的方式指定复制地址;

创建完成后可以在主和从上分别执行下面的指令查看角色:

1
10.10.62.17:6379> INFO replication

只读从服务器

如果是从服务器,默认是只读模式,将拒绝任何写入命令

只读模式可以由redi.conf配置文件中slave-read-only来进行控制。


主从切换

在将从服务器提升为主的时候,需要执行下面的命令:

1
127.0.0.1:6379> SLAVEOF NO ONE