IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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持久化

目录

一、RDB(Redis DataBase)

1.1 触发方式

1.1.1 手动触发

1.1.2 自动触发

1.2 流程说明

1.3 fork函数

1.4 Linux写时拷贝机制(COW,Copy On Write)

1.5 Redis快照原理

二、AOF(Append Only File)

2.1 重写机制

2.1.1 重写规则

2.1.2 重写流程

2.2?fsync

三、Redis4.0持久化

四、总结

五、常见问题

1、为什么Redis持久化要fork一个子进程?为什么不用一个当前进程内的线程?


Redis数据全部存储在内存中,关机则数据丢失,因此需要定期做数据的持久化备份,来保证不会因故障导致数据丢失。

Redis持久化方式有两种,RDB(快照)和AOF日志。

一、RDB(Redis DataBase)

优点:

  • 一次性生成内存快照,生成的文件压缩比例高,读取恢复速度快,适合大规模数据恢复,且对完整性要求不高的场景

缺点:

  • 无法实时持久化,一般用于数据冷备份和主从复制,服务器意外宕机,会丢失较多数据

1.1 触发方式

????????将当前完整数据生成快照存到硬盘,触发快照分为手动和自动。

1.1.1 手动触发

????????save命令:阻塞Redis当前进程,直到RDB完成。因为内存数据较大时,阻塞时间过长,因此该命令已废弃。

????????bgsave命令:save命令改进版。其不会完全阻塞当前进程,而是会fork一个子进程进行持久化,阻塞只发生在fork阶段,时间很短,所有Redis内部涉及RDB操作都会采用bgsave方式。

1.1.2 自动触发

????????使用某些相关配置或从节点首次连接自动全量复制等。

1.2 流程说明

  1. 执行bgsave命令,Redis主进程判断是否已经存在其他的子进程在RDB,如果有,直接返回
  2. ?如果没有,那么主进程fork子进程,fork时父进程会阻塞
  3. fork完成后,父进程不再阻塞,开始执行Redis正常读写操作
  4. 子进程开始生成RDB文件,根据父进程内存生成临时快照文件,完成后替换原文件
  5. 子进程持久化完成后通知父进程,父进程更新信息

1.3 fork函数

????????fork是Linux系统中的分叉函数,fork函数将运行着的进程分成两个几乎完全一样的进程,用于创建一个新的进程,称为子进程,原先的进程称为父进程,子进程是父进程的副本。

1.4 Linux写时拷贝机制(COW,Copy On Write)

????????在Linux中进行fork子进程时,会自动进行COW机制,在fork的一瞬间,父进程和子进程共享内存页,而在之后的操作中,如果父进程有写操作,父进程负责将内存页单独复制出来然后修改,子进程的内存页从头到尾都没有变化,而读的内存页一直共享,减少复制带来的开销。

1.5 Redis快照原理

????????Redis是单线程操作,线程在负责读写操作同时,还要进行数据备份,为了提速,不阻塞当前读写,又要同时备份,备份时数据如果被改了怎么办?Redis使用的操作系统多进程COW(Copy On Write)机制【写时复制机制】来实现快照持久化。

????????父进程fork一个子进程来完成快照持久化,父进程继续处理客户端读写请求。子进程在诞生瞬间和父进程共用内存中的代码段和数据段,随着父进程持续处理客户端请求,写操作持续进行,越来越多的共享页面被分离出来,内存会持续增长,但绝不会到达原来的两倍,而且Redis中许多冷数据不会出现读写情况,进一步降低内存。

????????子进程因为一直没有数据变化,在被fork一瞬间就固定了,因此称为快照。

二、AOF(Append Only File)

优点:

  • 数据保存完整性高

缺点:

  • 文件压缩性不强,恢复读取速度慢

????????AOF以日志方式记录每次写命令,恢复数据时把这些命令重新执行一遍。

????????AOF默认不开启,需要配置appendonly yes。其每次都将写命令追加到AOF缓冲区,不需要额外的进程。

????????随着Redis持续运行,AOF日志会越来越大,因此使用AOF再恢复数据时间会越来越长,因此定期需要对AOF日志进行重写瘦身。

2.1 重写机制

????????手动触发:bgrewriteaof命令

????????自动触发:配置触发时机

2.1.1 重写规则

  • 已经超时的命令不再写入
  • 去掉无效命令:set a 2、set a 3 ===> set a 3
  • 合并多条命令:set a 10、incr a、incr a ====> set a 12

2.1.2 重写流程

  1. 执行bgrewriteaof命令,Redis判断是否有子进程正在执行AOF重写,如果有,直接返回
  2. 如果没有,父进程fork生成子进程,开销如同bgsave过程
  3. fork完成后,父进程不再阻塞,继续执行Redis正常读写操作,以及写命令追加到AOF缓冲区操作,并根据自动触发配置策略调用Linux内核同步硬盘
  4. 由于fork的COW机制,子进程无法更新这段时间新加入的写命令,于是父进程开辟新的缓冲区“AOF重写缓冲区”保存新增加数据
  5. 子进程根据快照按照合并规则写入新的AOF文件
  6. 重写完成后,子进程通知父进程,父进程更新信息
  7. 父进程把AOF重写缓冲区中的数据添加至新的AOF文件
  8. 使用新的AOF文件替代旧的AOF,完成重写

2.2?fsync

????????Linux的glibc提供fsync函数可以将指定文件内容强制从内核缓存刷到磁盘。Redis进程就是调用fsync函数来实现持久化。

  • 每一次修改都同步,文件完整性好,最多丢失一行命令
  • 每秒同步一次,最多丢失2秒数据(默认)
  • 从不同步,内核来自动异步调用将其同步到磁盘,效率最高

生产环境综合考虑只会选择每秒同步一次,兼顾数据完整性和性能。

三、Redis4.0持久化

????????重启Redis时,因为会丢失大量数据,一般使用AOF来恢复内存状态,但是AOF又很慢。Redis4.0推出了混合持久化,在Redis重启时,首先加载RDB文件,然后再放增量AOF文件,重启效率得到大幅提高。

四、总结

  • RDB为默认持久化规则
  • AOF持久化方式为每次追加写操作,当AOF文件过大时,会对AOF进行后台重写
  • AOF开启且存在AOF文件时,优先加载AOF文件,否则加载RDB
  • 若只用Redis做缓存,不需要进行持久化
  • RDB一般不在主节点进行持久化,持久化操作主要在从节点,没有来自客户端的请求压力,资源比较充沛,一般15分钟做一次RDB
  • AOF最坏情况丢失2秒数据,但是会带来持续的IO操作降低性能
  • 不开启AOF,可以节省很大的IO,如果有一个宕机,最多丢失15分钟数据

五、常见问题

1、为什么Redis持久化要fork一个子进程?为什么不用一个当前进程内的线程?

  • fork子进程是要使用Linux的COW机制来生成快照,降低内存使用率
  • Redis对客户端响应是单进程单线程工作,因为数据都在内存,CPU不是Redis的瓶颈,因此单线程可以避免CPU上下切换及加锁竞争以及并发问题,代码实现简单,且效率高。而一个线程对于快照记录、现场复制以及多线程切换带来的资源消耗都不如一个fork来的简单高效。
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-09-24 10:37:42  更:2021-09-24 10:37:44 
 
开发: 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 22:49:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码