最新要闻
- 赫德-德普官司以一百万美元赔偿和解
- 百度地图首发自研“北斗高精”技术 升级“真”车道级导航
- 【环球时快讯】中国版“猛禽”!长城山海炮大型皮卡实车现身:配自研3.0T、9AT
- 上海首张城市高级辅助驾驶地图许可来了 百度率先获批
- 环球快看点丨伊朗男子65厘米创吉尼斯最矮纪录:站起来才到到成人膝盖处
- 【世界时快讯】安卓抄错了?iPhone 15 Pro最新概念图:告别纯直边
- 当前关注:网络谣言别再传了!短视频中梅西抱的不是母亲:是阿根廷队女厨师
- 天天通讯!微软、谷歌之后 欧盟反垄断又对美国Meta下手:可罚款上百亿美元
- 每日视讯:4K游戏串流没了 NVIDIA删除使用9年的GameStream功能引用户不满
- 2022最后一跌!今起油价下调:加满一箱92号汽油少花19.5元
- 消息!苹果App Store被法国罚款100万美元:Epic CEO、扎克伯格都曾痛批
- 多次骂新能源!丰田再度质疑汽车全面电动化:中国品牌弯道超车
- 35岁本泽马宣布从法国队退役:球迷唏嘘 祝福俱乐部继续精彩
- 环球播报:北京等多地天空疑现震撼的火箭夜光云:原理科普
- 年出货3亿只、逛店必买的一次性碱性电池:被宜家正式停售了
- 环球新资讯:抖音在世界杯上下的功夫 远不止撒币10亿买版权这么简单
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
Redis的AOF持久化
介绍 AOF 日志
AOF 持久化是通过保存 Redis 服务器所执行的写命令来记录数据库状态。
(资料图片仅供参考)
假设 AOF 日志记录了自 Redis 实例创建以来所有的修改性命令,那么就可以通过对一个空的 Redis 实例顺序执行所有的命令,也就是「重放」,来恢复 Redis 当前实例的内存数据结构的状态。
被写入 AOF 文件的所有命令都是以 Redis 的命令请求协议格式保存的, 因为 Redis 的命令请求协议是纯文本格式, 所以我们可以直接打开一个 AOF 文件, 观察里面的内容。
在这个 AOF 文件里面, 除了用于指定数据库的 select 命令是服务器自动添加的之外, 其他都是我们之前通过客户端发送的命令。
每一条命令对应的 AOF 日志首先会以“*+命令包含的部分数量”开始(该命令由几部分组成)每部分由“$+数字”开头,后面紧跟着该部分的字符(具体的命令、键或值),“数字”表示这部分字符一共有多少字节。
我们以 Redis 执行“set testkey testvalue”命令后记录的 AOF 为例,看看 AOF 日志的内容。
其中,“*3”表示当前命令有三个部分;“$3 set”表示这部分有 3 个字节,也就是“set”命令。
AOF 持久化的实现原理
AOF 持久化功能的实现可以分为命令追加(append) 、 文件写入(wirte)、文件同步(sync) 三个步骤。
命令追加(append)
当 AOF 持久化功能处于打开状态时, 服务器在执行完一个写命令之后, 会以协议格式将被执行的写命令追加到服务器状态(redisServer 结构体)的 aof_buf (简单动态字符串 类型)的末尾:
struct redisServer {// ...// AOF缓冲区sds aof_buf;// ...};
文件写入(wirte)、文件同步(sync)
Redis 的服务器进程就是一个事件循环(loop),这个循环中的文件事件负责接收客户端的命令请求,以及向客户端发送命令回复, 而时间事件则负责执行像 serverCron 函数这样需要定时运行的函数。
因为服务器在处理文件事件时可能会执行写命令, 使得一些内容被追加到 aof_buf 缓冲区里面, 所以服务器在每次结束一个事件循环之前,它都会调用 flushAppendOnlyFile 函数, 考虑是否需要将 aof_buf 缓冲区中的内容写入和保存到 AOF 文件里面, 这个过程可以用以下伪代码表示:
def eventLoop(): while True: #处理文件事件,接收命令请求以及发送命令回复 #处理命令请求时可能会有新内容被追加到 aof_buf 缓冲区中 processFileEvents() #处理时间事件 processTimeEvents() #考虑是否要将 aof_buf中的内容写入和保存到 AOF文件里面flushAppendOnlyFile()
AOF 的写回策略
flushAppendOnlyFile 函数的行为由服务器配置的 appendfsync 选项的值来决定, 各个不同值产生的行为如下所示。
- 值为 Always,同步写回:将 aof_buf 缓冲区里面的所有内容写入并同步到 AOF 文件(wirte + fsync,fsync 由主线程执行)
- 值为 Everysec,每秒写回:将 aof_buf 缓冲区里面的所有内容写入到 AOF 文件,如果上次同步 AOF 文件的时间距离现在超过一秒钟,那么再次对 AOF 文件进行同步,并且这个同步操作是由一个线程专门负责执行的(write,如果距离上次同步的时间超过一秒钟就 fsync,fsync 由子线程执行)
- 值为 No,操作系统控制的写回:将 aof_buf 缓冲区里面的所有内容写入到 AOF 文件,但不对 AOF 文件进行同步,何时同步由操作系统来决定(只 write,不 fsync;fsync 的时机由操作系统决定)
如果用户没有主动为 appendfsync 选项设置值, 那么 appendfsync 选项的默认值为 everysec。
将 aof_buf 缓冲区里面的所有内容写入到 AOF 文件的意思是,将内容写入内核缓冲区。
将 aof_buf 缓冲区里面的所有内容写入并同步到 AOF 文件的意思是,将内核写入内核缓冲区,并将内核缓冲区中的数据同步到磁盘。
注意,在实际运行中, 程序在 Everysec 模式下对 fsync 或 fdatasync 的调用并不是每秒一次,它和调用 flushAppendOnlyFile 函数时 Redis 所处的状态有关。
每当 flushAppendOnlyFile 函数被调用时, 可能会出现以下四种情况:
- 子线程正在执行 fsync ,并且:
- 这个 fsync 的执行时间未超过 2 秒,那么程序直接返回,并不执行 write 或新的 fsync 。
- 这个 fsync 已经执行超过 2 秒,那么程序执行 write,但不执行新的 fsync 。(注意,因为这时 write 的写入必须等待子线程先完成旧的 fsync ,因此这里 write 会比平时阻塞更长时间。
- 子线程没有在执行 fsync ,并且:
- 上次成功执行 fsync 距今不超过 1 秒,那么程序执行 write,但不执行 fsync 。
- 上次成功执行 fsync 距今已经超过 1 秒,那么程序执行 write 和 fsync 。
Redis 官网上所说的, AOF 在“每秒写回”时发生故障, 只丢失 1 秒钟数据的说法, 实际上并不准确。
AOF 持久化的效率和安全性
服务器配置 appendfsync 选项的值直接决定 AOF 持久化功能的效率和安全性。
- always 的效率是 appendfsync 选项三个值当中最慢的一个, 但从安全性来说, always 也是最安全的, 因为即使出现故障停机, AOF 持久化也只会丢失一个事件循环中所产生的命令数据。
- everysec 的效率足够快, 并且就算出现故障停机, 数据库也只丢失几秒钟的命令数据。
- no 的效率最快,不过因为这种模式会在系统缓存中积累一段时间的写入数据,当出现故障停机时,服务器将丢失上次同步 AOF 文件之后的所有写命令数据。
三种写回策略体现了系统设计中的一个重要原则 ,即 trade-off,或者称为“取舍”,指的就是在性能和可靠性保证之间做取舍。
AOF 文件重写
技术是为了解决问题而生的,AOF 文件重写用于减少 AOF 文件的体积, 减少使用 AOF 文件来进行数据还原所需的时间 。
所以随着服务器运行时间的流逝, AOF 文件中的内容会越来越多, 文件的体积也会越来越大, 如果不加以控制的话, 体积过大的 AOF 文件很可能对 Redis 服务器、 甚至整个宿主计算机造成影响, 并且 AOF 文件的体积越大, 使用 AOF 文件来进行数据还原所需的时间就越多。
为了解决 AOF 文件体积膨胀的问题, Redis 提供了 AOF 文件重写(rewrite) 功能。 通过该功能, Redis 服务器可以创建一个新的 AOF 文件来替代现有的 AOF 文件, 新旧两个 AOF 文件所保存的数据库状态相同,但新 AOF 文件不会包含任何浪费空间的冗余命令, 所以新 AOF 文件的体积通常会比旧 AOF 文件的体积要小得多。
AOF 文件重写的实现原理
虽然 Redis 将生成新 AOF 文件替换旧 AOF 文件的功能命名为“AOF 文件重写”,但实际上,AOF 文件重写并不需要对现有的 AOF 文件进行任何读取、分析或者写入操作,这个功能是通过读取服务器当前的数据库状态来实现的。
AOF 重写功能的实现原理就是,首先从数据库中读取键现在的值, 然后用一条命令去记录键值对, 代替之前记录这个键值对的多条命令。
在 Redis4.0 后支持混合持久化方式,如果使用混合持久化:
- 当服务器执行写命令后,Redis 会以 AOF 持久化方式将命令写回 incr.aof 文件。
- 当进行 AOF 文件重写时,Redis 会以 RDB 持久化方式将当前数据库状态保存到名为 base.aof 文件,然后再将 AOF 重写缓冲区中的所有内容写入 incr.aof 文件。
- 当 Redis 服务器重启后,将载入 base.aof 和 incre.aof 文件以还原数据库状态。
子进程执行 AOF 文件重写
Redis 不希望 AOF 重写造成服务器无法处理请求, 所以 Redis 将 AOF 重写程序放到子进程里执行, 这样做可以同时达到两个目的:
- 子进程进行 AOF 重写期间, 服务器进程(父进程) 可以继续处理命令请求。
- 子进程带有服务器进程的数据副本, 使用子进程而不是线程, 可以在避免使用锁的情况下, 保证数据的安全性。
Redis 需要处理在 AOF 重写期间,服务器执行的所有写命令,否则服务器当前的数据库状态和重写后的 AOF 文件所保存的数据库状态将不一致。
为了解决这种数据不一致问题, Redis 服务器设置了一个 AOF 重写缓冲区, 这个缓冲区在服务器创建子进程之后开始使用。当 Redis 服务器执行完一个写命令之后, 它会同时将这个写命令发送给 AOF 缓冲区(名为 aof_buf 的简单动态字符串)和 AOF 重写缓冲区,当子进程完成创建新 AOF 文件的工作之后, 服务器会将重写缓冲区中的所有内容追加到新 AOF 文件的末尾, 使得新旧两个 AOF 文件所保存的数据库状态一致。 最后,服务器用新的 AOF 文件替换旧的 AOF 文件, 以此来完成 AOF 文件重写操作。
这样一来可以保证:
- AOF 缓冲区的内容会定期被写入和同步到 AOF 文件, 对现有 AOF 文件的处理工作会如常进行。
- 从创建子进程开始, 服务器执行的所有写命令都会被记录到 AOF 重写缓冲区里面。
AOF 文件重写的触发时机
AOF — Redis 设计与实现 (redisbook.readthedocs.io)
AOF 重写可以由用户通过调用bgrewriteaof手动触发。
另外, 服务器在 AOF 功能开启的情况下, 会维持以下三个变量:
- 记录当前 AOF 文件大小的变量 aof_current_size 。
- 记录最后一次 AOF 重写之后, AOF 文件大小的变量 aof_rewrite_base_size 。
- 增长百分比变量 aof_rewrite_perc 。
每次当 serverCron 函数(时间事件)执行时,它都会检查以下条件是否全部满足,如果全部满足的话, 就会触发自动的 AOF 重写:
- 没有 bgsave 命令在进行。
- 没有 bgrewriteaof 在进行。
- 当前 AOF 文件大小大于 server.aof_rewrite_min_size (默认值为 64 MB)。
- 当前 AOF 文件大小和最后一次 AOF 重写后的大小之间的比率大于等于指定的增长百分比。
默认情况下, 增长百分比为 100% , 也即是说, 如果前面三个条件都已经满足, 并且当前 AOF 文件大小比最后一次 AOF 重写时的大小要大一倍的话, 那么触发自动 AOF 重写。
Redis 的服务器周期性操作函数 serverCron 默认每隔 100 毫秒就会执行一次, 该函数用于对正在运行的服务器进行维护。
AOF 配置的选项
# appendonly参数开启AOF持久化appendonly no# AOF持久化的文件名,默认是appendonly.aofappendfilename "appendonly.aof"# AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的dir ./# 同步策略# appendfsync alwaysappendfsync everysec# appendfsync no# aof重写期间是否同步no-appendfsync-on-rewrite no# 重写触发配置auto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb# 加载aof出错如何处理aof-load-truncated yes# 文件重写策略aof-rewrite-incremental-fsync yes
参考资料
《Redis 设计与实现》
Redis的AOF持久化
【报资讯】防火墙功能(锐捷安全篇)
当前热文:多方安全计算(4)MPC万能积木:秘密共享
【全球时快讯】多方安全计算(3)MPC万能钥匙:混淆电路
全力推进企业数智赋能发展主线,低代码任重道远
天天要闻:linux安装stable diffusion2.0完整教程-还不会安装sd2.0?一篇文章教会你AI绘画
焦点速读:proto IDL管理工具buf使用实践
P2329 栅栏
全球观点:Xml转Java实体类对象 xml转Javabena 对象 且多级嵌套 复杂嵌套
世界动态:用Python写一个一次性计算出加减乘除的运算小程序
世界热文:实验一:获取主机信息
全球播报:MySQL-InnoDB磁盘结构
今日热议:pkg对egg项目打包
天天精选!java的final关键字
环球快报:【验证码逆向专栏】某片滑块、点选验证码逆向分析
环球热议:别再用 JWT 作为 Session 系统了,问题重重,后果很危险!
全球球精选!Osx10.14升级watchman踩坑记
时讯:二分法
用Python来写个小型购物车程序
天天观速讯丨基于 Dubbo Admin 动态进行流量隔离
赫德-德普官司以一百万美元赔偿和解
百度地图首发自研“北斗高精”技术 升级“真”车道级导航
【环球时快讯】中国版“猛禽”!长城山海炮大型皮卡实车现身:配自研3.0T、9AT
上海首张城市高级辅助驾驶地图许可来了 百度率先获批
环球快看点丨伊朗男子65厘米创吉尼斯最矮纪录:站起来才到到成人膝盖处
热门:如何基于 Spring Boot 快速开发一个 Dubbo 微服务应用
【世界时快讯】安卓抄错了?iPhone 15 Pro最新概念图:告别纯直边
当前关注:网络谣言别再传了!短视频中梅西抱的不是母亲:是阿根廷队女厨师
天天通讯!微软、谷歌之后 欧盟反垄断又对美国Meta下手:可罚款上百亿美元
每日视讯:4K游戏串流没了 NVIDIA删除使用9年的GameStream功能引用户不满
2022最后一跌!今起油价下调:加满一箱92号汽油少花19.5元
消息!苹果App Store被法国罚款100万美元:Epic CEO、扎克伯格都曾痛批
多次骂新能源!丰田再度质疑汽车全面电动化:中国品牌弯道超车
35岁本泽马宣布从法国队退役:球迷唏嘘 祝福俱乐部继续精彩
Python单元测试框架unittest
环球播报:北京等多地天空疑现震撼的火箭夜光云:原理科普
年出货3亿只、逛店必买的一次性碱性电池:被宜家正式停售了
环球新资讯:抖音在世界杯上下的功夫 远不止撒币10亿买版权这么简单
差评如潮!《三体》动画评分暴跌至6.4:网友"口吐芬芳"
快讯:Epic与美国FTC和解:36.6亿元摆平两起官司
Spring IOC官方文档学习笔记(二)之Bean概述
焦点观察:FreeSWITCH学习笔记:通道变量
焦点关注:32开书本大小!华硕新款12代酷睿i7迷你机PC发布:零噪音
环球即时:内蒙古上空巨大发光体划破天际 网友:像手电筒一样
192个框框的怪兽!AMD Zen4线程撕裂者7000来了
世界快报:Django框架:9、Ajax简介、基本语法、数据编码格式、携带文件数据
马斯克现身世界杯观战阿根廷对法国:赛后发出灵魂拷问
【环球播资讯】梅西夺冠穿的黑纱是什么登上热搜:官方科普涨知识 意义非凡
今日快讯:小米13 Pro 8.38mm机身塞入太多强悍功能!雷军:相当不容易
当前快播:明年初亮相 全新东风标致408X即将发布:最美法系车来了
被裁员工报仇?近60%人赞成!马斯克将卸任推特CEO 没继承者还是我掌权
今日快讯:真值200+一张票价吗?《阿凡达2》用户评分:特效很棒 剧情稀烂
观察:小姐姐最爱!小米米家首款无线直板夹上架:30秒速热 369元
环球速看:Java关键词final解读
环球视点!简单排序
全球观焦点:数据结构与算法概念
AMD/Intel CES 2023新品发布会官宣:5大CPU齐飞
《阿凡达2:水之道》若大卖 《阿丽塔:战斗天使》续作可能有戏了!
OPPO首款竖向折叠屏Find N2 Flip评测:电池不再是遗憾 媲美传统直板手机
【环球播资讯】你能接受么?微软计划推出更廉价XGP:广告是代价
确认了!小米13系列没有砍掉Wi-Fi 7:将择机打开功能
安装VScode
linux设备树实现多个中断父(interrupt-parent)节点
当前观点:阿根廷夺冠 花16万现场看世界杯决赛的男子哭着说值了
热文:家长注意!2岁男童将硬币塞进电动车充电口 手被炸黑
天天最新:手工耿自制钓鱼佬智能快乐竿:外形酷似大狙 上钩主动提醒
当前头条:【活动预告】网易数帆首场低代码线上沙龙即将开启,报名从速!
全球头条:美国核聚变重要突破 “人造太阳”10年后有望实现发电 我国企业呢?
天天报道:联想USB 3.0扩展坞仅29元:4个USB接口 支持Type-C供电
环球滚动:颠覆认知的研究!人类可能在树上就学会了直立行走
天天快资讯:温和洁肤 六神茗茶植萃沐浴露:25.9元买一送一
满满维生素 乐源100%纯果汁大促:到手每瓶3块钱
全球头条:java中的代码块
天天观点:大数据 - DWD&DIM 业务数据
环球热点!springboot通过Referer防止跨站点请求伪造
天天微动态丨Tarjan算法求割点
最新快讯!腾讯游戏AI能帮医生看片了:超大尺寸扫描病理图像诊断成功验证
【天天报资讯】号称可以火星上穿的衣服全网首开:胸前一个大洞 自带呕吐袋
环球讯息:管好右手 摩托车弯道狂飙超车撞上护栏:骑手生死未卜
【全球聚看点】2022第三季度耳机手环出货量都跌了!因为苹果 手表逆势增长
国产龙鳞甲电池2023年装车量产:续航可达1000公里 安全没问题
环球最新:零基础入门 Java 后端开发,有哪些值得看的视频?
NVIDIA CES新品发布会官宣:RTX 4070 Ti、RTX 40笔记本显卡要来了
当前关注:美国侧目:俄罗斯生产首颗百分百国产通信卫星
观点:226MB你用吗?微信键盘正式版上线 张小龙:更好保护用户隐私
快报:新的全球制造中心越南、印度正崛起:想取代我们为时尚早
环球微资讯!30万级美系大SUV 福特探险者混动版曝光:电池来自比亚迪
天天热资讯!SIT-board 远程交互式白板的实现
洛谷 P6580 [Ynoi 2019] 美好的每一天~ 不连续的存在 题解
热头条丨火山引擎 DataTester 科普:A/B 实验常见名词解释
世界报道:Shell 变量知多少?
全球今头条!在Windows Linux中 安装 anaconda
讯息:无线投屏(智慧教室)
天天看热讯:二分的边界问题
Controller 层代码就该这么写,简洁又优雅!
SAP根据excel表格数据将数据导入表中
全球快看:JS中的相等性判断
半夜是指什么时间?半夜是指什么生肖?
三浴是什么意思?三浴锻炼是指哪三浴?
45号钢抗拉强度极限是多少?45号钢抗拉强度极限一览