首页 > 技术文章 > Redis 持久化方式

nirao 2018-10-11 16:46 原文

Redis持久化

持久化:redis所有的数据都保持在内存中,对数据的更新将异步的保存到磁盘上
持久方式: 快照,写日志等方式。

  • msyql dump,redis rdb采用快照的方式
  • mysql binlog, hbase hlog,redis aof 采用日志方式

RDB方式

将内存中的数据复制创建快照的方式存入到硬盘中
三种方式:

  • save(同步),如果存在老的rdb文件,会替换掉老的文件
  • bgsave(异步),该命令fork一个redis进程,去完成备份的操作,如果存在老的备份文件,会被新的替换掉。
  • 自动方式,触发条件
    • 60秒内,改变1000条数据
    • 300秒,改变10条数据
    • 900秒内,改变1条数据
    • 其它触发方式,全量复制,debug reload,shutdown 也会生成 rdb文件,需要注意


#直接 save 命令,因是同步的,可能造成阻塞
save
# 直接bgsave命令,fork时可能会阻塞redis,
bgsave
# 以上两种方式,在数据量不大的时候差别不大

# 自动的方式需要配置在配置文件中
# 配置示例
save 900 1
save 300 10
save 60  10000
# 默认快照文件名称,一般按照端口区分
dbfilename dump{port}.rdb
# 工作目录
dir ./
# 备份发生异常时是否 停止
stop-writes-on-bgsave-error yes
# 是否采用压缩格式
rdbcompression yes
# 是否对rdb进行校验
rdbchecksum yes

RDB存在的问题

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

AOF持久化数据

将数据的操作记录保存为日志文件,进行持久化的操作。

三种策略
always : redis将数据先写入到缓存区当中,在适当的时候写入到硬盘当中,always表示,每条命令总是写入到硬盘当中去,该策略不丢失数据。
everysec : 每秒策略,每一秒将缓冲区的数据写入到硬盘AOF文件中,这种操作每一秒丢失一秒的数据,不可控。
no :这个根据操作系统的配置来进行写入的操作,该策略IO开销较大,一般的sata盘只要几百tps,不可控。

AOF重写 : 减少磁盘占用量,加速恢复速度。
** bgrewriteaof **: 客服端发送给服务端该命令,fork 出redis 一个子进程 重写 AOF到 AOF文件中

重写配置

# AOF文件重写需要的尺寸
auto-aof-rewrite-min-size
# AOF文件增长率
auto-aof-rewrite-percentage
# AOF当前尺寸(单位:字节)
aof_current_size
# AOF 上次启动和重写的尺寸(单位:字节)
aof_base_size

# 自动触发时机
aof_current_size > auto-aof-rewrite-min-size
aof_current_size - aof_base_size/aof_base_size > auto-aof-rewrite-percentage

重写流程,图示

具体配置示例

# 使用aof功能的基础,需要打开,这个是支持动态配置的。
appendonly yes
# aof文件的名称
appendfilename "appendonly-${port}.aof"
# 同步的策略
appendonly everysec
# 在aof重写的时候,是否需要做aof apppend的操作,此处不做该操作
no-appendfsync-on-rewrite yes
# 增长率
auto-aof-rewrite-percentage 100
# 最小的一个尺寸
auto-aof-rewrite-min-size 64mb

RDB和AOF取舍

在同时有RDB和AOF的情况下,AOF的优先级较高

  • RDB,体积小,恢复速度快,会丢失数据,较重
  • AOF,体积大,恢复速度慢,数据安全根据策略决定,数据较轻。

RDB最佳策略,一般关闭,单机多部署,集中管理。
AOF最佳策略,一般开启,缓存和存储,aof重写集中管理,设置策略 everysec

最佳策略:小分片,缓存或者存储,监控(硬盘,内存,负载,网络),足够的内存

常见问题持久化

fork操作

  • 同步的操作
  • 与内存量息息相关,内存越大,耗时越长(与机器类型有关)
  • info:latest_fork_usec 查看fork的执行时间

改善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-rewirte = yes
    • 根据写入量决定磁盘类型:例如 ssd
    • 单机多实例持久化文件目录可以考虑分盘

AOF追加阻塞问题
图示:

AOF阻塞定位

  • redis日志查看
  • info persistence 命令

推荐阅读