REPLICAOF:将服务器设置为从服务器

注解

复制命令的命名变化

在很长的一段时间里,Redis 一直使用 SLAVEOF 作为复制命令,但是从 5.0.0 版本开始,Redis 正式将 SLAVEOF 命令改名成了 REPLICAOF 命令并逐渐废弃原来的 SLAVEOF 命令。因此,如果你使用的是 Redis 5.0.0 之前的版本,那么请使用 SLAVEOF 命令代替本章中的 REPLICAOF 命令,并使用 slaveof 配置选项代替本章中的 replicaof 配置选项。与此相反,如果你使用的是 Redis 5.0.0 或之后的版本,那么就应该使用 REPLICAOF 命令而不是 SLAVEOF 命令,因为后者可能会在未来的某个时候被正式废弃。

用户可以通过执行 REPLICAOF 命令,将接收这个命令的 Redis 服务器设置为另一个 Redis 服务器的从服务器:

  1. REPLICAOF host port

命令的 host 参数用于指定主服务器的地址,而 port 参数则用于指定主服务器的端口号。因为 Redis 的复制操作是以异步方式进行的,所以收到 REPLICAOF 命令的服务器在记录主服务器的地址和端口之后就会向客户端返回 OK ,至于实际的复制操作则会在后台开始执行。

现在,假设我们的客户端正连接着服务器 127.0.0.1:12345 ,如果我们想让这个服务器成为 127.0.0.1:6379 的从服务器,那么只需要执行以下命令即可:

  1. 127.0.0.1:12345> REPLICAOF 127.0.0.1 6379
  2. OK

在接收到 REPLICAOF 命令之后,主从服务器将执行数据同步操作:从服务器原有的数据将被清空,取而代之的是主服务器传送过来的数据副本。数据同步完成之后,主从服务器将拥有相同的数据。

在将 127.0.0.1:12345 设置为 127.0.0.1:6379 的从服务器之后,如果我们在主服务器 127.0.0.1:6379 执行以下命令,创建出一个 msg 键:

  1. 127.0.0.1:6379> SET msg "hello world"
  2. OK
  3.  
  4. 127.0.0.1:6379> GET msg
  5. "hello world"

那么这个 msg 键在从服务器 127.0.0.1:12345 上应该也能够访问到:

  1. 127.0.0.1:12345> GET msg
  2. "hello world"

通过配置选项设置从服务器

用户除了可以使用 REPLICAOF 命令将运行中的 Redis 服务器设置为从服务器之外,还可以通过设置 replicaof 配置选项,在启动 Redis 服务器的同时将它设置为从服务器:

  1. replicaof <host> <port>

比如说,通过执行以下命令,我们可以在启动服务器 127.0.0.1:10086 的同时,将它设置为 127.0.0.1:6379 的从服务器:

  1. $ redis-server --port 10086 --replicaof 127.0.0.1 6379

取消复制

在使用 REPLICAOF 命令或者 replicaof 配置选项将一个服务器设置为从服务器之后,我们可以通过执行以下命令,让从服务器停止进行复制,重新变回主服务器:

  1. REPLICAOF no one

服务器在停止复制之后不会清空数据库,而是会继续保留复制产生的所有数据。

比如说,对于之前设置的从服务器 127.0.0.1:12345 ,我们可以通过执行以下命令,让它停止进行复制,重新变回主服务器:

  1. 127.0.0.1:12345> REPLICAOF no one
  2. OK

命令返回 OK 表示复制已经停止。因为服务器在停止复制之后仍然会保留复制时产生的数据,所以我们可以继续访问之前设置的 msg 键:

  1. 127.0.0.1:12345> GET msg
  2. "hello world"

其他信息

属性
复杂度REPLICAOF 命令本身的复杂度为 O(1) ,但它引起的异步复制操作的复杂度为 O(N) ,其中 N 为主服务器包含的键值对总数量。REPLICAOF no one 命令的复杂度为 O(1) 。
版本要求REPLICAOF 命令从 Redis 5.0.0 版本开始可用。SLAVEOF 命令从 1.0.0 版本开始可用,但从 5.0.0 版本开始逐渐废弃。