Redis复制的启动过程

上面曾将说过,从服务器在连接一个主服务器的时候,主服务器会创建一个快照文件并将其发送至从服务器,但这只是主从复制执行的其中一步,下表完整的列出了当从服务器连接主服务器时,主从服务器执行的所有操作:

步骤 主服务器操作 从服务器操作
1 (等待命令进入) 连接(或者重连接)主服务,发送sync命令。
2 开始执行bgsave,并使用缓冲区记录bgsave之后执行的所有写命令 根据配置选项来决定是继续使用现有的数据(如果有的话)来处理客户端的命令请求,还是向发送请求的客户端返回错误。
3 bgsave执行完毕,向从服务器发送快照文件,并在发送期间继续使用缓冲区记录被执行的写命令 丢弃所有旧数据(如果有的话),开始载入主服务器发来的快照文件。
4 快照文件发送完毕,开始向从服务器发送存储在缓冲区里面的写命令。 完成对快照文件的解释操作,像往常一样开始接受命令请求。
5 缓冲区存储的写命令发送完毕;从现在开始,每执行一个写命令,就向从服务器发送相应的写命令。 执行主服务器发送的所有存储在缓冲区里面的写命令;并从现在开始,接受并执行主服务传来的每个写命令。

Redis在复制进行期间也会尽可能地处理接受到的命令请求,但是,如果主从服务器之间的网络带宽不足,或者主服务器没有足够的内存来创建子进程和创建记录写命令的缓冲区,那么Redis处理命令请求的效率会受到影响。因此,尽管这并不是必需的,但在实际中华最好还是让主服务器只使用50%~65%的内存,预留30%~45%烦人内存用于执行bgsave命令和创建记录写命令的缓冲区。

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

从服务器在运行同步时,会清空自己的所有数据:

因为有些用户在第一次使用从服务器时会忘记这件事,所以在这里要特别提醒一下:从服务器在于主服务器进行初始连接时,数据库中原有的所有数据将丢失,并被替换成主服务器发送来的数据。


警告:Redis不支持主主复制:

因为Redis允许用户在服务器启动之后使用slaveof命令来设置从服务器选项,所以可能会有读者误以为可以通过将两个Redis实例互相设置为对方的主服务器来实现多主复制,遗憾的是,这种做法是行不通的:被互相设置为主服务器的两个Redis实例只会持续的占用大量处理器资环并持续不断的尝试与对方进行通信,根据客户端链接的服务器的不同,客户端的请求可能会得到不一致的数据或者完全得不到数据。

当多个从服务器尝试连接同一个主服务器的时候,机会出现下表所示的两种情况中的一种:

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

在大部分情况下,Redis都会尽可能地减少复制所需的工作,然而,如果从服务器连接主服务器的时间并不凑巧,那么主服务器就需要多做一些额外的工作,。另一方面,当多个从服务器同时连接主服务器的时候,同步多个主服务器所占用的宽带可能会使得其他命令请求难以传递给主服务器,与主服务器位于同一网络中的其他硬件的网速可能也会因此而降低。

results matching ""

    No results matching ""