| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 你真的了解Redis中的持久化嘛? -> 正文阅读 |
|
[大数据]你真的了解Redis中的持久化嘛? |
Redis 中的持久化方式1. 前言为什么要进行持久化?:持久化功能有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。 持久化都有那些方式?:Redis支持RDB和AOF两种持久化机制。 2. RDBRDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为?手动触发?和?自动触发?。 2.1 手动触发手动触发分别对应?
显然bgsave命令是针对save阻塞问题做的优化。因此Redis内部所有的涉及RDB的操作都采用bgsave的方式,而save命令已经废弃。 2.2 自动触发
3. bgsave大致流程流程说明:
关于RDB文件: # Short read or OOM loading DB. Unrecoverable error, aborting now. 4. RDB持久化方式的优缺点优点:
缺点:
5. AOFAOF(append only file)持久化:以独立?日志?的方式记录每次写命令,重启时再重新执行AOF文件中的命令达到恢复数据的目的。主要作用是解决了数据持久化的实时性。 6. AOF的使用方式
7. AOF流程剖析流程描述:
7.1 命令写入AOF命令写入的内容直接是文本协议格式。例如set hello world这条命令,在AOF缓冲区会追加如下文本: *3\r\n$3\r\nset\r\n$5\r\nhello\r\n$5\r\nworld\r\n 复制代码 为什么使用文本协议格式?
为什么要追加到aof_buf中而不是直接写入硬盘?
7.2 文件同步Redis提供了多种AOF缓冲区同步文件策略,由参数appendfsync控制。 系统调用write和fsync的几点说明:
策略的几点说明:
7.3 重写机制为什么要重写?:
怎么重写?:
重写后那些优化让文件变小了?:
重写有那些触发方式?:
自动触发时机: aof_current_size > auto-aof-rewrite-minsize && (aof_current_size-aof_base_size)/aof_base_size >= auto-aof-rewrite-percentage 复制代码 aof_current_size 和 aof_base_size 可以在info Persistence统计信息中查看。 重写流程概述: 流程描述:
7.4 重启加载流程描述: DB loaded from append only file: xxx seconds DB loaded from disk: xxx seconds 关于文件校验: 加载损坏的AOF文件时会拒绝启动,并会输出: Bad file format reading the append only file: make a backup of your AOF file,then use ./redis-check-aof --fix <filename> 复制代码 对于错误格式的AOF文件:先进行备份,然后采用redis-check-aof --fix命令进行修复,修复后使用diff-u对比数据的差异,找出丢失的数据,有些可以人工修改补全。 对于AOF文件结尾不完整:比如机器突然掉电导致AOF尾部文件命令写入不全。Redis为我们提供了aof-load-truncated配置来兼容这种情况,默认开启。加载AOF时,当遇到此问题时会忽略并继续启动,同时打印如下警告日志: # !!! Warning: short read while loading the AOF file !!! # !!! Truncating the AOF at offset 397856725 !!! # AOF loaded anyway because aof-load-truncated is enabled 复制代码 8. 问题定位与优化8.1 关于fork操作当Redis做RDB或AOF重写时,一个必不可少的操作就是执行fork操作创建子进程,对于大多数操作系统来说fork是个重量级操作虽然fork创建的子进程不需要拷贝父进程的物理内存空间,但是会复制父进程的空间内存页表,因此fork操作耗时跟进程总内存量息息相关。可以在info stats统计中查latest_fork_usec指标获取最近一次fork操作耗时,单位微秒。 减少fork耗时的措施:
8.2 关于子进程开销CPU:
内存:
硬盘:
8.3 关于AOF追加阻塞描述:当开启AOF持久化时,常用的同步硬盘的策略是everysec,用于平衡性能和数据安全性。对于这种方式,Redis使用?另一条线程每秒执行fsync同步硬盘?。当系统硬盘资源繁忙时,会造成Redis主线程阻塞。 问题定位: Asynchronous AOF fsync is taking too long (disk is busy). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redi 流程概述:
也就是说
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 10:55:19- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |