redis高可用 - Master&Slave
Master&Slave也就是我们所说的主从复制,即主机数据更新后根据配置和策略,自动同步到备机的机制。其中Master以写为主,Slave以读为主。
Master&Slave的作用主要有两个:
- 读写分离;
- 容灾恢复。
redis replication核心机制
- redis采用异步的形式复制数据到slave,从redis 2.8开始,slave会周期性地确认自己每次复制的数据量
- 一个master node可以连接多个slave node
- slave node 也可以连接其他slave node
- slave node复制数据时不会block master node的正常工作
- slave node 复制数时也不会block 自己的查询操作,它会用旧的数据对外提供服务,但复制完成后,需要删除旧的数据,加载新数据,这个时候会暂停对外服务
- slave node主要用来进行横向扩容,扩容可以提高更高的读的吞吐量
主从复制的流程
主要流程:
- 当启动一个slave node的时候,它会发送一个PSYNC命令给master
- 如果这是slave node重现链接master,master会将缺少的数据发送给slave,即增量复制;如果是第一次链接master,则会触发一次full resynchronization,即全量复制。
- 开始全量复制的时候,master启动一个后台线程执行bgsave,基于现有数据在本地生成一份rdb快照文件
- 生成文件后,master会将这个rdb文件发送给slave,如果rdb复制超过60秒(repl-timeout参数可以配置),那么slave就会认为复制失败,可以适当调节这个参数
- slave收到rdb文件后,会先把这个rdb文件存放到本地磁盘,然后再加载到内存,
- 然后master会将生成rdb这段时间内接收到的在内存中的数据发送给slave,slave也会接收这份数据。
- 如果slave开启了aof(即Append Only File持久化,将Redis执行的每次写命令记录到单独的日志文件中),那么会立即执行berewriteaof,重写aof
增量复制子流程:
如果全量复制过程中,master-slave网络连接断掉,salve重新连接master时,会触发增量复制。
master直接从自己的backlog中获取部分丢失的数据,发送给slave node,默认backlog就是1MB;master就是根据slave发送的psync中的offset来从backlog中获取数据的。
断点续传
从redis 2.8开始,就支持主从复制的断点续传,如果主从复制过程中,网络连接断掉了,那么可以接着上次复制的地方,继续复制下去,而不是从头开始复制一份。
master node会在内存中创建一个backlog,master和slave都会保存一个replica offset还有一个master id,offset就是保存在backlog中的。如果master和slave网络连接断掉了,slave会让master从上次的replica offset开始继续复制;如果没有找到对应的offset,那么就会执行一次全量复制。
过期key处理
slave不会过期key,只会等待master过期key。如果master过期了一个key,或者通过LRU淘汰了一个key,那么会模拟一条del命令发送给slave。
其他概念
heartbeat:主从节点互相都会发送heartbeat信息,master默认每隔10秒发送一次heartbeat,salve node每隔1秒发送一个heartbeat。master每次接收到写命令之后,现在内部写入数据,然后异步发送给slave node
offset :master会在自身不断累加offset,slave也会在自身不断累加offset。
slave每秒都会上报自己的offset给master,同时master也会保存每个slave的offset。主要是master和slave都要知道各自的数据的offset,才能知道互相之间的数据不一致的情况
backlog:master node有一个backlog,默认是1MB大小;master node给slave node复制数据时,也会将数据在backlog中同步写一份;主要是用来做全量复制中断后的增量复制的。
master run id :info server可以看到master run id 。如果根据host+ip定位master node,是不靠谱的,如果master node重启或者数据出现了变化,那么slave node应该根据不同的run id区分,run id不同就做全量复制 ;如果需要不更改run id重启redis,可以使用redis-cli debug reload命令
psync :从节点使用psync从master node进行复制,psync runid offset
master node会根据自身的情况返回响应信息,可能是FULLRESYNC runid offset触发全量复制,可能是CONTINUE触发增量复制
仅是学习笔记,难免出错,望不吝指点