redismaster-slave理论
Posted 小小灬星愿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redismaster-slave理论相关的知识,希望对你有一定的参考价值。
主从复制原理
redis采用异步方式复制数据到slave节点,不过redis2.8开始,slave node会周期性地确认自己每次复制的数量
一个master node可以配置多个slave node
slave node也可以连接其他的slave node
slave node做复制的时候,是不会block master node的正常工作的
slave node在做复制的时候,也不会block对自己的查询操作,它会用旧的数据集来提供服务,但是复制完成后,就需要删除旧的数据集,加载新的数据集,这个时候就会暂停对外的服务了
slave node主要用来进行横向扩容,做读写分离,扩容的slave node可以提高读的吞吐量
当启动一个slave node的时候,slave node会发送一个PSYNC命令给master node,如果这是slave node重新连接master node,那么master node仅仅会复制个slave部分缺少的数据,否则如果是slave node第一次连接到master node,那么会触发一次full resynchronization
开始full resynchronization的时候,master会启动一个后台线程,开始生成一份rdb快照文件,同时还会将从客户端所有收到的写命令缓存在内存中。RDB文件生成完成后,master会将这这个RDB发送给slave,slave会先写入本地磁盘,然后再从磁盘加载到内存中,然后master会将内存中的写命令发送给slave,slave也会同步这些数据。
slave node如果跟master node有网络故障,断开了连接,会自动重连,如果master发现有多个slave node都来重新连接,仅仅会启动一个rdb save操作,用一份数据服务所有的slave node。
主从复制的断点续传,从redis2.8开始,就支持主从复制的断点续传,如果主从复制过程中,网络连接断掉,那么可以接着上次复制的地方继续复制下去,而不是从头开始复制一份。
master node会在内存中维护一个backlog,master和slave都会保存replica offset还有一个master id,replica offset就是保存在backlog中的,如果master和slave网络连接断掉了,slave会让master从上次的replica offset开始继续复制,但是如果没有找到对应的offset,那么就会执行一次full resynchronization。
无磁盘化复制,master在内存中直接创建rdb,然后发送个slave,不会在本地落地磁盘。配置如下
repl-diskless-sync no 默认不开启
repl-diskless-sync-delay 5 等待5秒
如果开启rdb生成后会等待5秒,在5秒内连接的slave,master通过socket传送rdb文件。5秒后连接的需要等待下次传送
过期key处理,slave不会过期key,只会等待master过期key。如果master过期了一个key,或者通过LRU淘汰了一个key,那么会模拟一条del命令发送给slave。
PS:
如果采用主从架构,必须开启master node的持久化功能
不能用salve node作为master node的数据热备,因为如果这样的话,关掉了master的持久化,当master在宕机重启的时候数据是空的,然后可能已经过复制,slave node的数据也丢了。(master关掉RDB和AOF,那么数据都在内存中,master宕机重启在本地是没有数据可以恢复的,master就会将自己的空的数据集同步到slave,这样slave的数据也全部清空了)
master必须要做企业级的各种备份方案,因为即使采用了后面实现的高可用机制,slave node可以自动接管master node,但是也可能sentinal集群还没有检测到master failure,master node就自动重启了,还是可能导致上面所有slave node数据清空故障。
复制的完整流程
slave node启动,仅仅保存master node的信息,包括master node的host和ip,但是复制流程还没开始,master node的host和ip是从哪儿来的呢,是从redis.conf里面的slaveof配置的。
slave node内部有个定时任务,每秒检查是否有新的master node要连接和复制,如果发现有新的master需要连接,就跟新的master node建立socket网络连接。
slave node发送ping命令给master node
口令认证,如果master设置了requirepass,那么slave node需要发送masterauth的口令过去进行认证
master node第一次执行全量复制,将所有的数据发送个slave node
master node后续持续将写命令,异步复制给slave node。
数据同步核心机制
数据同步的核心机制,指的是第一次slave连接master的时候,执行的全量复制,这个过程中的一些细节机制。
master和slave都会维护一个offset。master会在自身不断累加offset,slave也会在自身不断累加offset。slave每秒都会上报自己的offset给master,同时master也会保存每个slave的offset。这个机制不是说特定就用在全量复制的,主要是master和slave都需要知道各自的数据的offset,才能知道互相之间的数据的不一致的情况。
backlog,master node有一个backlog,默认是1MB,mster node在给slave node复制数据的时候,也会将数据在backlog中同步写一份,backlog主要是用来做全量复制过程中中断时候的增量复制的。
master run id。在redis-cli执行info server,可以看到master的run id,如果根据host和ip定位master node,是不可靠的,如果master node重启或信息出现了变化,那么slave node应该根据run id区分,run id不同就做全量复制。(如果需要不更改run id重启redis,可以使用redis-cli debug reloa命令)
psync。从节点使用psync从master node进行复制,psync run id offset。master会根据自身的情况返回响应信息,可能是FULLRESYNC run id offset触发全量复制,可能是CONTINUM触发增量复制。
heartbeat,主从节点互相都会发送hearbeat信息。master每隔10秒发送一次heartbeat,slave node每隔1秒发送要给heartbeat
异步复制,master每次接收到写命令之后,先在内部写入数据,然后异步的发送给slave node。
全量复制:
master执行bgsave,在本地生成一份rdb快照文件。
master node将rdb快照文件发送给slave node,如果rdb复制时间超过60秒(repl-timeout 60),那么slave node就会认为复制失败,可以适当调节大这个参数。
对于千兆网卡的机器,一般每秒传输100MB,6G文件很可能超过60秒。(当调整redis内存大小的时候,需要考虑同时调整复制超时时间)
master node在生成rdb时,会将所有新的写命令缓存在内存中,在slave node保存了rdb之后,在将新的写命令复制给slave node。
client-output-buffer-limit slave 256MB 64MB 60,在复制期间。内存缓冲区持续消耗超过64MB,或者一次性超过256MB,那么停止复制,复制失败。
slave node接收到rdb之后,清空自己的旧数据,然后重新加载rdb到自己的内存中,在这期间,同时基于旧的数据版本对外提供读服务。
如果slave node开启了AOF,那么会立即执行BGREWRITEAOF,重写AOF。
rdb生成、rdb通过网络拷贝、slave就数据清理,slave aof rewrite都很耗费时间。如果复制的数据量在4G-6G之间,那么很可能全量复制的时间消耗在1分半到两分钟。
增量复制:
如果全量复制的过程中,master和slave网络连接断掉,那么slave重新连接master时,会触发增量复制。
master直接从自己的backlog中获取部分丢失的数据,发送给slave node,默认backlog就是1MB。
master就是根据slave发送的psync中的offset来从backlog中获取数据的。
下一篇:《redis之master-slave架构搭建》
以上是关于redismaster-slave理论的主要内容,如果未能解决你的问题,请参考以下文章