你如何选择合适的 redis 持久化方式?

您所在的位置:网站首页 redis持久化过程 你如何选择合适的 redis 持久化方式?

你如何选择合适的 redis 持久化方式?

2023-02-26 02:15| 来源: 网络整理| 查看: 265

Redis是互联网技术领域中使用最广泛的存储中间件,一般作为软件架构设计的底层存储组件之一。主要是Redis是基于内存设计的,掉电容易丢数据,其持久化实现方案主要有AOF和RDB两种实现方式。Redis是互联网技术领域中使用最广泛的存储中间件,一般作为软件架构设计的底层存储组件之一。主要是Redis是基于内存设计的,掉电容易丢数据,其持久化实现方案主要有AOF和RDB两种实现方式。

Redis 是No SQL系统数据库的典型代表,是“Remote Dictionary Service(远程字典服务)”的缩写。一般情况下,我们会把Redis用于软件系统架构设计中数据异构,相关业务数据缓存,甚至早期被用于跨JVM进程的分布式锁场景等。

Redis的主要是基于Key-Value结构设计存储系统,需要部署在服务器上或者对应的计算机上,其数据全部都在内存之中。一般来说,系统出现服务挂掉或者掉电,就会导致数据出现丢失的情况。其Redis为了保障这种因为故障而丢失数据的情况,提供了一种“持久化“的机制,即就是我们常说的Redis持久化实现方案。

总的来说,Redis持久化实现方案主要有AOF和RDB两种实现方式,其中:

AOF(Append Only File)日志文件RDB(Redis Database Backup File)数据快照(一). Redis数据落地磁盘流程

虽然,Redis的应用场景是基于内存来设计的,其中数据是存储在内存中的,并没有存储在磁盘上,这也是Redis性能高的主要原因之一。但是为了防止因为系统故障而丢失数据,最终的方案还是需要把数据落地到系统磁盘当中,其落地系统磁盘的流程如下:

客户端向服务端发送写操作(数据在客户端的内存中)。数据库服务端接收到写请求的数据(数据在服务端的内存中)。服务端调用write这个系统调用,将数据往磁盘上写(数据在系统内存的缓冲区中)。操作系统将缓冲区中的数据转移到磁盘控制器上(数据在磁盘缓存中)。磁盘控制器将数据写到磁盘的物理介质中(数据真正落到磁盘上)。

综上所述,一般在理想条件下一个正常的保存流程,但是在大多数情况下,因为网络不可靠,或者机房断电等等都会有各种各样的故障,一般我们都关注以下两种情况:

假设Redis数据库自身发生故障,只要在上面的第三步执行完毕,那么就可以持久化保存,剩下的两步由操作系统替我们完成。 假设操作系统发生故障,必须上面5步都完成才可以。

在这里只考虑了保存的过程可能发生的故障,其实保存的数据也有可能发生损坏,需要一定的恢复机制。

(二). 基于AOF日志文件持久化

采用日志的形式来记录每个操作命令,追加到AOF日志文件的末尾,并且是执行完命令才记录日志的。

Redis在系统默认情况下是不会开启AOF的,当Redis服务出现故障,重启Redis服务时重新执行AOF文件中的记录的命令来回复数据,主要是解决持久化的实时性问题。

简单来说,AOF日志文件持久化是“先执行命令,后记录日志“的规则。主要是Redis利用AOF记录日志的时候,不会进行Redis操作命令的语法检查,如果“先记录日志,再记录执行命令”的话会包含部分执行错误的命令,从而在Redis使用AOF日志文件来恢复数据时,可能回产生系统异常或者报错,导致数据恢复流程失败。

基于AOF日志文件持久化会出现的两个问题:

AOF日志文件持久化会丢失数据:一般当执行完某个更新操作命令,但是未记录日志,此时故障发生就会直接导致数据丢失。AOF日志文件持久化会阻塞操作请求:不会阻塞当前请求,但是会阻塞下一个操作请求。

基于AOF日志文件持久化常见的策略方案,主要是通过在redis.conf中依据appendfsync参数来设置:

always: 同步重写,当Redis操作命令执行完毕就直接落地系统磁盘,基本可以保证数据不会丢失everysec: 每个命令执行完毕,先把日志记录写入到AOF内存缓冲区,每隔一秒同步落地系统磁盘,一般比较折中,推荐设置。no: 把日志记录写入到AOF内存缓冲区,再由操作系统去决定何时落地系统磁盘。性能虽然高效,但是容易丢失数据。

这里特别指出,基于AOF日志文件持久化是由主线程来完成日志记录的主动写入的,而由于随着时间的推移,AOF日志文件会过大,Redis又提供了一种“重放日志“的机制,主要是通过后台的子进程托管给bgrewriteaof来完成,还可以合并一些无效和过期数据,从而达到精简压缩空间的目的。

综上所述,基于AOF日志文件持久化机制的数据一致性和完整性相对比较高,能解决实时性问题且实现秒级丢失。同时,相同数据集,AOF日志文件持久化的文件比较大,但是其恢复数据的速度慢。

(三). 基于RDB数据快照持久化

主要是把内存数据以“快照”的形式保存到系统磁盘中,而RDB记录的是某一个时刻的数据,而不是Redis操作指令。

Redis在系统默认情况下是直接缺省支持RDB数据快照持久化的,主要是在指定时间间隔内,执行指定次数的操作,将内存中的数据直接落地写入磁盘的。

执行完操作后,会在指定目录生成一个dump.rdb文件,当Redis发生故障,服务重启时,通过加载dump.rdb文件来恢复数据。

基于RDB数据快照持久化的策略方案,主要分为主动触发和自动触发两种,其中:

手动触发:主要有同步(save)和异步(bgsave)两种方案,其中:同步(save)会阻塞Redis服务器,步(bgsave)是Redis主进程会fork操作子进程来完成。自动触发:主要是通过save m n来配置实现,其中:表示m秒内若数据集存在n次修改,自动触发 bgsave来实现数据落地磁盘

综上所述,基于RDB数据快照持久化机制的数据恢复速度比较快,适合大规模数据恢复场景,比如:全量复制和全量备份。同时,相比AOF来说,其文件小,但是无法做到实时和秒级别持久化。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3