赞
踩
在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave),如图所示。
举个例子。假设现在有两个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的从服务器,而服务器6379则会称为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的复制宫嗯那个分为同步(sync)和命令传播(command propagate)两个操作:
当客户端向从服务器发送SLAVEOF命令,要求从服务器复制主服务器时,从服务器首先需要执行同步操作,也即是,将从服务器的数据库状态更新至主服务器当前所处的数据库状态。从服务器对主服务器的同步操作需要通过向主服务器发送SYNC命令来完成,以下是SYNC命令的
执行步骤:
在同步操作执行完毕之后,主从服务器两者的数据库将达到一致状态,但这种一致并不是一成不变的,每当主服务器执行客户端发送的写命令时,主服务器的数据库就有可能会被修改,并导致主从服务器状态不再一致。
举个例子,假设一个主服务器和一个从服务器刚刚完成同步操作,它们的数据库都保存了相同的五个键k1至k5,如图所示,如果这是,客户端向主服务器发送命令DEL k3,那么主服务器在执行完这个DEL命令之后,主从服务器的数据库将出现不一致:主服务器的数据库已经不再包含键
k3,但这个键却仍然包含在从服务器的数据库里面,如图所示.
为了让主从服务器再次回到一致状态,主服务器需要对从服务器执行命令传播操作:主服务器会将自己执行的写命令,也即是造成主从服务器不一致的那条写命令,发送给从服务器执行,当从服务器执行了相同的写命令之后,主从服务器将再次回到y一致状态。
在上面的例子中,主服务器因为执行了命令DEL k3而导致主从服务器不一致,所以主服务器将向从服务器发送相同的命令DEL k3。当从服务器执行完这个命令之后,主从服务器将再次回到一致状态,现在主从服务器两者的数据库都不再包含键k3
在Redis2.8以前,从服务器对主服务器的复制可以分为以下两种情况:
举个例子。在时间10091,从服务器终于重新连接上主服务器,因为这是主从服务器的状态已经不再一致,所以从服务器将向主服务器发送SYNC命令,而主服务器会将包含键k1至键k10089的RDB文件发送给从服务器,从服务器通过接收和载入这个RDB文件来将自己的数据库更新至主服务器数据库当前所处的状态。
虽然再次发送SYNC命令可以让主从服务器重新回到一致状态,但如果仔细研究过这个断线重复制过程,就会发现传送RDB文件这一步实际上并不是非做不可的:
SYNC命令是一个非常耗费资源的操作。每次执行SYNC命令主从服务器需要执行以下动作:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。