浅谈:Redis持久化机制,AOF看这一篇就够用了
nanshan 2024-10-20 07:35 18 浏览 0 评论
之前我们提及到了redis的默认持久化方式RDB,是一种通过存储快照数据方式持久化的机制,它在宕机后会丢失掉最后一次更新RDB文件后的数据,这也是由于它只关注于数据结果导致的。那么我们思考一下,有没有一种方式能够把数据存储、修改、删除这种变化的过程记录下来,也就是记录那些set,hset,del语句,等到redis重启后直接执行一遍这些语句即可,由此来达到数据恢复的效果呢?这样的话是不是就不会过多的丢失数据呢?由于是记录的过程,它可能仅仅会丢失宕机时的那一刻那一秒的数据而已。此刻,一种补充性的持久化机制AOF应运而生了,它就是一种只关注过程不关注结果的持久化机制。
AOF
AOF(append only file)是redis持久化的另一种机制,在默认情况下是不开启的。根据英文append only file 翻译成英文的意思:仅仅追加文件,意思是不断的去追加记录那些写入命令写入文件中,可以明白这是一个过程的记录。
? 当redis开启AOF持久化后,redis将所有对数据库进行过的写入的命令(及其参数)记录到AOF文件,以此达到记录数据库状态的目的。
? 也就是说当redis重启之后只要按顺序回放这些命令就会恢复到原始状态了。
? 再重申一遍,AOF会记录过程,RDB只管结果。
AOF的持久化实现
通过配置redis.conf来进行开启和其他的一些设置
# 可以通过修改redis。conf配置文件中的appendonly参数开启
appendonly yes
#AOF文件的保存位置和ROB文件的保存位置相同,通过dir ./参数设置的
dir ./
#默认的文件名是appendonly.aof, 可以通过appendfilename参数修改
appendfilename appendonly.aof
AOF原理
AOF文件中存储的是redis的命令,同步命令到 AOF 文件的整个过程可以分为三个阶段,他们分别是:命令传播,缓存追加,文件写入和保存。
- 命令传播:当redis的客户端执行命令时,它会通过网络连接,将协议文本发送给redis的服务器,服务器会根据协议文本里面的内容,选择适当的命令函数,将各个参数从文本转换为redis的字符串对象。命令执行成功后,命令参数就会被传播到AOF程序。
- 缓存追加:AOF程序接受到那些命令参数,数据啥的,又会转换为原来的协议文本,协议文本生成之后就会被追加到redis.h/redisServer 结构的 aof_buf 末尾。也就是把协议内容追加到了服务器的AOF缓存里面了。
- 文件写入和保存:AOF 缓存中的内容被写入到 AOF 文件末尾,如果设定的 AOF 保存条件被满足的话, fsync 函数或者fdatasync 函数会被调用,将写入的内容真正地保存到磁盘中。(解释:每当服务器常规任务函数被执行、 或者事件处理器被执行时, aof.c/flushAppendOnlyFile 函数都会被调用, 这个函数执行以下两个工作:WRITE:根据条件,将 aof_buf 中的缓存写入到 AOF 文件。SAVE:根据条件,调用 fsync 或 fdatasync 函数,将 AOF 文件保存到磁盘中。)
AOF保存模式
Redis目前支持三种的AOF保存模式,他们分别是:
- AOF_FSYNC_NO:不保存
- 调用flushAppendOnlyFile函数,WRITE都会被执行,但SAVE会被忽略。
- AOF_FSYNC_EVERYSEC:每一秒保存一次。(默认)
- 在这种模式中, SAVE 原则上每隔一秒钟就会执行一次, 因为 SAVE 操作是由后台子线程(fork)调用的, 所以它不会引起服务器主进程阻塞。
- AOF_FSYNC_ALWAYS:每执行一个命令保存一次。(不推荐,极大影响redis效率)
- 每次执行完一个命令之后, WRITE 和 SAVE 都会被执行。
- 因为save是由主进程执行的,所以在执行期间,主进程会被阻塞,不能接受命令请求。
AOF重写机制
AOF不断的记录数据的变化过程,时间一长,数据就会越来越多,它就得需要重写一下,进行数据的瘦身,所谓AOF重写,无非就是把针对于某个数据的操作去除中间过程,只保留起始即可,毕竟我们想恢复的是一个最终态。举个例子帮助理解:
命令输入 | 没有重写的AOF数据记录 | 重写后的AOF数据记录 |
step1:set singer xusong | set singer xusong | set singer xuezhiqian |
step2:set singer wangsulong | set singer wangsulong | |
step3:set singer xuezhiqian | set singer xuezhiqian |
很明显,重写后的AOF文件记录的比没有重写的少记录两行,大大节省空间。
Redis不希望AOF重写造成服务无法处理请求,所以redis决定将重写程序放在子进程里面执行,这样做有几个好处:
- 1.子进程进行AOF重写,不影响主程序处理其他的命令请求。
- 2.子进程带有主进程的数据副本,使用子进程而不是线程,可以避免锁的情况,保证了数据安全性。
但是有个问题,子进程在进行AOF重写期间,主进程还有可能继续执行命令,导致当前数据库的数据和重写后的AOF文件中的数据不一致。这里需要引入一个AOF重写缓存,关于这一块的知识点,大家可以参考这篇大牛的博客,写的很详细:https://blog.csdn.net/hezhiqiang1314/article/details/69396887.
另外,根据讲解,我画了一张示意图描述整个AOF的执行过程,包含重写:
如何触发AOF的重写机制呢?
- 配置触发,在redis.conf中配置。# 表示当前aof文件大小超过上一次aof文件大小的百分之多少的时候会进行重写。如果之前没有重写过,以 启动时aof文件大小为准 auto-aof-rewrite-percentage 100 # 限制允许重写最小aof文件大小,也就是文件大小小于64mb的时候,不需要进行优化 auto-aof-rewrite-min-size 64mb
- 执行bgrewriteaof命令。
如何实现混合持久化
混合持久化,顾名思义就是同时使用AOF和RDB。如果把混合持久化打开,AOF重写的时候就直接把 RDB 的内容写到 AOF文件开头。
开启混合持久化的命令:aof-use-rdb-preamble yes
AOF的文件载入以及实现数据的还原
之前也说了,AOF文件里面保存着重建数据库状态所需要的所有写命令,所以服务器重新启动时只需要重新的载入读取AOF文件,执行一遍新建命令即可。
详细步骤如下:
- 1、创建一个不带网络连接的伪客户端(fake client):因为Redis的命令只能在客户端上下文中执行,而载入AOF文件时所使用的命令直接来源于AOF文件而不是网络连接,所以服务器使用了一个没有网络连接的伪客户端来执行AOF文件保存的写命令,伪客户端执行命令的效果和带网络连接的客户端执行命令的效果完全一样
- 2、从AOF文件中分析并读取出一条写命令
- 3、使用伪客户端执行被读出的写命令
- 4、一直执行步骤2和步骤3,直到AOF文件中的所有写命令都被处理完毕为止 当完成以上步骤之后,AOF文件所保存的数据库状态就会被完整地还原出来
RDB与AOF对比
- RDB存储的某个时刻的数据快照,采用的二进制压缩存储,占用空间相对较少;AOF存储操作命令,采用文本的存储,占用空间相对较多。
- RDB由于是隔一段时间保存一次,因此性能较高;AOF因为需要保存执行过程,性能较低。
- RDB在保存时可能后丢失最后一次快照以后更改的所有数据;AOF设置为每秒保存一次,最多也就丢失2秒的数据。
- Redis以主服务器模式运行,RDB不会保存过期键值对数据,Redis以从服务器模式运行,RDB会保存过期键值对,当主服务器向从服务器同步时,再清空过期键值对;AOF写入文件时,对过期的key会追加一条del命令,当执行AOF重写时,会忽略过期key和del命令。
相关推荐
- 删库之后不要着急跑路,教你神不知鬼不觉找回数据
-
在工作中,我们误删数据或者数据库,我们一定需要跑路吗?我看未必,程序员一定要学会自救,神不知鬼不觉的将数据找回。在mysql数据库中,我们知道binlog日志记录了我们对数据库的所有操作,所以...
- 数据库告警不可用,增删改受阻(数据库限制删除)
-
前言:昨晚,突然出现服务不可用告警,查看日志上线报文入库到数据库很慢并受阻,出现数据不同步问题。排查问题查看发现服务都是在执行update、insert这些DML命令的时候,报的数据库执行超时。经过一...
- Binlog实现MySQL复制,5个关键步骤,务必掌握!
-
复制是MySQL最重要的功能之一,MySQL集群的高可用、负载均衡和读写分离都是基于复制来实现的。Binlog就是实现主从复制的关键,主数据库将修改操作记录到Binlog中,从数据库通过解...
- MySQL数据实时增量同步到Elasticsearch
-
Mysql到Elasticsearch的数据同步,一般用ETL来实现,但性能并不理想,目前大部分的ETL是定时查询Mysql数据库有没有新增数据或者修改数据,如果数据量小影响不大,但如果几百万上千万的...
- MySQL 数据库恢复:如何执行时间点恢复(PITR)以挽救受损数据?
-
天津鸿萌科贸发展有限公司从事数据安全服务二十余年,致力于为各领域客户提供专业的数据恢复、数据备份、数据取证、数据迁移、网络安全、数据清除等解决方案,并针对企业面临的数据安全风险,提供专业的相关数据安全...
- 阿里面试:MySQL Binlog有哪些格式?底层原理?优缺点?
-
binlog的格式也有三种:STATEMENT、ROW、MIXED,下面我详解binlog三种模式@mikechenStatement模式Statement模式:是基于SQL语句的复制(statem...
- 快速带你读懂MySQL的binlog写入机制
-
深入讲解MySQL中的重要日志binlog的写入机制以及影响IO性能的关键配置,并且介绍了如何利用binlog去恢复数据,保证MySQL的可靠性。Q:binlog写入时机binlog的写入逻辑并...
- MySQL 误删除数据恢复全攻略:基于 Binlog 的实战指南
-
在MySQL的世界里,二进制日志(Binlog)就是我们的"时光机"。它默默记录着数据库的每一个重要变更,就像一位忠实的史官,为我们在数据灾难中提供最后的救命稻草。本文将带您深入掌握如...
- 一文了解MySQL Binlog(一文了解肝脏有益和有害的食物)
-
MySQL的Binlog日志是一种二进制格式的日志,Binlog记录所有的DDL和DML语句(除了数据查询语句SELECT、SHOW等),以Event的形式记录,同时记录语句执行时...
- 数据丢失?别慌!MySQL备份恢复攻略
-
想象一下,某个晴朗的午后,你正享受着咖啡,突然接到紧急电话:你的网站或APP彻底挂了!系统崩溃,界面全白。虽然心头一紧,但你或许还能安慰自己:系统崩溃只是暂停服务,数据还在,修复修复就好了。然而,如果...
- Mysql中的bin log、redo log、undo log的区别
-
最近在整理面试题,在看mvcc的时候看到了undolog,今天索性把这三个log都记录一遍。MySQL的逻辑架构说之前先说一下MySQL的基本架构,MySQL主要分为两层:Server层和存储引...
- binlog日志定时清理(binlog清理规则)
-
binlog日志binlog是MySQL数据库的一种日志文件,用于记录所有对数据的修改操作。binlog全称为binarylog,它以二进制格式记录MySQL服务器上所有的修改操作,包括对哪个数据库...
- 茶水间炸锅了!菜鸟误删用户表,运维老张的MySQL救命三招!
-
(公司茶水间,运维老张、开发小王和新人小李围着咖啡机)小李:(紧张兮兮)张哥!我...我好像把测试库的用户表删了!下午演示咋办啊?老张:(淡定喝咖啡)慌啥?昨晚的备份是吃干饭的?走,教你恢复!一、基础...
- 解决运维痛点,提高运维安全性-雷池 SafeLine WAF新功能身份认证
-
雷池介绍使用雷池SafeLineWAF已经两年多了,在1.5.x版本时就已经开始测试使用,并在推出LTS版本后转入LTS分支。近期雷池SafeLineWAF重点更新了身份认证功能,并提供了SS...
- 【Docker 新手入门指南】第十五章:常见故障排除
-
一、前期准备:收集关键信息在排查问题前,建议先获取以下系统数据,便于精准定位故障:1.系统基础信息#查看Docker版本(确认是否为最新稳定版)dockerversion#查看...
你 发表评论:
欢迎- 一周热门
-
-
极空间如何无损移机,新Z4 Pro又有哪些升级?极空间Z4 Pro深度体验
-
UOS服务器操作系统防火墙设置(uos20关闭防火墙)
-
如何修复用户配置文件服务在 WINDOWS 上登录失败的问题
-
手机如何设置与显示准确时间的详细指南
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
日本海上自卫队的军衔制度(日本海上自卫队的军衔制度是什么)
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
10个免费文件中转服务站,分享文件简单方便,你知道几个?
-
NAS:DS video/DS file/DS photo等群晖移动端APP远程访问的教程
-
FANUC 0i-TF数据备份方法(fanuc系统备份教程)
-
- 最近发表
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)