本文记录学习redis的集群与持久化策略,于2025年3月30日(周日)开始
redis集群
redis如何实现服务高可用?有一下三点:
主从复制
主从复制的三种模式:
1. 全量复制;
2. 基于长连接的命令传输;
3. 增量复制;
全量流程示意图:
增量:
总结:
1. 主从服务器第一次同步的时候,就是采用全量复制,此时服务器会有两个耗时的地方,分别是生成RDB文件和传输RDN文件。
2. 第一次同步完,主从服务器都会维护着一个长连接,用于master服务器后续接收到的写命令传播到slave服务器;
3. 如果遇到断网,增量复制就派上用场了。
哨兵模式
目的:实现主从节点故障转移。
它会检测主节点是否存活,如果主节点挂了,就会选举一个从节点切换为主节点,并且把新主节点的相关信息通知给从节点和客户端。
哨兵节点主要负责三件事情:监控;选主;通知。
哨兵节点通过redis的发布者 / 订阅者模式,哨兵之间可以相互感知,相互连接,组成哨兵集群。
1. 第一轮投票:判断主节点下线:
2. 第二轮投票:选出哨兵leader:
3. 由哨兵leader进行主从故障转移:
切片集群模式
redis持久化策略
redis共有三种数据持久化的方式:
1. AOF日志;
2. RDB快照;
3. 混合持久化方式。
AOF日志
记录操作命令;(Append Only File)
redis写入AOF日志的过程,如下图:
三种回写硬盘策略:
Always,Everysec,No.
AOF重写机制:
redis提供AOF重写机制,当AOF文件的大小超过所设定的阈值后,redis就会启用AOF重写机制,来压缩AOF文件。
RDB快照
记录某一瞬间的内存数据。
redis提供两个命令来生成RDB文件,分别是save和bgsave,区别在于是否在 [主线程] 里执行:
1. save:在主线程生成RDB文件,由于和执行操作命令在同一线程,所以,当写入RDB文件时间太长,会阻塞主线程;
2. bgsave:会创建一个子进程来生成RDB文件,这样可以避免主线程的阻塞;
save 900 1
save 300 10
save 60 10000
别看选项名叫save,实际上执行的是bgsave命令。只要满足上面条件的任意一个,就会执行bgsave,它们的意思分别是:
900s之内,对数据库进行了至少一次修改;
300s之内,对数据库进行了至少10次修改; 等
混合持久化方式
将RDB和AOF合体使用,该方法叫混合持久化。
开启混合持久化功能,在redis配置文件修改配置项为yes:
aof-use-rdb-preamble yes
开启混合持久化后:
1. 在AOF重写日志时,fork出来的重写子进程会先将主线程共享的内存数据以RDB方式写入到AOF文件;
2. 然后主线程处理的操作命令会被记录在重写缓存区里,重写缓存区里的增量命令会以AOF方式写入到AOF文件;
3. 写入完成后,通知主进程将含有RDB格式和AOF格式的AOF文件替换掉旧的AOF文件。
redis数据一致性
写策略
1. 更新数据库;
2. 删除缓存(有可能会失败,解决办法:引入消息队列,有重试机制)
读策略
1. 如果读取命中缓存,从缓存拿数据;
2. 如果读取没有命中,则从数据库拿数据,再写入缓存。