redis 详解(4)持久化「建议收藏」

redis 详解(4)持久化「建议收藏」定义 redis 所有数据保存在内存中,对数据更新将异步保存到磁盘 持久化的作用 方式 说明 快照 mysql dump,redis RDB 日志 mysql binlog,redis AOF,hb…

定义

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命令

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

redis 详解(4)持久化「建议收藏」

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/10463.html

(0)
上一篇 2022-12-27
下一篇 2022-12-27

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注