redis replication主从架构

redis主从模型为redis提供了动态可水平扩展的扩容机制。当现有的redis机器QPS不能满足要求时,我们可以通过动态水平扩展的方式实现扩容。今天我们来学习下redis replication的核心概念。

目录

图解redis replication

master持久化对于主从架构的安全保障的意义

主从架构的核心原理

数据同步相关的核心机制

全量复制的核心流程

增量复制核心流程

无磁盘化复制

过期key的操作

图解redis replication

如图:

 master node可以配置多个slave node 。master默认10s发送一次heartbeat心跳检测给slave node,redis2.8版本后slave也会每隔1s向master发送heartbeat。

slave node也可以连接slave node

slave node做渎职不会block master node的正常操作,也不会block自己的客户端请求。它会用旧数据集提供服务。但是复制完成删除旧数据集并加载新数据集的过程中会发生block。

slave node可以水平扩展,实现水平扩容,提供整体QPS(query per second)。

master持久化对于主从架构的安全保障的意义

采用主从架构必须开启master node的持久化,不建议使用slave作为master的数据热备。试想下如果master未持久化数据,master宕机后重启,此时经过一轮同步,slave node的数据也就丢失了。

master的持久化备份,万一本地所有文件丢失了我们还可以通过备份文件经最大可能恢复数据。即使才用了高可用机制,也会出现丢失文件的情况。试想下如果master重启正好发生在sentinal选举之前,此时master数据为空,经过一轮同步也会导致slave 的数据清空。

主从架构的核心原理

当启动一个slave node的时候他会发送PSYNC命令给master node 。如果slave node重新连接master node 则仅仅会复制给slave部分缺少的数据;若此slave node第一次连接master node 则会触发一次full resynchronization。

        (1)一次完整的full resynchronization流程: master节点接收到PSYNC全量同步请求则调用bgsave生成一份rdb文件,并将此文件发送给该slave node,slave node加载rdb文件,把文件读取到内存中。slave节点给master node发送自身offset信息。

        (2)在进行full resynchronization的过程中master node还是会接受客户端请求,它会基于内存生成一个rdb文件直接发送给slave node。

主从节点的断点续传:当发生数据同步过程中网络连接断开了,重新连接会接着上次复制的地方继续复制下去,而不是从头开始复制一份。

        (1)master node会在内存中创建一个backlog,master和slave都会保存一个replica offset还有一个master id 这里的offset就是保存在backlog中的。

        (2)如果master 和slave网络连接断开了,slave会让master从上次的replica offset开始继续复制,如果没找到对应的offset那么会执行一次resynchronization

数据同步相关的核心机制

master和slave都会维护一个offset。

  master和slave会在自身不断累加offset,slave每秒会上报自己的offset给master,master会保存每个slave的offset。

backlog

backlog主要是用来做全量复制中断后的增量复制的,默认大小是1M。

master run id

执行info server命令可以看到master run id信息 如果根据host+ip定位master不太靠谱。如果master重启slave应该通过run id区分,如果run id不同就要做全量同步。执行 redis-cli debug reload 命令可以在不改变run id情况下重启redis。

psync

slave使用PYSNC命令从master进行复制 psync runid offset,master会根据自身具体情况返回响应信息,可能是FULLRESYNC runid offset触发全量复制,可能是CONTINUE触发增量复制。

全量复制的核心流程

master执行bgsave,在本地生成一份rdb快照文件。

master 把rdb发送给slave。如果rdb复制时间超过60秒(repl-timeout可配置),那么slave node就会认为复制失败。

master在生成rdb文件的时候会将所有新的写命令缓存在内存中在slave保存了rdb之后在将写命令无磁盘化复制给slave。

client-output-buffer-limit slave 256MB 64MB 60,如果在复制期间,内存缓冲区持续消耗超过64MB,或者一次性超过256MB,那么停止复制,复制失败。

slave node接收到rdb之后,清空自己的旧数据,然后重新加载rdb到自己的内存中,同时基于旧的数据版本对外提供服务。

如果slave node开启了AOF,那么会立即执行BGREWRITEAOF。

增量复制核心流程

(1)如果全量复制过程中,master-slave网络连接断掉,那么salve重新连接master时,会触发增量复制

(2)master直接从自己的backlog中获取部分丢失的数据,发送给slave node,默认backlog就是1MB

(3)msater就是根据slave发送的psync中的offset来从backlog中获取数据的

无磁盘化复制

master在内存中直接创建rdb,然后发送给slave,不会在本地落盘。比如在进行full resynchronization的过程中master node还是会接受客户端请求,它会基于内存生成一个rdb文件直接发送给slave node,这里就是无磁盘化复制。

repl-diskless-sync yes

#等待一定时长再开始复制,因为要等更多slave重新连接过来

repl-diskless-sync-delay 5


过期key的操作


slave node不会过期key,只会等待master过期key然后模拟一条del命令发送到slave node。

思考一下:如何在主从模型下如何做到99.99%的高可用性呢?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容