redis的高可用应该包括两个维度 :
- 数据尽量少丢失
- 服务尽量少中断
单机Redis持久化 (数据安全)
持久化类型:1. 快照 2. 日志
持久化的意义:防止冷启动(缓存里没有任何数据,造成雪崩)
快照RDB (默认)
特点:恢复快 (数据io读取与加载)
缺点:缺失比较多(丢失的数据是上次备份到宕机的)
备份:
- save 在主进程执行,会导致阻塞
- bgsave fork子进程专门来写rdb
bgsave时,主进程还可以修改吗?
主进程可以正常接收请求,但只能处理读操作,不能修改正在执行快照的数据。
写时复制:这时就会使用操作系统提供的copy-on-write技术,在bgsave的同时,还可以正常处理写操作。可以1秒1次快照吗?
不行,因为尽管是bgsave, 但仍有两方面的开销:
- 磁盘io频繁,上次没bgsave完成,下一次又来
- fork出的子进程越多,主进程被阻塞的可能就越大
日志 AOF
先写内存,再写磁盘。
级别:
- Always 每操作同步一次磁盘 每操作完整性 (数据完整性好,但性能差)
每个操作指令完成返回前,都要将指令持久化到磁盘,意味着每操作一次都要染指一次磁盘io(flush 缓冲区),性能较差。
NO 操作系统缓冲 刷写 (性能佳,但可能丢大量数据)
一旦宕机,将可能丢失一个缓冲区的数据(8G内存可能丢失1个g, 缓冲区大小由内核参数决定)
EverySec 每秒种os缓冲 刷写 (折中,redis默认)
优点:数据保存完整度高
缺点:
1. 慢
2. 冗余量(aba带来的无效更新), redis定期重写(rewrite),对指令压缩(去掉aba中间的指令)
指令重写(rewrite)
非阻塞aof重写过程
重写过程是fork出的后台子进程bgrewriteaof来完成的,并不后阻塞主进程。
aof重写时,redis会执行一个内存copy,用于重写,然后使用两个日志保证在重写过程中,新写的数据不会丢失。
混合模式
使用:
- 分布式数据结构的redis实例倾向于做数据存储,对数据可靠性要求比较高,使用aof日志
- 热点缓存数据,特别是时效比较低的热点数据存储实例,使用rdb快照模式。
也可混合使用(仅redis4.x+支持) ,全量备份+增量日志。
hadoop的 hdfs 就是二者混合使用的思想上的一种高级实现,由fdimage(全量备份)+edits.log(增量备份)组成,如果手上有一个8点的fdimage和8 点以后的edits.log
高可用部署 (服务可靠)
- 冗余
- 主主
- 主从
- 主备
- 分治
- 分片
- 多实例
Redis主从复制
主从同步过程
https://www.cnblogs.com/cooffeeli/p/redis_master_slave.html
- slaveOf masterIp masterPort
redis.conf/从节点启动命令/从节点客户端命令
- 建立socket连接
- 发送ping命令
- 身份验证
- 同步
psnc命令,全量+半量同步
- 命令传播
主节点有写命令 会传播给从节点
异步传播 会有延迟和数据不一致问题