第15章 复制

在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave),如图15-1所示。

图15-1 主服务器和从服务器

假设现在有两个Redis服务器,地址分别为127.0.0.1:6379和127.0.0.1:12345,如果我们向服务器127.0.0.1:12345发送以下命令:



127.0.0.1:12345> SLAVEOF 127.0.0.1 6379
OK

那么服务器127.0.0.1:12345将成为127.0.0.1:6379的从服务器,而服务器127.0.0.1:6379则会成为127.0.0.1:12345的主服务器。

进行复制中的主从服务器双方的数据库将保存相同的数据,概念上将这种现象称作“数据库状态一致”,或者简称“一致”。

比如说,如果我们在主服务器上执行以下命令:



127.0.0.1:6379> SET msg "hello world"
OK

那么我们应该既可以在主服务器上获取msg键的值:



127.0.0.1:6379> GET msg
"hello world"

又可以在从服务器上获取msg键的值:



127.0.0.1:12345> GET msg
"hello world"

另一方面,如果我们在主服务器中删除了键msg:



127.0.0.1:6379> DEL msg
(integer) 1

那么不仅主服务器上的msg键会被删除:



127.0.0.1:6379> EXISTS msg
(integer) 0

从服务器上的msg键也应该会被删除:



127.0.0.1:12345> EXISTS msg
(integer) 0

关于复制的特性和用法还有很多,Redis官方网站上的《复制》文档(http://redis.io/topics/replication)已经做了很详细的介绍,这里不再赘述。

本章首先介绍Redis在2.8版本以前使用的旧版复制功能的实现原理,并说明旧版复制功能在处理断线后重新连接的从服务器时,会遇上怎样的低效情况。

接着,本章将介绍Redis从2.8版本开始使用的新版复制功能是如何通过部分重同步来解决旧版复制功能的低效问题的,并说明部分重同步的实现原理。

在此之后,本章将列举SLAVEOF命令的具体实现步骤,并在本章最后,说明主从服务器心跳检测机制的实现原理,并对基于心跳检测实现的几个功能进行介绍。