设为首页 加入收藏

TOP

Redis持久化存储详解(一)(二)
2019-09-17 18:31:16 】 浏览:67
Tags:Redis 持久化 存储 详解
时也可以修改日志文件内容.
3.开启aof后,所有的文件文件都包含追加操作,直接采用文本协议,减少二次开销(这一点,个人不是很理解.因为我们的aof是保存的是命令,当我们再次去加载的时候,会去执行一次里面的命令,当文件大的时候应该是比较耗时的吧。如果没有做好文件重写策略,大量重复无效的命令执行,对于二进制加密的rdb格式,不需要再去转换,这一点确实可以减少二次开销).

文件写入
文件写入是将aof_buf缓冲区的命令写入到文件中.文件写入的策略有如下三种方式

|配置项 | 配置说明 |
|:---: | :---: |
|always | 命令写入到aof_buf缓冲区中之后立即调用系统的<font color='red'>fsync操作</font>同步到aof文件中,fsync完成后线程返回. |
|everysec | 命令写入到aof_buf缓冲区后<font color='red'>每隔一秒</font>调用系统的<font color='red'>write操作</font>,write完成后线程返回. |
|no | 命令写入aof_bug缓冲区后调用系统write操作,不对aof文件做fsync同步,同步硬盘操作由<font color='red'>系统操作</font>完成,时间一般最长为30s. |
系统调用write和fsync说明:
·write操作会触发延迟写( delayed write) 机制。 Linux在内核提供页缓冲区用来提高硬盘IO性能。 write操作在写入系统缓冲区后直接返回。 同步硬盘操作依赖于系统调度机制, 例如: 缓冲区页空间写满或达到特定时间周期。 同步文件之前, 如果此时系统故障宕机, 缓冲区内数据将丢失.
·fsync针对单个文件操作( 比如AOF文件) , 做强制硬盘同步, fsync将阻塞直到写入硬盘完成后返回, 保证了数据持久化.
文件写入策略分析
配置为always时, 每次写入都要同步AOF文件, 在一般的SATA硬盘上, Redis只能支持大约几百TPS写入, 显然跟Redis高性能特性背道而驰,
不建议配置.
配置为no。由于操作系统每次同步AOF文件的周期不可控, 而且会加大每次同步硬盘的数据量, 虽然提升了性能, 但数据安全性无法保证.
配置为everysec。是建议的同步策略, 也是默认配置, 做到兼顾性能和数据安全性。 理论上只有在系统突然宕机的情况下丢失1秒的数据.

文件重载
1.为什么要文件做文件重载操作?
由于aof采用的是日志追加,我们redis命令不断的写入,aof文件的体积也也会不断的增加.因此redis引入了aof重写机制达到减小aof文件体积.<font color="blue">aof文件重写是把redis进程内的数据转换为写命令同步到新的aof文件的过程(这一点其实不是特别明白,文件重写不是针对aof文件文件做操作的吗?为什么这里是将redis进程内的数据转换为命令写入文件,这里的进程内的数据不是太明白,还有待深入研究.个人理解的就是将旧的aof文件内容根据重写策略,进行优化生成新的aof文件。).</font>
2.文件重载有什么好处?
文件重载主要优化的地方有如下三点。使用文件重载既可以减少文件的体积,同时去掉了一些无效的操作,可以加快文件重载效率.
a.将一些在进程内无效的数据不在写入新的文件.如过期的键.
b.去掉一些无效的命令.如del key1.
c.简化操作.如lpush list a,lpush list b.直接可以简化为lpush list a b.
3.文件重载由那些方式?
文件重载有自动触发机制和手动触发机制.
手动触发机制:直接使用bgrewriteaof命令即可.该命令在fork子进程的时候会发生阻塞.
自动触发机制:
auto-aof-rewrite-min-size:aof重写时文件最小的体积,默认的是64M.
auto-aof-rewrite-percentage:代表当前AOF文件空间( aof_current_size) 和上一次重写后AOF文件空间( aof_base_size) 的比值.
```php
自动触发时机=aof_current_size>auto-aof-rewrite-minsize&&( aof_current_size-aof_base_size) /aof_base_size>=auto-aof-rewritepercentage
```
其中aof_current_size和aof_base_size可以在info Persistence统计信息中查看.
4.文件重载实现的原理是怎样的?
![图片描述](//img.mukewang.com/5c8518f400019ab607170711.png)
1.执行重写命令,判断是否存在子进程。
如果已经有子进程在进行aof重写,则会提示如下信息.
```shell
ERR Background append only file rewriting already in progress
```
如果已经存在子进程在进行bgsave操作,重写命令会延迟到bgsave命令完成之后进行,会返回如下信息.
```shell
Background append only file rewriting scheduled
```
2.父进程会fork一个子进程,在fork子进程的过程中会造成阻塞.
3.fork子进程结束阻塞解除,进行其他新的命令操作.新的命令依旧根据文件写入策略同步数据,保证aof机制正确进行(图中3.1).
4.子进程在进行写的过程中,由于fork操作运用的是写时复制技术,子进程只能共享fork操作时内存保留的数据,新的数据是无法操作的.父进程在这过程中仍然在响应其他的命令,于是Redis会使用aof重写缓存区来保存这部分新的数据(图中3.2).
5.子进程进行根据重写规则将数据写入到新的aof文件中,并且每次写入有大小限制,通过aof-rewrite-incremental-fsync配置项来控制,默认是32M,这样可以见减少单次刷盘(I/O写)造成硬盘阻塞.
6.子进程在完成重写之后,会向父进程发送信息,父进程更新统计信息.可参看info persistence下的aof_*相关统计。
7.父进程会把新写入存在aof重写缓冲区的数据写入到aof文件中(图5.2).
8.将新的aof文件替换掉旧的aof文件.
<font color='blue'>在第3和4中,其实不是特别理解.不理解的是为什么父进程在响应新的命令会写入旧的aof文件,还要aof重写缓存区.个人理解的是,父进程在进行新命令写入处理的策略是,按照正常的备份策略写入旧的aof的同时也把新的命令写入重写缓冲区,在第5.2中将这部分新的数据写入到新的aof文件中,这样保证数据的完整性.</font>

文件重载
文件重载就是将文件重新加入到redis服务中.比如redis服务重启用于数据恢复.redis的重载机制非常完善,具体流程如下.![图片描述](//img.mukewang.com/5c85191d0001b48e07060788.png)

AO

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Mysql8 安装过程及安装过程系列问.. 下一篇navicat mysql 存储过程

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目