| |
|
开发:
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持久化 |
目录 1.4 Linux写时拷贝机制(COW,Copy On Write) 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.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 重写规则
2.1.2 重写流程
2.2?fsync????????Linux的glibc提供fsync函数可以将指定文件内容强制从内核缓存刷到磁盘。Redis进程就是调用fsync函数来实现持久化。
生产环境综合考虑只会选择每秒同步一次,兼顾数据完整性和性能。 三、Redis4.0持久化????????重启Redis时,因为会丢失大量数据,一般使用AOF来恢复内存状态,但是AOF又很慢。Redis4.0推出了混合持久化,在Redis重启时,首先加载RDB文件,然后再放增量AOF文件,重启效率得到大幅提高。 四、总结
五、常见问题1、为什么Redis持久化要fork一个子进程?为什么不用一个当前进程内的线程?
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |