Redis复制

2018-08-17  本文已影响29人  JingQ

Redis的单机模式不难,配置文件参数了解具体含义,设定业务上符合自己的就好了。

之前记录了关于Redis的数据结构和对象的知识(可以点Redis标签看看),下面开始填坑。


复制

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

举个🌰:(Redis版本是4.0.8)

在6379端口启动一个redis-server:
$ redis-server --port 6379
$ redis-cli -p 6379
127.0.0.1:6379> 



在6380端口号启动一个redis-server,接着通过slaveof命令进行复制
$ redis-server --port 6380
$ redis-cli -p 6380
127.0.0.1:6380> slaveof 127.0.0.1 6379
OK

在这里,6379是主服务器,6380是从服务器。

接着能在6380的redis-server界面中看到日志:

19092:S 23 Mar 01:00:26.944 * Before turning into a slave, using my master parameters to synthesize a cached master: I may be able to synchronize with the new master with just a partial transfer.
19092:S 23 Mar 01:00:26.945 * SLAVE OF 127.0.0.1:6379 enabled (user request from 'id=2 addr=127.0.0.1:60778 fd=8 name= age=50 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=slaveof')
19092:S 23 Mar 01:00:27.234 * Connecting to MASTER 127.0.0.1:6379
19092:S 23 Mar 01:00:27.234 * MASTER <-> SLAVE sync started
19092:S 23 Mar 01:00:27.234 * Non blocking connect for SYNC fired the event.
19092:S 23 Mar 01:00:27.246 * Master replied to PING, replication can continue...
19092:S 23 Mar 01:00:27.246 * Trying a partial resynchronization (request 2e56cf1343f6b2e864c968bd59b4a16ed78b8f1d:1).
19092:S 23 Mar 01:00:27.266 * Full resync from master: bf36b20c3942e91ac4f262a2afdc90970b2d7c54:0
19092:S 23 Mar 01:00:27.266 * Discarding previously cached master state.
19092:S 23 Mar 01:00:27.441 * MASTER <-> SLAVE sync: receiving 187 bytes from master
19092:S 23 Mar 01:00:27.442 * MASTER <-> SLAVE sync: Flushing old data
19092:S 23 Mar 01:00:27.442 * MASTER <-> SLAVE sync: Loading DB in memory
19092:S 23 Mar 01:00:27.442 * MASTER <-> SLAVE sync: Finished with success

具体流程如下:

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

旧版复制功能的缺陷(旧版指的是2.8之前)

在Redis中,从服务器对主服务器的复制可以分成两种情况:

对于初次复制来说来说,旧版复制完全没有问题,但是断线重连之后,如果当时从服务器已经复制了一些,重连之后,从服务器需要重新复制,造成一些浪费。

旧版使用的是SYNC命令进行复制,是一个非常浪费资源的操作。

新版复制的优势

使用PSYNC命令替代SYNC命令来执行复制时的同步操作。

具有完整重同步(full resynchronization)部分重同步(partial resynchronization)两种模式:

新版复制实现

部分重同步功能由以下三个部分构成:

PSYNC命令实现

具体调用看流程图即可:
[图片上传失败...(image-5c0f31-1534470142719)]

心跳检测

在命令传播阶段,从服务器默认会以每秒一次的频率,向主服务器发送命令:

$ REPLCONF ACK <replication_offset>

其中replication_offset是从服务器当前的复制偏移量。
发送REPLCONF ACK有三个作用:

小结:


上一篇 下一篇

猜你喜欢

热点阅读