Redis_06_Redis的AOF和RDB

本文介绍了Redis的两种持久化方式:RDB和AOF。RDB通过快照将内存中的数据定期保存到磁盘,适用于大规模数据恢复。AOF则记录每次写操作到日志文件,确保数据完整性的同时对性能有一定影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Redis的持久化

Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库状态也会消失。所以 Redis提供了持久化功能!

RDB Redis Data Base(Redis的默认持久化方式)

Redis会将数据集的快照dump到dump.rdb文件中。此外,我们也可以通过配置文件来修改Redis服务器dump快照的频率。

1.默认的保存文件是:dump.rdb文件

测试一下:

60秒 至少有5次对key的操作 会持久化文件 生成dump.rdb文件

save 60 5

重启redis

执行5次操作

127.0.0.1:6379> set a 1 
OK
127.0.0.1:6379> set b 2
OK
127.0.0.1:6379> set c 3
OK
127.0.0.1:6379> set d 4
OK
127.0.0.1:6379> set e 5
OK

出现了dump.rdb

2.触发机制:

1.save命令规则满足的情况下,会触发rdb规则生成,rdb文件。

2.执行flushall命令,也会触发rdb规则生成,rdb文件。

3.推出redis,也会触发rdb规则生成,rdb文件。

3.如何恢复rdb文件

127.0.0.1:6379> config get dir
1) "dir"
2) "/usr/local/redis/bin"
4.只需要将dump.rdb文件放在config get dir 目录下就可以恢复其中的数据

在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不迸行仼何IO操作的。这就确保了极髙的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失

优点: 父进程和子进程运行互不影响,适用于大规模的数据恢复

缺点: 需要一点过的时间间隔进行操作!如果redis意外宕机了,最后此一次持久化之后的数据会消失

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

1.默认是不开启的,需要手动开启,重启redis-serve,出现appendonly.aof
appendonly yes

在这里插入图片描述

127.0.0.1:6379> set a 1
OK
127.0.0.1:6379> set b 2
OK

可以查看生成的appendonly.aof文件
在这里插入图片描述

2.当我们的appendonly.aof被误修改时Redis是无法启动的
[root@izuf674yoe2iaw2dvtipawz bin]# ./redis-cli -p 6379
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected> 

需要使用redis-check-aof检查修复

[root@izuf674yoe2iaw2dvtipawz bin]# ./redis-check-aof --fix appendonly.aof 
0x              4a: Expected \r\n, got: 6969
AOF analyzed: size=105, ok_up_to=50, diff=55
This will shrink the AOF from 105 bytes, with 55 bytes, to 50 bytes
Continue? [y/N]: t^Hy
Aborting...

即可再次启动redis

#每次修改的值都会同步 速度会比较慢
#appendfsync always
#每秒执行一次同步 可能会丢失这一秒的数据
appendfsync everysec
#不执行同步 这个时候操作系统自己会同步数据,速度最快
#appendfsync no

优点:

1.appendfsync always 每一次修改都会同步,保证数据不会丢失

2.appendfsync everysec 每一次修改都会同步一次,可能会丢失1秒的数据

3.appendfsync no 从不同步

缺点:

1.appendonly.aof文件远远大于dump.rdb文件

2.appendonly.aof会记录每一次操作,恢复效率会远远低于dump.rdb文件

性能建议:
因为RDB文件只用作后备用途,建议只在Save上持久化RDB文件,而且只要15分钟备份一次就够了,只保留save9001这条规则。

如果 Enable AOF,好处是在最恶劣情況下也只会丢失不超过两秒数据,启动脚本较简单只Ioad自己的AOF文件就可以了,代价一是带来了持续的IO,二是 AOF rewrite的最后将 rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。只要硬盘许可,应该尽量減少 AOF rewrite的频率,AOF重写的基础大小默认值64M太小了,可以设到5G以上,默认超过原大小100%大小重写可以改到适当的数值。

如果不 Enable AOF,仅靠 Master- Slave Repllcation实现高可用性也可以,能省掉一大笔O,也减少了 rewrite时带来的系统波动。代价是如果 Master/ Slave同时倒掉,会丢失十几分钟的数据,启动脚本也要比较两个 Master/ Slave中的RDB文件,载入较新的那个,微博就是这种架构。

请根据下述 Prometheus 采集得到的 redis 监控指标,给出 redis 集群建议的监控告警指标,并附上对应的告警表达式 redis_active_defrag_running、redis_allocator_active_bytesredis_allocator_allocated_bytes redis_allocator_frag_bytes redis_allocator_frag_ratio redis_allocator_resident_bytes redis_allocator_rss_bytes redis_allocator_rss_ratio redis_aof_base_size_bytes redis_aof_buffer_length redis_aof_current_rewrite_duration_sec redis_aof_current_size_bytes redis_aof_delayed_fsync redis_aof_enabled redis_aof_last_bgrewrite_status redis_aof_last_cow_size_bytes redis_aof_last_rewrite_duration_sec redis_aof_last_write_status redis_aof_pending_bio_fsync redis_aof_pending_rewrite redis_aof_rewrite_buffer_length redis_aof_rewrite_in_progress redis_aof_rewrite_scheduled redis_blocked_clients redis_client_recent_max_input_buffer_bytes redis_client_recent_max_output_buffer_bytes redis_cluster_connections redis_cluster_current_epoch redis_cluster_enabled redis_cluster_known_nodes redis_cluster_messages_received_total redis_cluster_messages_sent_total redis_cluster_my_epoch redis_cluster_size redis_cluster_slots_assigned redis_cluster_slots_fail redis_cluster_slots_ok redis_cluster_slots_pfail redis_cluster_state redis_cluster_stats_messages_auth_ack_sent redis_cluster_stats_messages_auth_req_received redis_cluster_stats_messages_fail_received redis_cluster_stats_messages_fail_sent redis_cluster_stats_messages_ping_received redis_cluster_stats_messages_ping_sent redis_cluster_stats_messages_pong_received redis_cluster_stats_messages_pong_sent redis_cluster_stats_messages_update_received redis_cluster_stats_messages_update_sent redis_commands_duration_seconds_total redis_commands_processed_total redis_commands_total redis_config_io_threads redis_config_maxclients redis_config_maxmemory redis_connected_clients redis_connected_slave_lag_seconds redis_connected_slave_offset_bytes redis_connected_slaves redis_connections_received_total redis_cpu_sys_children_seconds_total redis_cpu_sys_seconds_total redis_cpu_user_children_seconds_
03-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值