灵魂一击!面试和工作重点:Redis持久化
mhr18 2024-11-26 12:01 20 浏览 0 评论
无论面试和工作,持久化都是重点。
一般情况下,redis占用内存超过20GB以上的时候,必须考虑主从多redis实例进行数据同步和备份保证可用性。
rbd保存的文件都是 dump.rdb,都是配置文件当中的快照配置进行生成的。一般业务情况只需要用rdb即可。
aof默认是不开启的,因为aof非常容易产生大文件,虽然官方提供重写但是在文件体积过大的时候还是容易造成阻塞,谨慎考虑使用
rbd和aof在大数据量分别有各种不同情况的系统性能影响,具体使用何种解决策略需要根据系统资源以及业务的实际情况决定。
为什么要持久化?
- 重用数据
- 防止系统故障备份重要数据
持久化的方式
- RDB 快照:将某一个时刻的所有数据写入到磁盘
- AOF(append-only file):将所有的命令写入到此判断。
默认情况:RDB,AOF需要手动开启
redis.conf持久化配置说明
在redis.conf文件当中,存在如下的选项:
redis.conf当中RDB的相关配置
#是否开启rdb压缩 默认开启
rdbcompression yes
#代表900秒内有一次写入操作,就记录到rdb
save 900 1
# rdb的备份文件名称
dbfilename dump.rdb
# 表示备份文件存放位置
dir ./
redis.conf当中AOF的相关配置
# 是否开启aof,默认是关闭的
appendonly no
#aof的文件名称
appendfilename "appendonly.aof"
# no: don't fsync, just let the OS flush the data when it wants. Faster.
# always: fsync after every write to the append only log. Slow, Safest.
# everysec: fsync only one time every second. Compromise.
appendfsync everysec
# 在进行rewrite的时候不开启fsync,即不写入缓冲区,直接写入磁盘,这样会造成IO阻塞,但是最为安全,如果为yes表示写入缓冲区,写入的适合redis宕机会造成数据持久化问题(在linux的操作系统的默认设置下,最多会丢失30s的数据)
no-appendfsync-on-rewrite no
# 下面两个参数要配合使用,代表当redis内容大于64m同时扩容超过100%的时候会执行bgrewrite,进行持久化
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
RDB
创建rdb快照的几种方式:
- 客户端向redis发送bgsave的命令(注意windows不支持bgsave),此时reids调用 fork 创建子进程,父进程继续处理,子进程将快照写入磁盘,父进程继续处理请求。
- 客户端发送save命令创建快照。注意这种方式会阻塞整个父进程。很少使用,特殊情况才使用。
- redis通过shutdown命令关闭服务器请求的时候,此时redis会停下所有工作执行一次save,阻塞所有客户端不再执行任何命令并且进行磁盘写入,写入完成关闭服务器。
- redis集群的时候,会发送sync 命令进行一次复制操作,如果主服务器没有执行或者刚刚执行完bgsave,则会进行bgsave。
- 执行flushall 命令
RDB快照的一些注意点:
- 只使用rdb的时候,如果创建快照的时候redis崩溃,redis会留存上一次备份快照,但是具体丢失多少数据由备份时间查看
- 只适用一些可以容忍一定数据丢失的系统,否则需要考虑aof持久化
- 在大数据量的场景下,特别是内存达到20GB以上的适合,一次同步大约要4-6秒一种方式是用手动同步,在凌晨的适合进行手动阻塞同步,比BGSAVE快一些
一种解决方法:
通过日志记录来恢复中断的日志,来进行数据的恢复
如何通过修改配置来获得想要的持久化?
- 修改save参数,尽量在开发环境模拟线上环境设置save,过于频繁造成资源浪费,过于稀少有可能丢失大量数据
- 日志进行聚合计算,按照save进行计算最多会丢失多少时间的数据,判断容忍性,比如一小时可以设置 save 3600 1
RDB的优缺点对比:
优点:
- 适合大规模的数据恢复
- 如果数据不小心误删,可以及时恢复
- 恢复速度一般情况下快于aof
缺点:
- 需要一定的时间间隔,如果redis意外宕机,最后一次修改的数据就没有了,具体丢失多少数据需要看持久化策略
- fork进程的时候,会占用一定的内存空间,如果fork的内存过于庞大,可能导致秒级别的恢复时间
- 数据文件经过redis压缩,可读性较差
AOF(append only fail)
其实就是把我们的命令一条条记录下来,类似linux的history
默认是不开启的,需要手动开启,开启之后需要重启
如果aof文件错位了,可以用redis-check-aof 进行文件修复
文件同步:写入文件的时候,会发生三件事:
file.write() 方法将文件存储到缓冲区file.flush() 将缓冲区的内容写入到硬盘sync 文件同步,阻塞直到写入硬盘为止
AOC的同步策略
分析:
- 第一种对于固态的硬盘的伤害比较大,我们都知道固态的擦写次数的寿命是远远小于机械硬盘的,频繁的io是容易对固态造成欺骗认为一次擦写,导致本就寿命不长的固态变得更命短,基本不用,特殊情况下有可能用得到
- 第二种是默认的方式,也是推荐以及比较实用的方式,最多只会丢失一秒的数据,这种方式比较好的保证数据的备份可用,推荐使用
- 第三种对于CPU的压力是最小的,因为由系统决定,但是需要考虑能不能接受不定量的数据丢失,还有一个原因是硬盘将缓冲区刷新到硬盘不定时,所以不建议使用
重写和压缩AOF文件:
由于1秒一次同步在不断写入之后造成文件内容越来越大,同时同步速度也会变慢,为了解决这个问题,redis引入了bgrewriteaof命令来进行压缩,和bgsave创建快照类似,同样会有子进程拖垮的问题,同时会有大文件在重写的时候带来巨大的文件系统删除的压力,导致系统阻塞。
命令如下
bgrewriteaof
示例如下:
127.0.0.1:16379> BGREWRITEAOF
Background append only file rewriting started参数控制:
auto-aof-rewrite-percentage:100
auto-aof-rewrite-min-size :64MB
这里案例配置代表当AOF大于64并且扩大了100%将触罚bgrewrite命令
redis aof的rewrite做了哪些事?
- 对于一些冗余的命令进行清除
- 检测存在错误的命令,将错误命令下面的所有命令都进行清理,一般情况是末尾由于宕机没有执行完的一些命令清理。
aof的优缺点对比
优点:
- 从不同步,效率高
- 每秒同步一次,可能丢失一秒数据
- 每次修改都同步,文件完整性好
缺点:
- 相对于数据文件来说,aof远远大于rdb。修复速度慢一些
- 存在未知的bug,比如如果重写aof文件的时候突然中断,会有很多奇怪的现象
如何检查redis的性能瓶颈:
- redis-benchmark 官方推荐的性能测试工具,非常强大,具体的地址为:https://www.runoob.com/redis/...
- Redis-cli中调用slowlog get,作用是返回执行时间超过redis.conf中定义的持续时间的命令列表,注意这个时间仅仅是请求的处理时间,不包含网络通信的时间,默认值是一秒,
redis.conf 当中对于慢日志的解释:
The following time is expressed in microseconds, so 1000000 is equivalent to one second. Note that a negative number disables the slow log, while a value of zero forces the logging of every command.
接下来的时间以微秒为单位,因此1000000等于一秒。 请注意,负数将禁用慢速日志记录,而零值将强制记录每个命令。(以微秒为单位)
slowlog-log-slower-than 10000
There is no limit to this length. Just be aware that it will consume memory. You can reclaim memory used by the slow log with SLOWLOG RESET.
该长度没有限制。 请注意,它将消耗内存。 您可以使用SLOWLOG RESET回收慢速日志使用的内存。(意思就是说超过128条之后的命令会被自动移除)
slowlog-max-len 128
可以用命令 SLOWLOG RESET 清除慢日志占用的内存
127.0.0.1:16379> SLOWLOG reset
OK
==慢日志是存储在内存当中的,切记==
持久化性能建议
因为RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留save 900 1这条规则。如果Enalbe AOF,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自己的AOF文件就可以了。代价一是带来了持续的IO,二是AOF rewrite的最后将rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。只要硬盘许可,应该尽量减少AOF rewrite的频率,AOF重写的基础大小默认值64M太小了,可以设到5G以上。默认超过原大小100%大小时重写可以改到适当的数值。如果不Enable AOF ,仅靠Master-Slave Replication 实现高可用性也可以。能省掉一大笔IO也减少了rewrite时带来的系统波动。代价是如果Master/Slave同时倒掉,会丢失十几分钟的数据,启动脚本也要比较两个Master/Slave中的RDB文件,载入较新的那个。新浪微博就选用了这种架构。
总结对比rdb和aof:
其他拓展知识:
关于linux内核开启transparent_hugepage会带来的阻塞问题:
个人对于Linux学艺不精,就直接引用文章了,侵权请联系删除
Linux 关于Transparent Hugepages的介绍
简单说说THP——记一次数据库服务器阻塞的问题解决
官方解决aof和rdb对于性能问题的折中处理方式
- redis4.0之后有一个参数叫做:aof-use-rdb-preamble yes
参数解释如下:
# When rewriting the AOF file, Redis is able to use an RDB preamble in the
# AOF file for faster rewrites and recoveries. When this option is turned
# on the rewritten AOF file is composed of two different stanzas:
#
# [RDB file][AOF tail]
#
# When loading, Redis recognizes that the AOF file starts with the "REDIS"
# string and loads the prefixed RDB file, then continues loading the AOF
# tail.
#重写AOF文件时,Redis可以在
#AOF文件可加快重写和恢复速度。 启用此选项时
重写的AOF文件上的#由两个不同的节组成:
#
#[RDB文件] [AOF尾巴]
#
#加载时,Redis会识别AOF文件以“ REDIS”开头
#字符串并加载带前缀的RDB文件,然后继续加载AOF
# 尾巴。
大致的内容就是说redis会将较早的部分内容转为RDB文件进行恢复,同时加入近期的数据为AOF文件
加载的时候先执行rdb文件的恢复,然后再加载aof命令
如何进行内存清理
在redis4.0之后,可以通过将配置里的activedefrag设置为yes开启自动清理,或者通过memory purge命令手动清理。
原文链接:https://segmentfault.com/a/1190000038247926
如果觉得本文对你有帮助,可以评论关注支持一下
相关推荐
- 【推荐】一个开源免费、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、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)