为了分担服务器压力,会在特定情况下部署多台服务器分别用于缓存的读和写操作,用以写操作的服务器称为主服务器,用以读操作的服务器称为从服务器。

从服务器通过 PSYNC 操作同步主服务器的写操作,并按照一定的时间间隔更新主服务器上新写入的内容。

Redis 主从复制的过程:

  1. Slave 与 master 建立连接,发送 psync 同步命令。
  2. Master 会启动一个后台进程,将数据库快照保存到文件中,同时 Master 主进程会开始收集新的写命令并缓存。
  3. 后台完成保存后,就将此文件发送给 Slave。
  4. Slave 将此文件保存到磁盘上。

Redis 主从复制特点:

  1. 可以拥有多个 slave。
  2. 多个 slave 可以连接同一个 master 外,还可以连接到其他的 slave。(当 master 宕机后,相连的 slave 转变为 master)
  3. 主从复制不会阻塞 master,在同步数据时, master 可以继续处理 client 请求。
  4. 提高了系统的可伸缩性。

从服务器的主要作用是响应客户端的数据请求,比如返回一篇博客信息。

上面说到了主从复制是不会阻塞 master 的,就是说在从服务器从主服务器复制数据时,主服务器的删改插入等操作继续进行不受影响。

如果在同步过程中,主服务器修改了一篇博客,而同步到从服务器上的博客是修改前的。这时候就会出现时间差,即修改了博客过后,在访问网站的时候还是原来的数据,这是因为从服务器还未同步最新的更改,这也就意味着非阻塞式的同步只能应用于对读数据延迟接受度较高的场景。

要建立这样一个主从关系的缓存服务器,只需要在从服务器端执行命令:

# SLAVEOF IPADDRESS:PORT
> SLAVEOF 127.0.0.1:6379

如果主服务器设置了连接密码,就需要在从服务器中事先设置好:

config set masterauth <password>

这样,当前服务器就作为 127.0.0.1:6379 下的一个从服务器,它将定期从该服务器复制数据到自身。

在以前的版本中(2.8以前),你应该慎用 redis 的主从复制功能,因为它的同步机制效率低下,可以想象每一次短线重连都要复制主服务器上的全部数据,算上网络通讯所耗费的时间,反而可能达不到通过 redis 缓存来提升应用响应速度的效果。但是幸运的是,官方在 2.8 以后推出了解决方案,通过部分同步来解决大量的重复操作。

这需要主服务器和从服务器都至少达到 2.8 的版本要求