Redis 数据可持久化
RDB
RDB(Redis DataBase)是 Redis 中默认的持久化机制,将内存中的数据以快照的方式异步保存到磁盘指定目录的.rdb
文件中,可以通过配置文件中save
参数来定义快照的周期
流程
save
指令执行完成前不执行其他操作,仅用于迁移、维护等数据备份,生产环境谨慎使用
bgsave
指令执行时,Redis 会调用 glibc 的函数 fork 出一个子进程,先将数据写到磁盘上的一个临时 .rdb 文件中,写入完成后再将原来的 .rdb 文件替换掉
而 COW 机制
(copy-on-write)就是保证上述步骤的前提:当主进程执行读操作的时候是访问共享内存的,而主进程执行写操作的时候,则会拷贝一份数据,执行写操作;以此减少分配和复制时带来的瞬时延迟以及不必要的资源分配
优点
- 只有一个文件 dump.rdb ,按时间点保存数据集,便于备份和恢复
- 持久化时主进程可以继续处理其他命令,不进行任何 I/O 操作,保证 Redis 的高性能
- RDB 是一个紧凑压缩的二进制文件,重载效率比 AOF 持久化更高,在数据量大时更明显
缺点
- 可能出现数据丢失,在两次 RDB 持久化的时间间隔中,如果出现宕机,则会丢失这段时间中的数据
- 由于 RDB 是通过 fork 子进程来协助完成数据持久化,当数据集较大时,可能会导致间歇性暂停服务
AOF
AOF ,及追加文件(Append Only File),当 Redis 处理每一个写命令都会记录在 AOF 文件中,可以看做是命令日志文件流程
需要设置 AOF 的同步选项,因为对文件进行写入并不会马上将内容同步到磁盘上,而是先存储到缓冲区中,同步选项有三种配置项选择:1
2
3
4#是否开启,默认 no,开启换为 yes
appendonly yes
#同步选项
appendfsync everysec - always:同步记录,可靠性高,I/O 开销大,影响性能较大
- everysec:每秒同步一次,性能适中,最多丢失 1 秒的数据
- no:默认配置,即不使用 AOF 持久化,性能最好,可靠性最差
随着 Redis 的运行,AOF 的日志会越来越长,如果实例宕机重启,重载整个 AOF 将会变得十分耗时;为了解决这个问题,Redis 提供 bgrewriteaof
指令,可以将 AOF 文件进行压缩,也可以选择自动触发,在配置文件中配置1
2
3no-appendfsync-on-rewrite yes
auto-aof-rewrite-precentage 100
auto-aof-rewrite-min-zise 64mb
优点
实现持久化,数据安全,AOF持久化可以配置 appendfsync 属性为 always,每进行一次命令操作就记录到AOF文件中一次,数据最多丢失一次
通过 append 模式写文件,即使中途服务器宕机,可以通过 Redis-check-aof 工具解决数据一致性问题
AOF 机制的 rewrite 模式。AOF 文件的文件大小触碰到临界点时,rewrite 模式会被运行,重写内存中的所有数据,从而缩小文件体积
缺点
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 君玉自牧!