什么是RDB
RDB∶每隔一段时间,把内存中的数据写入磁盘的临时文件,作为快照,恢复的时候把快照文件读进内存。如果宕机重启,那么内存里的数据肯定会没有的,那么再次启动redis后,则会恢复。
备份与恢复
内存备份-->磁盘临时文件
临时文件-->恢复到内存
RDB优劣势
RDB的配置
/user/local/redis/working/dump.rdbsave 900 1 # 如果1个缓存更新,则15分钟后备份save 300 10 # 如果10个缓存更新,则5分钟后备份save 60 10000 # 如果10000个缓存更新,则1分钟后备份总结
RDB适合大量数据的恢复,但是数据的完整性和一致性可能会不足
??RDB会丢失最后一次备份的rdb文件,但是其实也无所谓,其实也可以忽略不计,毕竟是缓存,丢了就丢了,但是如果追求数据的完整性,那就的考虑使用AOF了。
AOF特点
优势
劣势
AOF的配置
# AOF 默认关闭,yes可以开启appendonly no# A0F 的文件名appendfilename "appendonly.aof"# no∶不同步# everySec∶每秒备份,推荐使用# always∶每次操作都会备份,安全并且数据完整,但是慢性能差appendfsync everysec# 重写的时候是否要同步,no可以保证数据安全no-appendfsync-on-rewrite no# 重写机制∶避免文件越来越大,自动优化压缩指令,会fork一个新的进程去完成重写动作,新进程里的内存数据会被重写,此时旧的aof文件不会被读取使用,类似rdb# 当前A0F文件的大小是上次AOF大小的100% 并且文件体积达到64m,满足两者则触发重写auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb到底采用RDB还是AOF呢?
计算机内存有限,越大越贵,Redis的高并发高性能都是基于内存的,用硬盘的话GG。
已过期的key如何处理?
设置了expire的key缓存过期了,但是服务器的内存还是会被占用,这是因为redis所基于的两种删除策略。
redis有两种策略∶
所以,虽然key过期了,但是只要没有被redis清理,那么其实内存还是会被占用着的。
那么如果内存被Redis缓存占用满了咋办?
内存占满了,可以使用硬盘,来保存,但是没意义,因为硬盘没有内存快,会影响redis性能。所以,当内存占用满了以后,redis提供了一套缓存淘汰机制∶ ME MORY MANAGEMENT。maxmemory ∶当内存已使用率到达,则开始清理缓存
* noeviction∶旧缓存永不过期,新缓存设置不了,返回错误* allkeys-lru∶清除最少用的旧缓存,然后保存新的缓存(推荐使用)* allkeys-random∶在所有的缓存中随机删除(不推荐)* volatie-lru∶在那些设置了expire过期时间的缓存中,清除最少用的旧缓存,然后保存新的缓存* volatile-random∶在那些设置了expire过期时间的缓存中,随机删除缓存* volatile-ttl∶在那些设置了expire过期时间的缓存中,删除即将过期的Master挂了,如何保证可用性,实现继续读写
什么是哨兵?
Sentinel(哨兵)是用于监控Redis集群中Master状态的工具,是 Redis 高可用解决方案,哨兵可以监视一个或者多个redis master服务,以及这些master服务的所有从服务; 当某个master服务宕机后,会把这个master下的某个从服务升级为master来替代已宕机的master继续工作。示例图:
配置哨兵监控master
创建并且配置sentinel.conf∶
port 26379pidfile "/usr/local/redis/sentinel/redis-sentinel.pid"dir "/usr/local/redis/sentinel"daemonize yes protected-mode nologfile "/usr/local/redis/sentinel/redis-sentinel.1og"# 配置哨兵sentinel monitor mymaster 127.0.0.1 6379 2 #密码sentinel auth-pass <master-name> <password># master被sentinel认定为失效的间隔时间sentinel down-after-milliseconds mymaster 30000 # 剩余的slaves重新和新的master做同步的并行个数sentinel parallel-syncs mymaster 1# 主备切换的超时时间,哨兵要去做故障转移,这个时候哨兵也是一个进程,如果他没有去执行,超过这个时间后,会由其他的哨兵来处理sentinel failover-timeout mymaster 180000启动哨兵x3redis-sentinel sentinel.conf
测试
结论:master挂了以后,由于哨兵监控,剩余slave会进行选举,选举后其中一个成为master,当原来的master恢复后,他会成为slave。
一般master数据无法同步给slave的方案检查为如下∶
查看相关信息
# 查看reminis-master下的master节点信息sentinel master reminis-master# 查看reminis-master下的slaves节点信息sentinel slaves reminis-master# 查看reminis-master下的哨兵节点信息sentinel sentinels reminis-master配置如下:
spring: redis: database: 1 password: reminis sentinel: master: reminis-master nodes: 192.168.32.10:26379,192.168.32.12:26379,192.168.32.13:26379前面我们一起学习了主从复制以及哨兵,他们可以提高读的并发,但是单个master容量有限,数据达到一定程度会有瓶颈,这个时候可以通过水平扩展为多master-slave成为集群。那么这一节开始我们就一起来学习redis-cluster∶他可以支撑多个master-slave,支持海量数据,实现高可用与高并发。
哨兵模式其实也是一种集群,他能够提高读请求的并发,但是容错方面可能会有一些问题,比如master同步数据给slave的时候,这其实是异步复制吧,这个时候master挂了,那么slave上的数据就没有master新,数据同步需要时间的,1-2秒的数据会丢失。master恢复并转换成slave后,新数据则丢失。
特点:
构建Redis集群,需要至少3个节点作为master,以此组成一个高可用的集群,此外每个master都需要配备一个slave,所以整个集群需要6个节点,这也是最经典的Redis集群,也可以称之为三主三从,容错性更佳。所以在搭建的时候需要有6台虚拟机。请各自准备6台虚拟机,可以通过克隆去构建,使用单实例的Redis 去克隆即可。
redis.conf 配置
# 开启集群模式cluster-enabled yes# 每一个节点需要有一个配置文件,需要6份。每个节点处于集群的角色都需要告知其他所有节点,彼此知道,这个文件用于存储集群模式下的集群状态等信息,这个文件是由redis自己维护,我们不用管。如果你要重新创建集群,那么把这个文件删了就行cluster-config-file nodes-201.conf # 超时时间,超时则认为master宕机,随后主备切换cluster-node-timeout 5000 # 开启AOF appendonly yes启动6个redis实例
创建集群
##### 注意1∶如果你使用的是redis3.x版本,需要使用redis-trib.rb来构建集群,最新版使用C语言来构建了,这个要注意# 注意2∶以下为新版的redis构建方式##### 创建集群,主节点和从节点比例为1,1-3为主,4-6为从,1和4.2和5 3和6分别对应为主从关系,这也是最经典用的最多的集群模式redis-cli --cluster create ip1:port1 ip2:port2 ip3:port 3 ip4:port4 ip5:port5 ip6:port6 --cluster-replicas 1slots槽,用于装数据,主节点有,从节点没有
检查集群信息:redis-cli--cluster check 192.168.25.64:6380
最后,让我们来看一下下方的思维导图进行梳理内容:
复习