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

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

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

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

前言

存储网络行业协会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的刷子,并给所有颜…

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 此时如果出错,最后一行是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的窗口和消息,也简要讨论了进程和线程。子类化(Subclassing)和超类化(Superclass…

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

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

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

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

搭建基于Jenkins的CI服务器

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

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)----------------------------------------------…

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…

java中的NAN和INFINITY

2019独角兽企业重金招聘Python工程师标准>>> java浮点数运算中有两个特殊的情况&#xff1a;NAN、INFINITY。 1、INFINITY&#xff1a; 在浮点数运算时&#xff0c;有时我们会遇到除数为0的情况&#xff0c;那java是如何解决的呢&#xff1f; 我们知道&#xff0c;在…

Troubleshooting(三):网络

2019独角兽企业重金招聘Python工程师标准>>> 前言 在 Troubleshooting 过程中&#xff0c;检查完进程信息后&#xff0c;接下来就是排查网络情况的时候了&#xff0c;初略翻过《TCP/IP 详解卷一&#xff1a;协议》这本书&#xff0c;简直跟看《深入理解 Linux 内核》…

SqlServer 备份还原教程

看了众多教程&#xff0c;自己也写个增强记忆&#xff0c;错误地方麻烦指出。 ———————————————————————-备份——————————————————————– 1.打开数据库&#xff0c;成功连接 2.找到要备份的数据库&#xff0c;图中演示备份数据库te…

深入理解计算机系统----读书笔记

第二部分 信息的表示和处理 信息存储&#xff1a; 二进制&#xff08;0101001&#xff09;&#xff0c; 八进制&#xff0c;十六进制&#xff08;0x32FD&#xff09; 字&#xff08;word size&#xff09;指明整数和指针数据的标称大小&#xff08;normal size&#xff09;&…

OpenStack-Zun 使用

Zun组件简介 Zun是Openstack中提供容器管理服务的组件&#xff0c;于2016年6月建立。Zun的目标是提供统一的Openstack API用于启动和管理容器&#xff0c;支持多种容器技术。Zun原来称为Higgins&#xff0c;后改名为Zun。 Zun计划支持多种容器技术&#xff0c;Docker&#xff0…

js进阶 14-8 表单序列化函数serializeArray()和serialize()的区别是什么

js进阶 14-8 表单序列化函数serializeArray()和serialize()的区别是什么 一、总结 一句话总结&#xff1a;两者都是对表单进行序列化&#xff0c;serializeArray()返回的是json对象&#xff0c;serialize()返回的是json形式的字符串&#xff0c;使用起来都是一样的 1、$&#x…

linux 7.2中文命令,CentOS7如何支持中文显示

1.查看系统是否安装有中文语言包locale -a | grep "zh_CN" 命令含义&#xff1a;列出所有可用的公共语言环境的名称&#xff0c;包含有"zh_CN"若出现图中所示几项&#xff0c;那么说明系统中已经安装了语言包&#xff0c;不需要在安装。含义是&#xff1a;…

别人7天乐,运维还苦逼值班?

你被点名值班了吗&#xff1f;或者你的朋友、隔壁七大姑八大姨的侄子被点名值班了吗&#xff1f; 国庆将至&#xff0c;大家都开始研究各种度假攻略了&#xff0c;国内游、国外游、地球游、外星游。。。然而总有一票人&#xff0c;默默地职守着 -- tIT 公司运营支撑组/运维组。…

【常用损失函数】

一、Smooth L1 Loss 1.公式&#xff1a; 2.原因&#xff1a; L1损失使权值稀疏但是导数不连续&#xff0c;L2损失导数连续可以防止过拟合但对噪声不够鲁棒&#xff0c;分段结合两者优势。 二、Focal Loss 1.公式&#xff1a; 2.作用&#xff1a; 使得正负样本平衡的同时&#x…

linux 读取内存颗粒,linux查看主板内存槽与内存信息的命令dmidecode怎么用

在Linux中&#xff0c;我们常常使用命令来实现许多操作&#xff0c;比如查看内存信息等&#xff0c;下面小编就为大家带来一篇linux查看主板内存槽与内存信息的命令dmidecode方法。小编觉得挺不错的&#xff0c;现在就分享给大家&#xff0c;也给大家做个参考。一起跟随小编过来…