实现redis数据持久化
搭建主从集群,实现读写分离
搭建redis哨兵,实现监控监测和自动恢复
搭建分片集群,利用插槽机制实现动态扩容
利用永久性存储介质将数据进行保存,在特定的时间将保存的数据恢复的工作机制称为持久化。
(持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。)
修改redis.conf文件中的save指令,redis会按照命令自动执行(bgsave)。
#900秒内,至少有1个key被修改,则执行bgsave
save 900 1
#文件保存的路径目录
dir ./
#RDB文件名称
dbfilename dump.rdb
bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后,读取内存数据写入Rdb文件,如下图:
问题:
由于bgsave是异步的,子进程在生成rdb文件时,主进程接收请求对数据进行修改。主进程写,子进程读,冲突,怎么办?
回答:
fork采用copy-on-write技术:
·当主进程执行读操作时,访问共享内存;
·当主进程执行写操作时,则会拷贝一份数据执行写操作
AOF全称Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件中,可以看做是命令日志文件。
AOF默认是关闭的,需要在redis.conf文件开启
//是否开启AOF功能,默认是no
appendonly yes
//AOF文件名称
appendfilename "appendonly.aof"
//AOF命令记录的频率
//1、表示每执行一次写命令,都记录到AOF文件
appendfsync always
//2、写命令执行完,先放入AOF缓存区中,然后每隔一秒将缓存区数据写入AOF文件(默认)
appendfsync everysec
//3、写命令执行完,先放入AOF缓存区中,由操作系统决定何时写入磁盘
appendfsync no
因为是记录命令,AOF文件会比RDB文件大的多;AOF会记录同一个key的多次写操作,但只有最后一次有意义 bgrewriteaof
//重写文件
bgrewriteaof
//AOF文件比上次文件 增长超过多少百分比才触发重写
auto-aof-rewrite-percentage 100
//AOF文件体积最小在64m以上才触发重写
auto-aof-rewrite-min-size 64mb
作用:降低磁盘占用量;提高持久化效率;提高数据恢复效率
单节点Redis的并发能力是有上限,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。
主节点master,负责写操作;从节点slave,负责读操作,一主多从,增大读的能力;master数据同步slave节点
(1)创建目录
mkdir 7001 7002 7003
(2)复制redis.conf文件
cp redis-6.1.4/redis.conf 7001
修改port,dir
添加 声明ip replica-announce-ip 162.168.150.101
(3)配置主从
从节点修改配置文件(永久生效)
在redis.conf中添加replicaof/slaveof
使用redis-cli客户端连接redis服务时,执行replicaof命令(重启后失效)
查看情况 info replication
slave节点断开又恢复,并且在repl_baklog中能找到offset时。
如何获取节点状态?
】。选择slave依据是什么?
】【如何实现故障转移
】Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令
首先会判断slave节点与master节点断开时间长短,如果超过指定值down-after-milliseconds * 10,则会排除该节点
判断salve节点的slave-priority,值越小优先级越高,如果是0,则永不参与
判断salve节点的offset值,值越大说明数据越新,优先级越高【最重要】
判断slave节点的运行id大小,越小优先级越高
当选择一个slave节点作为新的master后,故障转移步骤如下:
sentinel给备选的slave节点发送slaveof no one 命令,让该节点成为master节点
sentinel给所有其他的slave发送slaveof 【ip】【port】命令,让这些slave成为新master的从节点,开始从新的master上同步数据。
sentinel将故障节点标记为slave,执行slaveof命令,当故障恢复后,自动成为slave节点。
(1)mkdir s1 s2 s3
(2)在s1下新建sentinel.conf文件
(3)启动
redis-sentinel s1/sentinel.conf
(1)在pom文件中引入spring-boot-starter-data-redis
(2)application.yml指定sentinel相关信息
(3)配置主从读写分离
主从和哨兵可以解决高可用、高并发读的问题,但是不能解决海量数据存储和高并发写的问题。
特征:
(1)mkdir 7001 7002 7003 8001 8002 8003
(2)redis.conf文件
(3)复制文件到文件夹下,并修改
(4)启动
查看状态ps -ef|grep redis
(5)创建集群
redis-cli --cluster create --cluster-replicas 1 ip1:port1 ip2:port2 …
命令说明:
n = 节点总数 / (replicas + 1)
得到的就是master的数量。因此前n个是master,其他的是slave节点。(6)测试
redis-cli -p 7001 cluster nodes
数据key不是与节点绑定,而是与插槽绑定。【为什么?】
将同一类数据固定的保存在同一个Reids实例中,需要数据使用相同的有效数据,如key都已{typeId}为前缀
(1)添加节点
redis-cli --cluster add-node 192.168.150.101:7004 192.168.150.101:7001
(2)分 插槽
redis-cli --cluster reshard 192.168.150.101:7001
master宕机发生什么?
答:首先是该实例与其他实例失去连接;然后是疑似宕机,最后是确定下线,自动提升一个slave成为新的master
(1)引入redis的starter依赖
在pom文件中引入spring-boot-starter-data-redis
(2)配置分片集群地址