微服务学习笔记--高级篇--(Redis持久化)

分布式缓存

Redis集群


单点Redis的问题

数据丢失问题:Redis的内存存储,服务重启可能会丢失数据

并发能力问题:单节点Redis并发能力虽然不错,但无法满足如618这样的高并发场景

故障恢复问题:如果Redis宕机,则服务不可用,需要一种自动的故障恢复手段

存储能力问题:Redis基于内存,单节点能存储的数据量难以满足海量数据的需求

解决方法:
数据丢失问题:实现Redis数据持久化

并发能力问题:搭建主从集群,实现读写分离

故障恢复问题:利用Redis哨兵,实现健康检测和自动恢复

存储能力问题:搭建分片集群,利用插槽机制实现动态扩容


目录:

  • Redis持久化
  • Redis主从
  • Redis哨兵
  • Redis分片集群

Redis持久化

  • RDB持久化
  • AOF持久化

RDB

RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。

快照文件称为RDB文件,默认是保存在当前运行目录。

redis-cli  #连接redis客户端
sava   #由Redis主进程来执行RDB,会阻塞所有命令
bgsave  #推荐使用这个命令,开启子进程执行RDB,避免主进程受到影响

Redis停机时会自动执行一次RDB。

首先需要在Linux系统中安装Redis
安装文档:

首先需要安装REdis所需要的依赖:

yum install -y gcc tcl

然后将资料中的redis安装包上传到虚拟机的任意目录,eg:/temp目录

解压缩:

tar -xvf redis-6.2.4.tar.gz

进入redis目录:

cd redis-6.2.4

运行编译命令:

make && make install

如果没有出错,应该就是安装成功了。

然后修改redis.conf文件中的一些配置

#绑定地址  默认是127.0.0.1 会导致只能在本地访问。修改为0.0.0.0则可以在任意Ip访问
bind 0.0.0.0
# 数据库数量,设置为1
databases 1

启动Redis:

redis-sever redis.conf

停止redis服务:

redis-cli shutdown

Redis内部有触发RDB的机制,可以在redis.conf文件中找到,格式如下:

#900秒内,如果至少有1个key被修改,则执行bgsave,如果是save ""则表示禁用RDB
save  900  1
save  300  10
save  60  10000

RDB的其它配置也可以在redis.conf文件中设置:

# 是否压缩,建议不开启,压缩也会消耗cpu,磁盘的话不值钱
rdbcompression yes

# RDB文件名称
dbfilename dump.rdb

# 文件保存的路径目录
dir ./

bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入RDB文件。

fork采用的是copy-on-write技术:

  • 当主进程执行读操作时,访问共享内存;
  • 当主进程执行写操作时,则会拷贝一份数据,执行写操作。

小结:

RDB方式bgsave的基本流程?

  • fork主进程得到一个子进程,共享内存空间
  • 子进程读取内存数据并写入新的RDB文件
  • 用新的RDB文件替换旧的RDB文件

RDB会在什么时候执行?save 60 1000代表什么含义?

  • 默认是服务停止时
  • 代表60秒至少执行1000次修改则触发RDB

RDB的缺点?

  • RDB执行间隔时间长,两次RDB之间写入数据有丢失的风险
  • fork子进程、压缩、写出RDB文件都比较耗时

AOF

AOF全称位Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看作是命令日志文件。

AOF默认是关闭的,需要修改redis.conf 配置文件来开启AOF:

# 是否开启AOF功能,默认是no
appendonly yes
# AOF文件的名称
appendfilename "appendonly.aof"

AOF的命令记录的频率也可以通过redis.conf文件来配:

# 表示每执行一次写命令,立即记录到AOF文件
appendfsync always
# 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec
# 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no
配置项 刷盘时机 优点 缺点
Always 同步刷屏 可靠性高,几乎不丢数据 性能影响大
everysec 每秒刷盘 性能适中 最多丢失1秒数据
no 操作系统控制 性能最好 可靠性差,可能丢失大量数据

因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key发多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。

Redis也会在触发阈值时自动去重写AOF文件。阈值也可以在redis.conf中配置:

# AOF文件比上次文件 增长超过多少百分比则触发重写
auto-aof-rewite-percentage 100
# AOF文件体积最小多大以上才触发重写
auto-aof-rewrite-min-size 64mb

RDB和AOF各有自己的优缺点,如果对数据安全性要求较高,在实际开发中往往会结合两者来使用。

RDB AOF
持久化方式 定时对整个内存做快照 记录每一次执行的命令
数据完整性 不完整,两次备份之间会丢失 相对完整,取决于刷盘策略
文件大小 会有压缩,文件体积小 记录命令,文件体积很大
宕机恢复速度 很快
数据恢复优先级 低,因为数据完整性不如AOF 高,因为数据完整性更高
系统资源占用 高,大量CPU和内存消耗 低,主要是磁盘IO资源 但AOF重写时占用大量CPU和内存资源
使用场景 可以容忍数分钟的数据丢失,追求更快的启动速度 对数据安全性要求较高常见

猜你喜欢

转载自blog.csdn.net/weixin_42594143/article/details/131123983