Redis分布式缓存
# Redis分布式缓存
# 1.Redis保证高可用
- 主从模式
只有一个主节点,和多个从节点,主节点进行写,然后会把数据同步到所有从节点上,而从节点只能读,用来缓冲高并发读下的流量冲击。缺点在于,主节点宕机后,需要手动设置把一个从节点提到主节点的位置,费时费力并且还会造成一段时间的停止服务。
- 哨兵模式
哨兵进程通过发送哨兵命令来监控主从节点是否宕机,一旦发现主节点挂了,哨兵进程之间就会选举产生新的Master节点。
- 集群模式
由于每台Redis机器都存储相同数据,很浪费内存。因此可以让数据分片,每台redis机器上都存储不同的内容。
# 2.Redis持久化
# RDB
RDB:把内存中的所有数据都记录保存在磁盘中一个RDB文件。当Redis实例故障重启后,能够从磁盘读取快照文件恢复数据。一般默认关机会自动保存,redis.conf中有触发RDB的机制,save 900 1 表示900秒内如果至少有一个key被修改,则执行bgsave后台保存。
本质是fork主进程得到子进程,子进程复制主进程的页表,通过页表来读取物理内存。
当主进程执行写操作时,采用copy-on -write会先拷贝一份数据,再执行写操作。
缺点:耗时,两次备份之间宕机会丢失数据。
# AOF
- AOF:redis处理的每一个写命令都记录在AOF文件中,Redis只需要重新执行一遍AOF中的写命令就可以恢复数据。实现时通过服务器创建一个没有网络连接的伪客户端(因为Redis命令只能在客户端上下文中进行),然后从AOF文件读一条指令,并写入到Redis中,不断重复。
- RDB记录的是值,而AOF记录的操作中含有很多无效信息,因此AOF文件会比RDB文件大很多。
- 缺点:AOF的文件体积可能会越来越大,比如不断对同一条记录添加删除添加删除。因此可以使用bgrewriteaof命令,让AOF文件执行重写功能,以最少的命令达到同样效果。(比如对相同key的覆盖操作)
- AOF安全性比RDB高,数据恢复优先级先选AOF。
系统优先使用AOF持久化进行数据复原;若AOF关闭则使用RDB文件进行还原。
# 3.Redis主从同步
主节点负责写操作,其余的所有从节点负责读操作。主节点需要向从节点进行数据同步。
- 全量同步:执行bgsave生成RDB+新的数据log,都发送给slave进行同步。从节点第一次和主节点会采用全量同步,master判断replid回复id一致则进行增量同步。
- 增量同步:一般发生在从节点重启的情况。不需要发送RDB,仅发送offset后的数据。repl_baklog本质是一个环形数组,当master的offset和slave相差超过整个环时,master上还没同步的数据被覆盖了,因此slave需要去主节点内存中做全量同步。
- 优化主从同步
- 主节点启用无磁盘复制,因为RDB正常是先写到磁盘中,然后再进行网络传输。启用后RDB直接写到网络IO流中传输,避免了磁盘IO。
- Redis单节点内存占用不要太大,减少RDB导致的过多磁盘IO。
- 提高repl_baklog的大小;从节点及时同步。
- 减轻集群中master节点同步的压力,主-从-从结构,由同步了的从节点接下去给其它从节点进行同步。
# 4.哨兵机制
哨兵的作用:①监控主从节点是否按照预期工作②主节点故障后会将一个从节点提升为主节点③通知redis客户端
选举规则
- 哨兵会每隔1秒钟向redis发送ping命令进行心跳监测,如果发现主节点故障,则开始选举新的master。
- 首先排除和主节点断开时间很长的slave
- 然后判断从节点的优先级,越小优先级越高
- 如果优先级一样则判定offset,越大说明数据越新
- 最后是slave节点的运行id,越小优先级越高。
- 选举成功后修改原先主节点的配置文件,变成slave节点。
RedisTemplate 配置读(从)写(主)分离
- 引入maven依赖
- 配置哨兵集群地址(redis-sentinel s1/sentinel.conf 启动哨兵节点)
- 配置读写分离
@Bean
public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){
return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
}
2
3
4
- 哨兵模式下如何选取新的主节点
哨兵节点先给redis集群中的节点发送心跳包,对方未回应且超过一定数量哨兵节点都认为该节点下线,则该节点下线。
如果下线的是主节点,则哨兵集群中会先选择一个哨兵leader(每个哨兵给自己投票),然后由哨兵leader选主节点。依据的优先级:
①从节点优先级最大的作为主节点②复制偏移最大的作为主节点③runid最小的作为主节点。
# 5.分片集群
解决主从集群①高并发写②海量数据存储的问题。
多个master节点之间相互做哨兵,相互发送心跳监测。