百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis技术专题系列之数据同步持久化机制

mhr18 2024-11-06 11:00 36 浏览 0 评论

背景介绍

Redis数据恢复的介绍

通常情况下redis的数据全部存储在内存中,数据库一旦故障发生重启数据会全部丢失,持久化功能在于能够有效地避免因进程退出造成的数据丢失问题,在下次重启时利用之前持久化的文件即可实现数据恢复。

Redis高可用的功能基础

即使是在redis cluster或者redis sentinel模式下主从同步数据的恢复仍然需要一段时间。

Redis实际场景的分析

开启Redis持久化之后,数据将存放到磁盘中,数据库执行增量同步的时间要远小于全量同步。在生产环境下故障的数据恢复有着非常重要的作用!

前提概要

Redis是出了名的速度快,那是因为在内存中进行数据存储和操作;如果仅仅是在内存中进行数据存储,那就会导致以下问题

  1. 数据随进程退出而消失当服务器断电或Redis Server进程退出时,内存肯定随之释放,最后数据也会丢失;有些小伙伴认为只是作为缓存,数据没有了,重新从数据库中读取放在里面即可,试想,如果是高并发场景,数据库岂不是压力很大;
  2. 重要数据无法恢复:数据丢失之后无法进行恢复,对于一些重要的数据,只是存在Redis中,而没有存在关系型数据库,如果数据丢失便不可恢复;比如刷礼品排行榜,如果数据丢失,用户肯定不愿意的;对于Redis持久化在工作中和面试过程中是一个很重要的技术点,必用必考,接下来详细说说Redis持久化;

基本介绍

?? Redis持久化有两种方案

  • RDB(Redis DataBase)是一种快照式的二进制数据存储,它会周期性的保存当前时间点Redis所有的数据到磁盘中
  • AOF(Append Of FIle)是一种追加式的存储方式,会实时地记录Redis的写操作到磁盘中

?? Redis持久化机制实现

  1. Redis是基于内存进行操作运算,如果不持久化数据再重启服务时会导致数据丢失
  2. 开启Redis持久化功能后,数据会保存到磁盘中。当redis重启后,可以从磁盘中恢复数据。

?? RDB快照(snapshot)

?? RDB持久化方式

RDB持久化把当前进程数据生成快照(.rdb)文件保存到硬盘的过程,有手动触发和自动触发。

?? RDB手动触发

手动触发有save和bgsave两命令。

?? save命令

  1. 该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止
  2. 执行完成时候如果存在老的RDB文件,就把新的替代掉旧的。我们的客户端可能都是几万或者是几十万,这种方式显然不可取。

在执行redis-cli shutdown关闭redis服务时,如果没有开启AOF持久化,自动执行save

?? bgsave命令

  1. Redis主进程fork一个子进程来创建临时RDB存储文件创建文件完成后对这个临时文件rename替换原先的RDB文件
  2. RDB文件是一个单文件很适合数据的容灾备份与恢复通过RDB文件恢复数据库耗时较短通常1G的快照文件载入内存只需20s左右

?? bgsave命令和save命令

在指定时间间隔内将内存中的数据库记录集dump到磁盘上,RDB是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb

?? RDB自动触发

自动触发是由我们的配置文件来完成的,自动触发bgsave。

?? 配置方法

  • 在redis.conf文件中配置N 秒内数据集至少有 M 个改动时自动触发一次RDB持久化Redis会将数据集的快照dump到dump.rdb文件中
  • 我们也可以通过配置文件来修改Redis服务器dump快照的频率,在打开6379.conf文件之后我们搜索save,可以看到下面的配置信息

?? 60秒内至少有10000个键被修改

  • save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。
  • save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。
  • save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,dump内存快照。

关闭RDB方式持久化只需要将所有save保存策略注释掉即可

?? RDB持久化命令

  • 命令:config set dir /usr/local //设置rdb文件保存路径
  • 备份:bgsave //将dump.rdb保存到usr/local下
  • 恢复:将dump.rdb放到redis安装目录与redis.conf同级目录,重启redis即可

save命令是同步命令,bgsave命令是异步命令,会从redis主进程fork出一个子进程去处理,每次命令执行后会新生成一个rdb文件并覆盖原来的文件。

?? 修改配置

  • rdbcompression yes:rdb文件压缩是否开启
  • dbfilename dump.rdb:rdb文件名称定义

?? RDB的优缺点

1.?? 优点

  • 恢复速度快,适合大数量恢复机制)RDB保存的是某一个时间点的内存快照,非常适合灾难恢复。在恢复大数据集时速度快,1G的RDB数据恢复耗时大概20s,比AOF要快得多

2.?? 缺点

  • (间隔时间大并且丢失数据较为多)RDB通过触发某个时间点条件生成快照文件,如果5分钟保存一次的话,一旦发生故障会丢失好几分钟的数据配置不同的保存点让RDB至少可以保存5分钟的数据。因此,如果Redis由于任何原因没有正确关闭而停止工作,你应该做好丢失最近几分钟的数据
  • (CPU资源占用过大、内存资源占用过多)fork子进程消耗内存和CPU,RDB经常需要 fork() 才能使用子进程在磁盘上持久化。如果数据集很大,fork()可能很耗时,如果数据集非常大,CPU性能不好可能会导致Redis停止为客户机服务几毫秒甚至一秒钟。

?? AOF(append-only file)

由于RDB快照方式的缺点,如果redis由于某些原因导致机器故障时,则会丢失最近几分钟写入的数据,而AOF持久化方式,则通过追加的方式将操作命令添加到appendonly.aof文件中,存储的文件是RESP协议指令文件。

?? 配置方法

  • appendonly yes # 开启AOF持久化,(默认不开启,为no)
  • appendfilename “appendonly.aof”:默认文件名

配置好后,redis每次修改操作的命令会追加到AOF末尾,当redis重启后会重新执行AOF里的命令达到重建缓存数据集的目的,配置刷命令的频率。

  • appendfsync always每次有新命令追加到AOF文件时就执行一次fsync,非常慢但最安全。服务器在每执行一个事件就把AOF缓冲区的内容强制性的写入硬盘上的AOF文件里,保证了数据持久化的完整性,效率是最慢的但最安全的;


  • appendfsync everysec # 服务端每隔一秒才会进行一次文件同步把内存缓冲区里的AOF缓存数据真正写入AOF文件里,兼顾了效率和完整性,极端情况服务器宕机只会丢失一秒内对Redis数据库的写操作;默认方式


  • appendfsync no # 从不fsync交由操作系统处理,速度快,表示默认系统的缓存区写入磁盘的机制,不做程序强制,数据安全性和完整性差一些。


  • bgrewriteaof:后台运作重写机制


  • auto-aof-rewrite-min-size 64mb # aof文件至少要达到64M才会自动重写,文件太小恢复速度本来就很快,重写的意义不大


  • auto-aof-rewrite-percentage 100 # aof文件自上一次重写后文件大小增长了100%,则再次触发重写执行bgrewriteaof命令可以手动重写aof文件,AOF重写redis会fork出一个子进程去做,不会对redis正常命令处理有太多影响。

redis启动时如果既有rdb文件又有aof文件则优先选择aof文件恢复数据,因为aof一般来说数据更全一点。

  • 全量同步(RDB):每天定时(避开高峰期)或者采用一个周期实现将数据拷贝到一个地方
  • 增量同步(AOF):比如采用对行为的操作实现对数据的同步。
  • 增量同步比全量同步更加消耗服务器的内存,但是能够更加地保证数据的同步

AOF的优缺点

1.?? 优点

AOF是通过保存Redis写操作的命令来实现持久化,使用AOF来持久化,Redis数据的安全性将大幅提高,异常宕机情况下最多丢失1s的数据。AOF文件记录了redis的写操作,格式清晰,易于理解和修改,利于数据的重建。

AOF日志是一个只附加的日志,因此如果断电,就不会出现查找或损坏问题。即使日志由于某种原因(磁盘已满或其他原因)以半写的命令结束,redis check aof工具也可以轻松地修复它。

当AOF太大时,Redis能够在后台自动重写AOF。重写是完全安全的,因为当Redis继续附加到旧文件时,一个全新的文件会生成,只需创建当前数据集所需的最少操作集,一旦第二个文件就绪,Redis就会切换这两个文件并开始附加到新文件中。

AOF以易于理解和解析的格式包含所有操作的日志。你甚至可以轻松导出AOF文件。

2.?? 缺点

  • AOF文件通常比相同数据集的等效RDB文件大
  • 根据具体的fsync策略,AOF可能比RDB慢。

使用建议

Redis默认开启了持久化功能,而且是全量RDB的,缺点是服务器宕机后可能会造成数据丢失。 建议最好还是搭配使用aof的everysec,既能够保证数据的同步,效率也还可以,但是会存在丢失一秒数据的可能性,就算丢失也关系不大,因为数据库中已经存在了数据。

混合持久化

如果开启了混合持久化,AOF在重写时,不再是单纯将内存数据转换为RESP命令写入AOF文件,而是将重写这一刻之前的内存做RDB快照处理,并且将RDB快照内容和增量的AOF修改内存数据的命令存在一起,都写入新的AOF文件,新的AOF文件会原子覆盖掉原来的AOF文件。

开启混合持久化命令

aof-use-rdb-preamble yes # 开启混合持久化

appendonly.aof文件中同时保存着RDB和AOF两种格式的数据

RDB、AOF、混合持久化对比



相关推荐

【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...

Pure Storage推出统一数据管理云平台及新闪存阵列

PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...

对Java学习的10条建议(对java课程的建议)

不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...

SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!

官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...

JDK21有没有什么稳定、简单又强势的特性?

佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...

「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了

在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...

Java面试题及答案最全总结(2025版)

大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...

数据库日常运维工作内容(数据库日常运维 工作内容)

#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...

分布式之系统底层原理(上)(底层分布式技术)

作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...

oracle 死锁了怎么办?kill 进程 直接上干货

1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...

SpringBoot 各种分页查询方式详解(全网最全)

一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...

《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略

《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...

LoadRunner(loadrunner录制不到脚本)

一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...

Redis数据类型介绍(redis 数据类型)

介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...

RMAN备份监控及优化总结(rman备份原理)

今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...

取消回复欢迎 发表评论: