Redis 主从服务设置以及复制原理
Redis服务可分为主节点和从节点
从节点需要在配置文件中指定主节点:slaveof {masterHost} {masterPort}
一主三从配置文件
6379(主):
port 6379
databases 5
dir ./database/
appendonly yes
appendfilename setOrder.aof
save 10 1
dbfilename snapshot.rdb
7001(从):
port 7001
databases 5
dir ./database/
appendonly yes
appendfilename setOrder.aof
save 10 1
dbfilename snapshot.rdb
slaveof 127.0.0.1 6379
7002(从):
port 7002
databases 5
dir ./database/
appendonly yes
appendfilename setOrder.aof
save 10 1
dbfilename snapshot.rdb
slaveof 127.0.0.1 6379
7003(从):
port 7003
databases 5
dir ./database/
appendonly yes
appendfilename setOrder.aof
save 10 1
dbfilename snapshot.rdb
slaveof 127.0.0.1 6379
演示:
主从演示主从的复制过程
<img src="https://wang_ya_nan.gitee.io/pages/image/2018/05/14/swdcbh.svg"></img>
-
复制偏移量:
参与复制的主从节点都会维护自身的复制偏移量。主节点在处理完写入命令后,会把命令的字节长度做累加记录。从节点每秒钟上报自身的复制偏移量给主节点,主节点也会保存从节点的复制偏移量。从节点在接收到主节点发送的命令后,也会累加记录自身的偏移量。 -
复制积压缓冲区:
先进先出的定长队列,默认大小为1MB,主节点响应写命令时,不但会把命令发送给从节点,还会写入这个缓冲区。用于部分复制和复制命令丢失的数据补救。 -
主节点运行ID:
每个Redis节点启动时会动态分配一个40位的十六进制的字符串作为运行ID。 -
psync命令
从节点使用psync命令完成部分复制和全量复制功能。
psync {runId} {offset}
runId : 主节点的运行ID
offset:当前从主节点已复制的数据偏移量
全量复制
场景:大多用于第一次同步
- 从节点发送psync命令,由于是第一次复制,不知道主节点的runId,所以发送: psync ? -1
- 主节点先会保存RDB文件到本地,把RDB文件传输给从节点
- 从节点接收到全部数据后会清空自身旧数据,加载RDB文件
- 加载RDB完成后,如果从节点开启了AOF持久化,会立即做bgrewriteaof操作
部分复制
场景:主从节点之间出现网络闪断或者命令丢失等异常情况
- 当主从节点之间网络出现中断,中断期间主节点依然响应命令,但是无法发送命令给从节点
- 当主从连接恢复后,由于从节点,保存了自身的复制偏移量和主节点的运行ID,所以把它们当成psync的参数发个主节点,要求进行部分复制
- 主节点根据offset在自身复制积压缓冲区查找,如果偏移量在其中,则允许从节点进行主从复制
- 主节点发送缓冲区的数据给从节点,保证主从复制进入正常状态
可能存在的问题
- 数据延迟:主从节点采取异步复制的方式,可能会有数据延迟的问题
- 读到过期数据(两种删除方式:懒惰删除,定时删除),原因同上
- 复制风暴,多个从节点同时启动,同时去主节点做第一次同步数据
网友评论