Redis高并发可用
1 复制
默认情况下,Redis都是主节点。每个从节点只能有一个主节点,而主节点可以同时具有多个从节点。复制的数据流是单向的,只能由主节点复制到从节点。
1.1 复制的拓扑结构
一主一从:
主一从结构是最简单的复制拓扑结构,用于主节点出现宕机时从节点提供故障转移支持
当应用写命令并发量较高且需要持久化时,可以只在从节点上开启AOF,这样既保证数据安全性同时也避免了持久化对主节点的性能干扰。但是,当主节点关闭持久化功能时,如果主节点脱机要避免自动重启操作。因为主节点之前没有开启持久化功能自动重启后数据集为空,这时从节点如果继续复制主节点会导致从节点也被情况的情况,丧失持久化的意义。安全的做法是在从节点上执行slaveof no one断开与主节点的复制关系,再重启主节点从而避免这一问题
一主多从结构
一主多从结构(又称为星形拓扑结构)使得应用端可以利用多个从节点实现读写分离
树状主从结构
树状主从结构(又称为树状拓扑结构)使得从节点不但可以复制主节点数据,同时可以作为其他从节点的主节
点继续向下层复制。通过引入复制中间层,可以有效降低主节点负载和需要传送给从节点的数据量
2 Redis 主从复制原理
1)保存主节点信息
执行slaveof后从节点只保存主节点的地址信息便直接返回,这时建立复制流程还没有开始
2)建立主从socket连接
从节点内部通过每秒运行的定时任务维护复制相关逻辑,当定时任务发现存在新的主节点后,会尝试与该节点建立网络连接。
从节点会建立一个socket套接字,专门用于接受主节点发送的复制命令。从节点连接成功后打印日志。
如果从接待你无法建立连接,定时任务会无限重试知道连接成功或者执行slaveof no one取消复制。
3)发送ping命令
连接建立成功后从节点发送ping请求进行首次通信,ping请求主要目的:检测主从之间网络套接字是否可
用、检测主节点当前是否可接受处理命令。
从节点发送的ping命令成功返回,Redis打印日志,并继续后续复制流程:
4)权限验证
如果主节点设置了requirepass参数,则需要密码验证,从节点必须配置masterauth参数保证与主节点相同
的密码才能通过验证;如果验证失败复制将终止,从节点重新发起复制流程。
5)同步数据集
主从复制连接正常通信后,对于首次建立复制的场景,主节点会把持有的数据全部发送给从节点,这部分操作是耗时最长的步骤。Redis在2.8版本以后采用新复制命令 psync进行数据同步,原来的sync命令依然支持,保证新旧版本的兼容性。新版同步划分两种情况:全量同步和部分同步
6)命令持续复制
当主节点把当前的数据同步给从节点后,便完成了复制的建立流程。接下来主节点会持续地把写命令发送给
从节点,保证主从数据一致性。
3 Redis数据同步
Redis早期支持的复制功能只有全量复制(sync命令),它会把主节点全部数据一次性发送给从节点,当数
据量较大时,会对主从节点和网络造成很大的开销。
Redis在2.8版本以后采用新复制命令psync进行数据同步,原来的sync命令依然支持,保证新旧版本的兼容
性。新版同步划分两种情况:全量复制和部分复制。
3.1 全量同步
全量复制:一般用于初次复制场景。是第一次建立复制时必须经历的阶段。触发全量复制的命令是sync和psync
1):发送pysnc命令进行数据同步,由于第一次进行复制,从节点没有复制偏移量和主节点的运行id,所以发送pysnc?-1
2)主节点根据psync ? -1解析出当前为全量复制,回复 +FULLRESYNC响应。从节点接收主节点的响应数据保存运行ID和偏移量offset,并且打印日志。
3)主节点执行bgsave保存rdb文件到本地
4)主节点发送RDB文件给从节点,从节点把接收的RDB文件保存在本地并直接作为从节点的数据文件,接收
完RDB后从节点打印相关日志,可以在日志中查看主节点发送的数据量
5)对于从节点开始接收RDB快照到接收完成期间,主节点仍然响应读写命令,因此主节点会把这期间写命
令数据保存在复制客户端缓冲区内,当从节点加载完RDB文件后,主节点再把缓冲区内的数据发送给从节点,
保证主从之间数据一致性。
通过分析,全量复制的所有流程是一个非常耗时的过程,
他的时间开销主要包括:
- 主节点bgsave时间
- RDB文件网络传输时间
- 从节点清空数据时间
- 从节点加载RDB的时间
- 可能的AOF重写时间
最大的问题是复制可能会失败。
3.2 部分同步
使用用psync {runId} {offset} 命令实现
当从节点正在复制主节点时,如果网络闪断或者命令丢失等异常情况时,从节点会向主节