如果想实现扩展平台以适应更高负载,复制(replication)是不可或缺的。复制可以让其他服务器拥有一个不断更新的数据副本,从而使得拥有数据副本的服务器可以用于处理客户端发送的请求。

在需要扩展读请求的时候,或者在需要写入临时数据的时候,用户可以通过设置额外的Redis从服务器来保存数据集的副本。在接收到主服务器发送的数据初始副本(initial copy of the data)之后,客户端每次向主服务器进行写入时,从服务器都会实时地得到更新。在部署好主从服务器之后,客户端就可以向任意一个从服务器发送读请求,不必把每个读请求都发送给主服务器(客户端通常会随机地选择使用哪个服务器,从而将负载平均分配到各个从服务器上)。

复制相关选项配置
主服务器需要设置持久化配置选项中的dir选项和dbfilename选项,并且这两个选项所指示的路径和文件对于Redis进程都是可写的(writeable)。

有多个不同的选项可以控制从服务器自身的行为,但开启从服务器所必须的选项只有slaveof一个。如果用户在启动Redis服务器的时候,指定一个包含slaveof host port选项的配置文件,Redis服务器将根据该选项给定的IP地址和端口号来连接主服务器。对于一个正在运行的Redis服务器,用户可以通过发送SLAVEOF no one命令让服务器终止复制操作,不在接受主服务器的数据更新;也可以通过发送SLAVEOF host port命令来让服务器开始复制一个新的主服务器。

复制的启动过程

从服务器连接主服务器的步骤
图片描述

图1

如图1所示,Redis在复制进行期间也会尽可能的地处理接收到的命令请求,如果主从服务器之间的网络宽带不足,或者主服务器没有足够的内存来创建子进程和创建记录写命令的缓冲区,Redis处理命令请求的效率会受影响。实际中最好让主服务器只使用50%~65%的内存,留下30%~45%的内存用于执行BGSAVE命令和创建记录写命令的缓冲区。

用户既可通过配置选项SLAVEOF host port来将一个Redis服务器设置为从服务器,也可通过向运行中的Redis服务器发送SLAVEOF命令来将其设置为从服务器。如果用户使用的是SLAVEOF配置选项,那么Redis在启动时首先会载入当前可用的任何快照文件或AOF文件,然后连接主服务器并执行如图1所示的复制过程。如果用户使用的是SLAVEOF命令,那么Redis会立即尝试连接主服务器,并在连接成功后,开始如图1所示的复制过程。

从服务器在与主服务器进行初始连接时,数据库中原有的所有数据都将丢失,并被替换成主服务器发来的数据。

当多个从服务器尝试连接同一个主服务器时,就会出现以下两种情况中的其中一种:

  • 当有新的从服务器连接主服务器时,图1的步骤3尚未执行,主服务器的操作:所有从服务器都会接收到相同的快照文件和相同的缓冲区写命令。
  • 当有新的从服务器连接主服务器时,图1的步骤3正在执行或者已经执行完毕,主服务器的操作:当主服务器与较早进行连接的从服务器执行完复制所需的5个步骤之后,主服务器会与新连接的从服务器执行一次新的步骤1至步骤5。

parvin
424 声望26 粉丝