Redis持久化与集群
这一篇是之前就想写的,但是考虑到学习一样东西有一样好的方式是对比,就先写的MySQL的复制,备份与恢复与Redis的持久化,集群有许多相同之处(我私以为最大的区别是Redis是存储在内存,MySQL是在磁盘,其他的思想其实差不多)
1.什么是Redis持久化
1.1 Redis持久化定义
将Redis的数据从内存存储到磁盘(可以存储到MySQL数据库,或直接存储为Redis能够识别的脚本)的过程,称为持久化
1.2 持久化目的
- Redis的数据存储在内存中,带来的好处是高效率,但是问题同样明显,只要断电数据就丢失,或者说重启Redis原来的数据也不会保存。
- 持久化的目的就是为了解决数据丢失问题,以及启动时能够加载上次数据
数据丢失问题很好理解,为了数据安全性,肯定不能让数据丢失
但是为什么要加载上次保留的数据?
- Redis的目的是什么,大部分是用来做缓存,为了让热点数据加载更快,同时减轻数据库的负担。如果每次重启都需要重新获取热点数据,就会再次个别次数的卡顿。一般为了体验更平滑,都会在启动时加载热点数据(预热)
1.3 相关面试题
- Q:了解缓存击穿吗?或者说Redis缓存可能会有那些问题?
A:Redis缓存可能会有 缓存击穿,缓存雪崩,缓存穿透问题
缓存击穿:热点数据访问量过高,当Redis缓存失效(为什么缓存会失效,下面会分析)时候,MySQL访问量过高导致的卡顿,宕机或者其他问题;解决方案是:热点数据缓存不设置失效日期,或者失效时间很长
缓存雪崩:许多缓存在同一时间失效,导致页面的卡顿;解决办法:缓存失效的时间设置的随机点,避免同时失效发生
缓存穿透:频繁访问一个不存在的数据,导致缓存无法发挥效用。例如说访问某个值,但是这个值时不存在的,每次访问Redis发现数据不存在,然后去数据库访问,还是发现不存在。这样就导致Redis没起到作用;解决方案:将空值也缓存,或者使用布隆过滤器。缓存空值只能解决对某个确定不存在数据的恶意访问问题。但是如果是很多数据都不存在,将对应的空值都缓存也划不来,更好的方式是布隆过滤器
布隆过滤器:利用Hash算法,判断存在的数据可能存在,判断不存在的数据一定不存在。这样对于很多不存在的数据,直接给予拦截,有效减小数据库压力。布隆过滤器原理
2.Redis持久化方式
Redis的持久化方式有两种:一种是全量式(也可以说是快照式):RDB,一种是增量式(日志式):AOF
2.1 Redis持久化 – RDB
我之前描述Redis是“单线程”的时候,是用的引号的,Redis处理请求的时候,一次处理一个。但是Redis在RDB持久化的时候,如果还是单线程,那岂不是在持久化的时候需要有有一段时间不能工作(这个是后可以联想回顾下Java垃圾回收的stop the word)。显然这样是很难被接受的。Redis是怎么干的:fork了一个子进程来执行RDB持久化,为什么说是基于快照方式,当Redis开始进行RDB的时候,对于子进程来说,Redis的内容都是不变的,相当于按下快门键,所有东西都固定了。父进程的所有写操作都是在副本上进行,完成后合并到原件上。这种机制叫:COW(Copy On Write)机制:很好理解,修改操作都在副本上进行,最后提交合并(和Git的分支管原理一样)
那最后Redis到底是不是单线程的: 一般认为Redis是多个多进程单线程(多个单线程的进程组成,但是都已经是多线程,再说Redis是单线程是不是怪怪的)。一般说Redis是单线程一般是为了强调其原子性,而且大于大部分操作,Redis就是单线程
2.2 Redis持久化 – AOF
AOF是基于日志实现的(和MySQL的复制区别不大)。将Redis语句记录到日志,存储到磁盘中
AOF重写是对AOF的一种优化,能够精简AOF日志大小(参考MySQL基于行的复制)。对某个语句进行多次操作,AOF重写将这些操作合并,只留一条语句(这条语句是不是分析AOF语句重写的,而是根据Redis的内容进行重写)
2.3 RDB与AOF的对比
- RDB相对于AOF来说效率更高,因为RDB产生的文件比AOF更小,恢复起来更快。那做实验类类比:AOF相当于是一步一步论证,最后得到结果,RDB相当于是直接给给结果,论证过程不写。文件能不小吗、。
- 不是说RDB比AOF好,RDB是全量,AOF是增量,你总不能实时去做RDB持久化(会有公司是实时推送全量数据吗)
- 同时RDB也会加大Redis服务器即时负载,会降低那一小段时间的并发,AOF肯定也吃服务器负载而且总负载消耗肯定更大,但是AOF相当于把消耗分布在一个时间区间(可以联想物理的省力不省功)
一般RDB和AOF是混合用的,晚上服务器没有压力的时候,进行RDB(全量)持久化,然后其他时间是进行AOF(增量)持久化。
3.什么是Redis集群
- Redis是在内存上,4G,10W访问量顶的一台机器顶的住,如果是400G,1000W访问量呢?一台机器(要是再过20年,说不定还真的可以)肯定是不行了,我们要用多个计算机进行处理。
- 如果在一台机器上,因为某种原因,机器宕机了,难道我们就只能等着恢复?
3.1 集群的定义
通过使用多个台计算机处理一件事情,来扩展系统的性能,这种方式称为集群
CAP理论:一致性,可用性,与分区容忍性(数据在不同的机器上,意味着可能会断开(有可能是那台服务器宕机,也有可能是网络不稳定),称为网络分区),这三者只能确保其中两者,而不能三者全部保全。Redis是通过牺牲一致性来保证后两者。不是强一致性(主从服务器始终保持数据一致),但是要保证最终一致性(最终从服务器与主服务器数据一致)
3.2 集群解决的问题
- 读写分离,通过集群,主服务器提供写服务,从服务器提供读服务。提高系统吞吐量(数据一样)
- 提高可用性,即使某一台服务器宕机,其他服务器还能够代替这台机器工作(多台数据的机器一样)
- 提高系统性能,一台机器处理不了那么多数据,多台机器处理(多台机器数据不一样)
4.Redis集群方式
4.1 主从复制
- 集群服务器分为两类,主服务器和从服务器(MySQL叫主备)
- 主服务器提供写服务,从服务器提供读服务(只有主服务器能提供写,理由和MySQL的一样,为了保证数据的一致性)
- Redis主从模型和MySQL主备一样,已有两种:主从模型,主-分发服务器-从服务器模型
- 主从复制过程:主服务器提供快照(RDB),发送给从服务器,从服务器删除自己的内容,然后加载快照,再然后主服务器将缓存区的指令同步给从服务器(AOF)(主服务器将自己的指令记录到本地缓存区buffer,从服务器获取指令,同时反馈自己进度。注意主服务器的缓存区是环形数组,如果从服务器因为网络分区或者其他原因长时间未获取,这部分数据就可能丢失)
4.2 哨兵(Sentinel)
- 上面的主从同步里面,如果是从服务器挂掉了,其他从服务器还能代替那个挂掉的继续提供读服务,但是如果是主服务器挂掉了,那么写服务就无法进行了,因为只有主服务提供写服务。哨兵可以解决这个问题。
- 哨兵是什么:哨兵是一种监控Redis服务器的工具,当主服务器挂掉的时候,在从服务器里选一个最接近主节点的节点为主节点
- 客户端是通过哨兵来获取主节点地址(其他从节点也是 ),当主节点挂掉,客户端会重新从哨兵获取主节点地址,哨兵会给出一个最佳节点。
- 当主节点挂掉之后又恢复后,这个不会就是从节点了,因为已经有一个主节点了
4.3 Codis
- Condis是国人开发的一个三方代理工具
- 其原理是通过代理,将查询(增删改查)转发到各个Redis实例上
- 可以有多个Condis实例。
- Condis实例与Redis的映射关系存储在其他分布式中间件上:例如ZooKeeper
- 能够自动均衡,当有新增的Redis实例后,会将其他实例的一部分Key迁移到新的实例上,如果访问的key正在迁移中,会马上将这个key进行迁移在访问
*映射规则:对Key的Hash进行Crc32运算,然后模1024,得到key的槽位,Condis会缓存槽位和实例的关系- Condis的迁移可以后台自动进行,同时Condis有可视化的后台管理页面
4.4 Cluster
- Redis自己的工具
- 将一共划分16384个槽位(Condis是1024)(hash槽的概念)
- Cluster是可以直接找到节点(Condis需要代理),也不需要第三方工具来同步槽位与实例地址的关系
- 映射规则:堆Key的hash进行CRC16运算,然后模16384
- 没有代理节点可以提供,key与实力地址的映射,扩容之后找,客户端在原先的实例寻找Key,服务器会返回一个正确的地址。从原节点迁移到目标节点后悔删除调原节点
4.5 个人思考
在网上搜Redis集群,一般都是说有三种集群方案:主从复制,哨兵,Cluster。我不是很认同这种观点,一来就把Condis(除了这个,其他3个都是Redis自身的功能)开除了。哈哈哈,给中国开发者一点面子好不好:我觉得主从复制和哨兵只是Redis集群的基础以及一部分功能。Condis与Cluster更倾向于分布式方案。举例子:
现有A,A2,A3,B,B2,B3,C,C2,C3九台机器构成一个集群系统。其中Condis和Cluster更倾向于描述A,B,C这三个主服务器的关系(分布式的概念)。主从复制与哨兵是A,A2,A3描述作用这种关系。(也不知道我有没有表达清楚)
实际上一般公司到主从复制就这个阶段就够了,最多哨兵层次,后面两个一般用不到。即使业务比较多,但也有可能是不同的系统,各自独立。也用不到Condis与Cluster。但是我们也需要知道原理,不然面试怎么造航母。
5.小结
- RDB与AOF是什么?
- RDB与AOF的优劣,应用场景
- 缓存雪崩,缓存击穿,缓存穿透
- 主从复制,哨兵,Condis,Cluster
还有些东西想说:但是这篇文章已经字数已经严重超标了。
Redis缓存过期策略,布隆过滤器,hash槽概念,哨兵的工作过程
我今天早上起来看了部电影《横空出世》,推荐大家看下。我们今天的生活来之不易,不要被疫情打倒。对国家有信心
苔痕上阶绿,草色入帘青
博主:五更依旧朝花落
最早发布时间:2020年4月6日19:01:19
最后更新时间: