快照是什么?揭秘存储快照的实现

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~

本文由许登博 发表于云+社区专栏

原创声明:本文首发腾讯云·云+社区,未经允许,不得转载

前言

存储网络行业协会SNIA(StorageNetworking Industry Association)快照的定义:关于指定数据集合的一个完全可用拷贝,该拷贝包括相应数据在某个时间点(拷贝开始的时间点)的映像。快照可以是其所表示的数据的一个副本,也可以是数据的一个复制品。

需要注意的是:快照是完全可用的拷贝,但不是一份完整的拷贝,至于为什么,后面会详细讲。

存储快照的使用场景

场景一:

存储快照,是一种数据保护措施,可以对源数据进行一定程度的保护,通俗地讲,可以理解为----后悔药。

img

如上图,假设在t0时刻,有一份完整的源数据,我们在t1时刻,针对这份源数据创建一份快照。

t2时刻,若因为各种原因(误操作、系统错误等)导致源数据损毁,那么,我们可以通过回滚(rollback)快照,将源数据恢复至快照创建时的状态(即t1时刻),这样,可以尽量降低数据损失(损失的数据,是t1到t2之间产生的数据)。

这种功能,常用于银行、公安户籍、科研单位等。操作系统、软件升级或机房设备更替,一般会选择在夜间或其他无生产业务时,进行高危操作,操作前会对数据进行快照,若操作失败,则将快照进行rollback,将源数据恢复至操作前的状态。

场景2:

前言中说过,快照是一份完全可用的副本,那么,它完全可以被上层业务当做源数据。

img

如上图,针对源数据,创建快照后,将快照卷映射给其他上层业务,可以用于数据挖掘和开发测试等工作,针对快照的读操作不影响源卷的数据。

这种功能,常用于直播(视频&图片)鉴黄、科研数据模拟开发测试等,比如,视频直播平台需要将某一段时间的视频提供给执法机构进行筛查分析,那么可以通过对特定时间点保存的数据创建快照,将快照映射给执法机构的业务主机去进行挖掘分析。

存储快照的实现原理

目前,快照的实现方式均由各个厂商自行决定,但主要技术分为2类,一种是写时拷贝COW(Copy On Write),另一种,是写重定向ROW(Redirect On Write)。

写时拷贝COW

COW(Copy-On-Write),写时拷贝,也称为写前拷贝。

创建快照以后,如果源卷的数据发生了变化,那么快照系统会首先将原始数据拷贝到快照卷上对应的数据块中,然后再对源卷进行改写。

img

写操作:

如上图简要示例,快照创建以后,若上层业务对源卷写数据X,X在缓存中排队,快照系统将X即将写入的位置(逻辑地址)上的数据Y,拷贝到快照卷中对应的位置(逻辑地址)上,同时,生成一张映射表,表中一列记录源卷上数据变化的逻辑地址,另一列记录快照卷上数据变化的逻辑地址。我们可以看到,上层业务每下发一个数据块,存储上,发生了两次写操作:一次是源卷将数据写入快照卷(即图中Y),一次是上层业务将数据写入源卷(即图中X)。

img

读操作:

如上图,快照卷若映射给上层业务进行数据分析等用途时,针对快照进行读操作时,首先由快照系统判断,上层业务需要读取的数据是否在快照卷中,若在,直接从快照卷读取,若不在,则查询映射表,去对应源卷的逻辑地中读取(这个查表并去源卷读的操作,也叫读重定向)。这一点,恰好就解释了为什么快照是一份完全可用的副本,它没有对源卷进行100%的拷贝,但对上层业务来说,却可以将快照看做是和源卷“一模一样”的副本。

针对源卷进行读操作时,与快照卷没有数据交互。

我们可以看到,快照对源卷的数据具有很好的保护措施,快照可以单独作为一份可以读取的副本,但并没有像简单的镜像那样,一开始就占用了和源卷一样的空间,而是根据创建快照后上层业务产生的数据,来实时占用必需的存储空间。

快照回滚(rollback):

img

如上图,回滚操作的前提条件是,锁定源卷(暂停对待回滚的逻辑地址上的IO操作),然后通过查映射表,将快照卷上的对应数据回拷到源卷中。

快照删除:

采用COW技术的快照,其源卷即保存着完整的实时数据,因此,删除快照时,直接销毁了快照卷和映射表,与源卷不存在数据交互。

写时重定向ROW

ROW(Redirect-on-write ),也称为写时重定向。

创建快照以后,快照系统把对数据卷的写请求重定向给了快照预留的存储空间,直接将新的数据写入快照卷。上层业务读源卷时,创建快照前的数据从源卷读,创建快照后产生的数据,从快照卷读。

img

写操作:

如上图简要示例,快照创建以后,若上层业务对源卷写数据X,X在缓存中排队,快照系统判断X即将写入源卷的逻辑地址,然后将数据X写入快照卷中预留的对应逻辑地址中,同时,将源卷和快照卷的逻辑地址写入映射表,即写重定向。我们可以看到,上层针对源卷写入一个数据块X,存储上只发生一次写操作,只是写之前进行了重定向。

读操作:

快照创建以后,上层业务对源卷进行读,则有两种情况:1)若读取的数据,在创建快照前产生,数据是保存在源卷上的,那么,上层就从源卷进行读取;2)若需要读取的数据是创建快照以后才产生的,那么上层就查询映射表,从快照卷进行读取(即读重定向)。

快照创建以后,上层业务对快照卷进行读,同样也有两种情况:1)若读取的数据,在创建快照前产生,数据是保存在源卷上的,那么上层就查询映射表,从源卷进行读取;2)若需要读取的数据是创建快照以后才产生的,那么上层就直接从快照卷进行读取。

我们可以看到,ROW快照也是根据创建快照后上层业务产生的数据,来实时占用必需的存储空间。

快照回滚(rollback):

采用ROW技术的快照,其源卷始终保存着快照创建前的完整数据,快照创建后,上层业务产生的数据都写入了快照中,因此,快照的回滚只是取消了对源卷的读重定向操作。通俗地说,就是源卷上没有进行任何数据操作,上层业务对源卷的读,仅限于读源卷(即不会去读取快照卷的数据)。

快照删除:

img

采用ROW技术的快照,其源卷始终保存着快照创建前的完整数据,快照创建后,上层业务产生的数据都写入了快照中。因此,若要删除快照,必然要先将快照卷中的数据,回拷到源卷中,拷贝完成才能删除,如上图。此时我们可以设想,如果,针对一份源数据,在18:00创建了快照,上层业务持续产生大量新的数据,19:00又创建了快照,20:00又创建了快照……那么,在有多份快照的情况下,如果需要删除快照,就会出现,多个快照向源卷回拷数据的情况,可能导致回拷量非常大,耗时很长。

两种技术对比

img

如上表,COW的写时拷贝,导致每次写入都有拷贝操作,大量写入时,源卷的写性能会有所下降,而读源卷是不会受到任何影响的,删除快照时,只是解除了快照和源卷的关系,同时删除了快照卷的数据而已。ROW在每次写入仅做了重定向操作,这个操作耗时是几乎可以忽略不计的,源卷的写性能几乎不会受到影响,但读源卷时,则需要判断数据是创建快照前还是创建快照后,导致大量读时,性能受到一定影响,比较致命的是,若源卷有多个快照,在删除快照时,所有快照的数据均需要回拷到源卷才可以保证源卷数据的完整性。

结语

上面简单地介绍了存储快照的实现原理,实际上,快照特性应用广泛,其应用对象是很多的:

img

目前,主流厂商在自研产品上,对上面的ROW和COW技术都有小范围的改动,也有一些新兴的快照技术已经诞生,但这个行业里,没有最好的快照技术。技术为业务服务,只有针对业务类型做好本地化适配,才能达到最佳效用。

问答

消失存储过程?

相关阅读

腾讯云CIS入门——Kubernetes部署

腾讯云API:用Python使用腾讯云API(机器翻译实例)

主机迁移实践分享

此文已由作者授权腾讯云+社区发布,原文链接:https://cloud.tencent.com/developer/article/1158686?fromSource=waitui

欢迎大家前往腾讯云+社区或关注云加社区微信公众号(QcloudCommunity),第一时间获取更多海量技术实践干货哦~

海量技术实践经验,尽在云加社区!

转载于:https://www.cnblogs.com/qcloud1001/p/9322321.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397506.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 事物隔离级别

1.什么是事物: 访问并可能更新数据库的一个完整的程序执行单元(UNIT)2、事物必须满足ACID特性:A,atomic,原子性,要么都提交,要么都失败,不能一部分成功,一部分…

IIS_各种问题

IIS7中默认是已经加载了脚本映射处理。但今天装了个WIN7,装好IIS后却发现没有。于是手动去这安装,在添加html映射时提示:模块列表中必须要有IsapiModule或cgiModule 因为 IIS 7 采用了更安全的 web.config 管理机制,默认情况下会锁…

平板涂色

题目描述 CE数码公司开发了一种名为自动涂色机(APM)的产品。它能用预定的颜色给一块由不同尺寸且互不覆盖的矩形构成的平板涂色。 为了涂色,APM需要使用一组刷子。每个刷子涂一种不同的颜色C。APM拿起一把有颜色C的刷子,并给所有颜…

UVA - 1388 Graveyard 【数学】

题目链接 题意&#xff1a; 给一个周长为10000的圆&#xff0c;一开始有n个距离相等的点&#xff0c; 现在要添加m个点使其仍旧保持距离相等的状态&#xff0c;问最小的移动距离。 思路&#xff1a; 遍历原来的每一个点&#xff0c;找出离他最近的新的位置。 #include <map&…

Android API中被忽略的几个函数接口

1. MotionEvent的几个函数 下面的方法都支持多点触摸&#xff0c;即可以对单个触摸点调用下面的方法 1.1 getPressure() 这个api 可以获取到手指触摸屏幕时候的压力,但是需要硬件和驱动支持... 它有助于我们做出更加拟物化的设计&#xff0c;比如&#xff1a; 1. 手绘。可以根据…

error while loading shared libraries: libstdc++.so.6: cannot open shared object file

查看谁提供这个.so yum whatprovides libstdc.so.6 yum install libstdc-4.8.5-28.el7.i686 #安装上边查出来的.so 此时如果出错&#xff0c;最后一行是libstdc-4.8.5-28.el7.i686 ! libstdc-4.8.5-11.el7.x86_64 yum update libstdc-4.8.5-11.el7.x86_64 #更新一下,这个是上…

【转】为控制台窗口建立消息队列

介绍Windows的窗口、消息、子类化和超类化 这篇文章本来只是想介绍一下子类化和超类化这两个比较“生僻”的名词。为了叙述的完整性而讨论了Windows的窗口和消息&#xff0c;也简要讨论了进程和线程。子类化&#xff08;Subclassing&#xff09;和超类化&#xff08;Superclass…

hightmaps 按地图上显示的统计数据

离extjs 至 easyui 到html5到hightchars 再到hightmaps。Exjts和easyui很相似&#xff0c;extjs是重量级的&#xff0c;easyui轻量级的。比extjs容易上手。照着demo改就能够开发了。easyui入门demo见&#xff1a;easyui-demo&#xff0c;或者到官网http://www.jeasyui.com/&…

python pytorch 版本,python 如何查看pytorch版本

看代码吧~import torchprint(torch.__version__)补充&#xff1a;pytorch不同版本安装以及版本查看一&#xff1a;基于conda安装conda create --name pytorch_learn python3.6.7#创建一个名为pytorch_learn的环境source activate pytorch_learn #进入环境conda install pytorch…

Unity WebGL 窗口自适应

unity 打包好WebGL后&#xff0c;用文本编辑器编辑打包生成的 index.html 文件 在生成的html里面修改代码<script type"text/javascript">    function Reset() {       var canvas document.getElementById("#canvas");        …

python 会增加内存吗,Python+不断增加的内存分配

我正在写一个模块来训练一个大型数据集上的ML模型——它包括0.6米的数据点&#xff0c;每个数据点的维度都是0.15米。我在加载数据集本身时遇到了问题。(全是numpy数组)下面是一个代码片段(它复制了实际代码的主要行为)&#xff1a;import numpyimport psutilFV_length 150000…

非IT人士的云栖酱油之行 (程序猿迷妹的云栖之行)

摘要&#xff1a; 熟悉我的人都知道&#xff0c;我是一个贪玩儿且不学无术的姑娘&#xff0c;对于互联网我也是知之甚少&#xff1b;这次去到杭州参加阿里巴巴集团主办的为期4天的科技大会也是很例外&#xff1b;但是不得不说这次的会议真是让我很震惊。今天我就和大家分享一下…

MySQL 全文搜索支持, mysql 5.6.4支持Innodb的全文检索和类memcache的nosql支持

背景&#xff1a;搞个个人博客的全文搜索得用like啥的&#xff0c;现在mysql版本号已经大于5.6.4了也就支持了innodb的全文搜索了&#xff0c;刚查了下目前版本号都到MySQL Community Server 5.6.19 了&#xff0c;所以&#xff0c;一些小的应用可以用它做全文搜索了&#xff0…

搭建基于Jenkins的CI服务器

安装Jenkins和创建任务这些操作网上一搜一大把&#xff0c;这里就没必要写了&#xff0c;直接就开始编译、单元测试&#xff0c;覆盖&#xff0c;git提交触发构建&#xff0c;构建失败发送给提交人邮件。 因为项目比较复杂&#xff0c;为了懒省事我直接在CI服务器上安装了visua…

php打补丁,PHPMailer库打补丁后漏洞仍然存在,怎么解?

开源PHPMailer库被披露存有一个严重的远程代码执行漏洞。这个漏洞在被修补后&#xff0c;又进行了二次修复&#xff0c;因为第一次没有充分解决问题。那么&#xff0c;这个漏洞是如何工作的&#xff1f;为什么原始补丁没有解决问题&#xff1f;Michael Cobb&#xff1a;代码库和…

Ubuntu下安装jdk经验分享

Ubuntu下安装jdk经验分享http://www.jb51.net/article/55131.htm转载于:https://www.cnblogs.com/kangtuohongwai/p/6002555.html

BZOJ 1270: [BeijingWc2008]雷涛的小猫( dp )

简单的dp..dp(i,j) max(dp(x,y))cnt[i][j], (x,y)->(i,j)是合法路径.设f(i) max(dp(x,y))(1≤x≤N, 1≤y≤i), g(i,j) max(dp(i, k))(1≤k≤j)那么dp(i,j) max(f(jdelta), g(i,j1))cnt[i][j]. 递推即可. 时间复杂度O(NH)----------------------------------------------…

【校招面试 之 C/C++】第12题 C++ 重载、重写和重定义

1、成员函数重载特征&#xff1a; a.相同的范围&#xff08;在同一个类中&#xff09;&#xff1b; b.函数名字相同&#xff1b; c.参数不同&#xff08;参数个数不同或者参数类型不同&#xff0c;但是返回值不同不能使重载&#xff09;&#xff1b; d.virtual关键字可有可无…

mac php5.6.30与php7共存,认识Homebrew以及在Mac上同时安装PHP5及PHP7

Homebrew几乎是Mac上必备的软件&#xff0c;用于下载安装和管理其他软件。尤其对于程序员&#xff0c;讲真&#xff0c;本人到现在仍然不知道在Mac上如何不借助Homebrew来搭建php-apache-mysql开发环境。认识HomebrewHomebrew是一个开源项目&#xff0c;据说它的作者曾经去谷歌…

POJ 1141

题意&#xff1a;给出一个表达式的子序列&#xff0c;要你填充这个序列&#xff0c;保证最终形成的序列长度最短&#xff0c;也就是添加的括号最少 这个子序列要遵循括号匹配的原则。 分析&#xff1a;转移方程dp[i][j]min(dp[i][k],dp[k1][j]).i<k<j.dp[1][1]1; dp[i][j…