【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
定义
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),我们一起学习,一起进步
来源:oschina
链接:https://my.oschina.net/xushuhui/blog/3143431