redis AOF

5 篇文章 0 订阅

AOF

是什么

日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

AOF保存的是appendonly.aof文件

FLASHALL也会被记录进去

appendonly.aof 和dump.rdf同时存在时,如果AOF是启动的,redis-server /myredis/redis.conf 会选择加载appendonly.aof文件,如果appendonly.aof有错,那么在redis-cli -p 6379时会无法连接

可以用redis-check-aof --fix appendonly.aof进行修复

AOF启动/修复/恢复

默认是关闭的

正常恢复

启动:设置yes,修改默认的appendonly no,改为yes

将有数据的aof文件复制一份保存到对应目录(config get dir)

恢复:重启redis然后重新加载

异常恢复

启动:设置yes,修改默认的appendonly no,改为yes

备份被写坏的AOF文件

修复: redis-check-aof --fix进行修复(rdb 也有 redis-check-rdb --fix)

恢复:重启redis然后重新加载

rewrite

AOF采用文件追加方式,文件会越来越大

为避免出现此种情况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集.可以使用命令bgrewriteaof

其实就是aof的瘦身

重写原理

AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条的Set语句。

重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。

触发机制

Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发

优势

灵活的配置

每修改同步:appendfsync always 同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好

每秒同步:appendfsync everysec 异步操作,每秒记录 如果一秒内宕机,有数据丢失

不同步:appendfsync no 从不同步

易读

AOF文件有序地保存了对数据库执行的所有写操作,因此AOF文件易被人读懂,对文件更容易进行分析

劣势

记录的东西越来越多,相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb

aof运行效率要慢于rdb, 每秒同步策略效率较好,不同步效率和rdb相同

文件大恢复速度又慢

APPEND ONLY MODE追加

appendonly

appendfilename

appendfsync

always :同步持久化 每次发生数据变更会被立即记录到磁盘 ,性能较差但数据完整性比较好

everysec:出厂默认推荐,异步操作,每秒记录 如果一秒内宕机,有数据丢失

no

no-appendfsync-on-rewrite

重写时是否可以运用Appendfsync,用默认no即可,保证数据安全性。

与rdb 对比

  1. RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储。

    AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些
    命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.
    Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大

  2. 只做缓存:如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式.

  3. 同时开启两种持久化方式:在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整.

    RDB的数据不实时,同时使用两者时服务器重启也只会找AOF文件。那要不要只使用AOF呢?建议不要,因为RDB更适合用于备份数据库(AOF在不断变化不好备份),快速重启,而且不会有AOF可能潜在的bug,留着作为一个万一的手段。

  4. 性能建议

    因为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文件,载入较新的那个。新浪微博就选用了这种架构

Redis AOF是一种持久化机制,用于将Redis服务器的操作日志以追加的方式记录在磁盘上。引用中提到,当AOF文件的体积变得过大时,Redis可以自动进行AOF重写。AOF重写实际上是对当前数据集所需的最小命令集合进行重写,而不是对原有的AOF文件进行写入和取操作。这个重写过程是在后台进行的,通过fork子进程来执行。重写后的新AOF文件能够恢复当前数据集的状态。 引用中提到,RedisAOF重写程序放在后台子进程中执行的原因是为了避免影响服务器的请求处理能力。通过将AOF重写程序放在后台执行,可以确保服务器能够继续处理请求,而不AOF重写过程阻塞。 在Redis服务器中,redisServer结构维护着服务器的状态,而aof_buf域则用来保存等待写入AOF文件的协议文本(RESP)。这些协议文本包含了对键的操作命令,用于记录服务器的操作日志。当需要将操作日志写入AOF文件时,这些协议文本被写入到AOF缓冲区中,然后由后台的AOF子进程负责将缓冲区中的内容写入到AOF文件中。这种方式可以提高性能,并且减少了直接写入文件的开销。引用中提到了这一点。 综上所述,RedisAOF机制是通过记录操作日志来实现数据持久化的。当AOF文件体积过大时,Redis自动进行AOF重写,将当前数据集所需的最小命令集合写入一个新的AOF文件中。为了避免影响服务器的请求处理能力,AOF重写过程在后台执行。通过维护一个AOF缓冲区,Redis可以将待写入的协议文本暂时保存在内存中,然后由后台子进程负责将其写入AOF文件中。这种机制可以提高性能并减少直接写入文件的开销。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值