Redis如何支持高并发和高可用(主从复制和)
Redis如何支持高并发
Redis 主从架构(master-slave) + Redis 读写分离
Redis 集群架构做成主从架构,一主多从。主负责写,并负责将数据同步到其他的salve 节点上,从负责读,所有的读请求走从节点
这样不仅能支持高并发还能很轻易的进行水平扩容,只需要在扩容 slave 节点就好了
Redis replication 主从同步基本原理
- redis 采用异步复制的方法进行复制,现在好像是 slave node 会周期性的确认一下自己每次复制的数据量
- 一个master node 可以有多个 salve node
- slave node 可以链接其他的 slave node
- slave node 做复制的时候不会阻塞 master的工作
- slave node 进行复制的时候不会阻塞自己的读操作,会使用旧数据,等同步完成删除旧数据,在使用新数据
- slave node 可以做水平扩容进而支持高并发
为什么主从架构必须要开启持久化机制
当master 宕机之后,如果没=没有开启持久化,那么master上的数据是空的,如果在经过复制之后 slave 节点的数据也全部为空
就算是哨兵自主选择了 master,在启动之后原 master节点也会丢失部分数据,即便是这样,还是会存在哨兵还没有检测到 master failure,master 自己重启了,还是会导致所有的数据清空
Redis 如何将 master 数据复制到 slave 上
master 将数据复制到 slave 上一般有全量复制和增量复制两种操作
全量复制一般出现在 slave 初始化节点
增量复制一般是 slave 中已经有了 master 的部分数据,但是因为某种原因和master 断开了链接,之后又重连上了
主从复制原理:
- 一个slave 链接到 master 的时候会给 master 发送一个 sync 命令
- master 接收到命令之后就会将数据生成快照文件,并且在缓冲区记录之后的写操作
- master 将生成的快照文件发送给所有的从节点
- 从节点接收到新的快照文件之后丢弃旧数据,载入新数据
- 主节点快照发送完成之后就会将之后的写操作发送给从服务器
- 从服务器执行主节点发送过来的写命令
主从复制的断点续传
中途断网导致没有一次性传输完成,在连接之后还会在断点处继续传输
原理: master 节点会在内存中创建一个 backlog 的日志文件,backlog 文件中会有一个 raplica offset 来记录传输到哪里,当链接之后,salve 就会要求 master 从 replica offset 出传输
过期 key 的处理
slave 不会过期 key,只有当 master 过期 key 之后,master 会模拟一条del命令发送给slave