redis详解(4)持久化

database

定义

redis 所有数据保存在内存中,对数据更新将异步保存到磁盘

持久化的作用

方式

说明

快照

mysql dump,redis RDB

日志

mysql binlog,redis AOF,hbase Hlog

RDB

定义

  • redis 创建二进制的 RDB 文件
  • redis 启动载入已经存在的 RDB 文件

三种主要方式触发

save(同步)

  • client 发送 save 命令到 server,server 创建 RDB 文件,会阻塞主进程
  • 如果存在老文件,新文件会替换老文件
  • 时间复杂度 O(n)

bgsave(异步)

  • client 发送 bgsave 命令到 server,server fork 一个子进程创建 RDB 文件
  • server 返回给 client 成功信息

命令

save

bgsave

IO 类型

同步

异步

是否阻塞

是,阻塞发送在 fork

时间复杂度

O(n)

O(n)

优点

不会消耗额外内存

不阻塞客户端命令

缺点

阻塞客户端命令

需要 fork,消耗内存

自动配置

配置

seconds

changes

save

900

1

save

300

10

save

60

10000

其他方式触发

  • 全量复制
  • debug reload
  • shutdown

总结

  • RDB 是 redis 内存到硬盘的快照,用于持久化
  • save 通常会阻塞 redis
  • bgsave 不会阻塞 redis,但是会 fork 新进程
  • save 自动配置满足任一就会被执行

AOF

RDB 现存问题

  • 耗时耗性能
  • 不可控,丢失数据

定义

  • 日志文件

三种策略

always

  • redis 写命令刷新到缓冲区,每条命令 fsync 到硬盘

everysec

  • redis 写命令刷新到缓冲区,每秒把缓冲区 fsync 到硬盘

no

  • redis 写命令刷新到缓冲区,操作系统决定什么时间 fsync 到硬盘

命令

always

everysec

no

优点

不丢失数据

每秒一次 fsync

不用管理

缺点

IO 开销大

丢一秒数据

不可控

重写

优势

  • 减少磁盘占用量
  • 加快恢复速度

实现方式

  • bgrewriteaof 命令

    client 发送 bgrewriteaof 命令到 server,server fork 一个子进程执行 AOF 重写,创建 AOF 文件

  • aof 重写配置

配置名

说明

auto-aof-rewrite-min-size

aof 文件重写需要的大小

auto-aof-rewrite-percentage

aof 文件增长率

统计名

说明

aof_current_size

aof 当前大小(单位:字节)

aof_base_size

aof 上次启动和重写的大小(单位:字节)

自动触发时机

  • aof_current_size > auto-aof-rewrite-min-size
  • aof_current_size - aof_base_size/aof_base_size > auto-aof-rewrite-percentage

RDB 和 AOF 的选择

RDB 和 AOF 比较

命令

RDB

AOF

启动优先级

体积

恢复速度

数据安全性

丢数据

根据策略决定

轻重

RDB 最佳策略

  • 关掉
  • 集中管理
  • 主从,从开

AOF 最佳策略

  • 开(缓存情况下关掉)
  • aof 重写集中管理
  • everysec

最佳策略

  • 小分片
  • 监控(硬盘,内存,负载,网络)
  • 足够内存
  • 缓存或存储

fork 操作

fork 操作

  • 同步操作
  • 和内存量相关,内存越大,耗时越长,与机器类型有关
  • info:latest_fork_usec

优化 fork

  • 优先使用物理机或者高效支持 fork 操作的虚拟化技术
  • 控制 redis 实例最大可用内存:maxmemory
  • 合理配置 Linux 内存分配策略:vm.overcommit_memory=1
  • 降低fork频率,例如放开aof重写机制自动触发时机,不必要的全量复制

进程外开销

子进程开销和优化

选项

开销

优化

CPU

rdb和aof文件生成,属于CPU密集型

不做CPU绑定,不和CPU密集型部署

内存

fork内存开销,copy-on-write

echo never > /sys/kernel/mm/transparent_hugepage/enabled

硬盘

aof和rdb文件写入,可以结合iostat,iotop分析

不要和高硬盘负载服务部署一起:存储服务,消息队列等;no-appendfsync-on-rewrite=yes,根据写入量决定磁盘类型;单机多实例持久化文件目录可以分盘

AOF 追加阻塞

阻塞定位

  • redis日志
  • info persistence命令

欢迎扫描下方二维码,持续关注:

互联网工程师(id:phpstcn),我们一起学习,一起进步

以上是 redis详解(4)持久化 的全部内容, 来源链接: utcz.com/z/531819.html

回到顶部