Netapp存储基础之WAFL, NVRAM, RAID, SnapShot

RAM存放data缓存,而NVRAM则放操作log. 类似于数据库的archive log.
RAID 3是利用每一条带的长度很短例如一个扇区512bit来实现性能的提升。它用大文件的支持很有效。但对随机IO读写的时候爱莫能助,因为每一个随机IO读写都要让RAID里的所有硬盘同时工作,它做不到让一个硬盘读写一个IO而另一个硬盘读写另一个IO。所以就有了RAID 4. RAID 4只是改进了RAID 3里的条带长度,比如把512bit改为4KB. 想通过如此来支持随机IO小文件(小于4KB)的读写. 事实上RAID 4是能够支持随机IO读的,但是写的时候就碰到一难题。当一个小于4KB的小文件写的时候需要改写两个盘的数据:Data盘和校验盘,而RAID 4是把其它一个硬盘作为校验盘的,所以当有两个小文件想写的时候,校验盘同一时间只能做一个数据的写了。这样,校验盘便成了瓶颈。这也是为什么后来有RAID 5的原因。RAID 5把校验盘通过条带化分配给了所有硬盘,提高的并发的几率!所以现在RAID 3和RAID 5都有人用,但RAID 4就不受待见,没人爱用了。
而NetApp到底是如何使用了RAID 4的呢? RAID 4只有一种情况可以并发IO写,那就是当要写的两个或多个小文件刚好处于同一条带时!此时,N个数据盘上的同一条带需要改写数据,并且校验盘的同一条带也要改写。WAFL便是通过软件层来让这一情况发生。WAFL通过编程来让一段时间内要写的数据尽量处于同一条带,当然,数据大于一个条带时那就处于相邻的条带了。RAID 4便是如此,WAFL巧妙地利用了它,使它的性能达到最优化。
而RAID DP(Double Parity),其实很类似于RAID 6. 它们的目的都是通过两个校验盘来防止两个数据盘同时掉线而掉数据。只是它们算法不一样。RAID 6用的是数据乘以一个系数后再异或来产生第二个校验数据;而RAID DP是不同条带之间做异或来产生第二个校验数据, 即两个校验盘中一个是横的条带的校验,另一个是斜的条带的校验。在此就不作评细介绍了,RAID的内容有时间再用另一篇幅介绍。
首先看系统如何保护还在内存中缓存的数据。这些数据是要被snapshot的,但它还没被写进磁盘,且在磁盘的inode里也没有信息。所以系统要对它进行snapshot操作。每个厂商都有不同实现,我不清楚其它厂商是如何做的。而NetApp是把内存的数据分配空间,更新inode从内存到硬盘;更新块图文件;更新磁盘缓存(注意,是硬盘上的缓存。这点也要保护)
其次,其它厂商可能是复制inode文件来作为snapshot, 而NetApp只是复制root inode来作为snapshot.
最后,NetApp是用redirect . write方式来保护snapshot数据(红皮书上写的Write . Copy是不确切的。本质上是redirect . write)。即,snapshot完成后,如果有数据要删除,则只是删除root inode、inode里相应的信息,不删除真正的data;而如果有数据要被改写,则不改变原有data,而是把改写后的数据再完整地写在其它地方,即inode指向其它地址,不占用原有的地址。
1. root inode处于硬盘固定位置,而data和inode可放于任何地方
2. WAFL把data和inode放于相邻的位置。且尽量让一次要写的数据在RAID 4的同一条带上。
3. 利用块图文件来指示某一个块是在被哪个文件系统所用。比如是被当前文件系统所用呢,还是被某一时间的snapshot所用。
4. WAFL从来不覆盖旧块
5. WAFL每次做check point的时候,不仅将实际数据flush到新块,连inode元数据都要写到新块而不覆盖旧块,这也就是snapshot为何胆敢只拷贝root inode就完成了的原因。
RAM里存放将要写进硬盘里的data, 称为data缓存。而NVRAM里存放的着操作的log。log里记录着"新建一个属性为XX的文件", "删除XX文件里的XX内容". NVRAM的空间平均分为两部分,两个空间轮流使用。当一个空间的值超过一定的阀值或者超过10秒,(此时叫consistency point 触发点), 就进行一次flush。即根据NVRAM里的log,把inode写进硬盘,并且清除NVRAM里的log。inode写进去了,那data呢?其实在此次CP之前,data是不断被写进硬盘里的!flush做的仅是把inode写进去!在flush开始后,NVRAM里另一半的空间就接替了原空间作为当前空间接替工作。等下个CP来时,又换回另一空间继续工作。(注意,在cluster的时候
WAFL给RAID芯片发送data和地址. 在这里,RAID芯片可不认识inode和root inode了,RAID只知道data,并且知道哪些data需要存进哪些LBA地址. 若探讨得更底层些,那WAFL层的data和inode是被raid写到同一条带上,当然,RAID会计算出校验数据写进同一条带上的校验盘。而WAFL层的root inode是被写进硬盘的某一固定位置(应该是头部吧?)。磁盘头从与data/inode的位置到root inode的位置需要一定的寻道时间,这个时间省不了。写数据的顺序是先写data/inode再写root inode.
因为这里也有寻道时间。之前我便有个疑惑,普通的文件系统从data到inode有寻道时间,而WAFL从data/inode到root inode也有寻道时间,这似乎并不能减少寻道时间的减少。苦苦思索后,只能这么猜想了: NetApp是在写完一个CP中的所有data/inode后,再写root inode. 这样便节省了一定的寻道时间。。这个问题有待以后慢慢思考
如此一来WAFL便不用耗费大量时间去做一致性检查了。因为它总是先写data,再写root inode. WAFL每10秒就更新一次一致点,这个一致点其实是一个内部的snapshot, 只不过此snapshot无法被访问. 当掉电时,NVRAM可保护log,即保护了操作记录。文件系统能知道掉电前的所有操作还有最近的snapshot。另外,NVRAM记录的log是很精简的,它用很少的空间大小记录了几千几万个操作。就不用再去做文件系统一致性检查了,只用很短的时间便可恢复文件系统。但有一个问题,RAM里的数据是无法保护的啊!到现在我也不知道NetApp对RAM是怎么处理的。如果它对RAM里的数据没有log起来,那它掉电情况下,数据就永远地丢了。可能NetApp只是想节省一致性检查的时间,而对数据的保护不太在乎吧?


转载于:https://blog.51cto.com/flybirddidi/218419
相关文章:

读取本地照片 以流的形式进行显示
获取到前端传来的文件名称,到相应的文件中去读取,通过流的形式写到响应体中。 /*** 显示图片 * getFeedBackPicture.do?picName* return*/RequestMapping(value"/viewPhoto/{photopath}")public void getFeedBackPicture(HttpServletRespons…

如何轻松搞定机构资格准入?
银联的“资格入网”虽涉及环节庞杂,但杂而有序,初次接触银联的机构极有可能不知道先从哪一步骤开始,很多用户甚至不知道该怎么填写材料,所以我整理了一份详细的入网流程,以供大家参考,希望能帮助到大家~ 入…

eclipse CreateProcess error=87 的解决办法
有的说是 ClassPath过长,有的说是Eclipse插件导致最后 在这里得到解决啦http://code.google.com/p/googleappengine/issues/detail?id1862In C:\google\appengine-java-sdk-1.3.1\config\user\ant-macros.xmlChange line 102from<fileset dir"{war}/WEB-IN…

学习javascript 非常好的博客
这个大牛写的非常好!!推荐一下 http://www.cnblogs.com/xiaohuochai/tag/javascript%E6%80%BB%E7%BB%93/default.html?page8 小火柴的蓝色理想 转载于:https://www.cnblogs.com/oxspirt/p/7987342.html

Flex自定义组件
项目中需要用到如下一个效果。下图中五个圆代表一个五孔的梅花管。客户在后台操作时需要编辑梅花管的每个子孔占用情况。客户的要求是:点击某一个孔,小孔变黑,表明此孔被占用;再次点击,则小孔再变成透明圆形࿰…

解决在SQL Server 2000的存储过程不能调试
本机上: 控制面板—>管理工具—>服务—>MSSQL(默认的ID)—>属性—>登陆—>选一个Windows帐户,填写密码,再重新启动SQL Server 2000就可以调试存储过程了。 看一看sql数据库的版本,如果是kf版则不能进…
springboot打成jar后获取classpath下的文件
直接上代码 JAR包用这个 //获取容器资源解析器ResourcePatternResolver resolver new PathMatchingResourcePatternResolver();// 获取远程服务器IP和端口try {//获取所有匹配的文件Resource[] resources resolver.getResources("static/images/faceSearch/*.*"…

thymeleaf : input/select/radio回显
thymeleaf中不用自己去写checked"checked" selected"selected"这种代码,他自己会选。 input <input type"text" class"form-control1" id"name" name"name" th:value"${user.name}"> …

Spark MLlib之使用Breeze操作矩阵向量
这下面的练习中,需要自己将spark的jar包 添加进来。 1.spark Mlib 底层使用的向量、矩阵运算使用了Breeze库。 scalaNLP 是一套 机器学习和数值技算的库。它主要是关于科学技术(sc)、机器学习(ML)和自然语言处理&#…

兄弟们,TechEd见!
马上就要TechEd啦!11月6日到11月7日,在北京举办TechEd,嘿嘿,那就是中国最大的微软技术庙会!盆盆是在2005年时第一次参加TechEd的,当时拿的是MVP的赠票。啥都不懂,就好比刘姥姥进了大观园&#x…

Java - 框架之 SpringBoot 攻略day01
Spring-Boot 攻略 day01 spring-boot 一. 基本配置加运行 1. 导入配置文件(pom.xml 文件中) <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1…

关于 RMAN 备份 数据块 一致性的讨论
今天和 杭州恒生 的一个朋友讨论一个RMAN 在备份时数据块一致性的问题。 关于RMAN 的备份原理参考blog: RMAN 系列(一)---- RMAN 体系结构概述 http://blog.csdn.net/tianlesoftware/archive/2010/06/09/5659701.aspx 先看官方文档上的一段话…

常用git命令
常用 Git 命令清单。专用名词的译名如下。半支烟 Workspace:工作区Index / Stage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库一、新建代码库 # 在当前目录新建一个Git代码库 $ git init# 新建一个…
springboot 读取配置文件内容的几种方式
1 使用 Environment 进行读取 env.getProperty("配置文件中的值") 2 使用注解的方式 PropertySource("classpath:application.properties") // 获取属性文件 //将其注解到类上 获取属性值 Value("${pictureSearchDemo.apiUrl}") // 获取属性…

Ubuntu9.10使用windows的字体的方法!
使用Ubuntu9.10已经有好几天了,安装字体算是我遇到的比较头疼的一件事,原本按照Ubuntu9.04的方法操作,发现无法使用windows中的字体,换了好几个方法,最终找打了解决方法,过程如下:1、新建一个文…

jmeter笔记(8)--关联
关联是jmeter中比较重要的一个点,在测试过程中有些数据是经常发生变化的,要获取这些数据,就需要使用关联,Jmeter可以通过“后置处理器”中的“正则表达式提取器”来处理关联。。 正则表达式提取器 1、在取样器下点击【添加】--【后…

java连接mysql以及增删改查操作
java连接数据库的代码基本是固定的,步骤过程觉得繁琐些,代码记起来对我来说是闹挺。直接上代码: (温馨提醒:你的项目提前导入连接数据库的jar包才有的以下操作 ) 1 class DBConnection{2 3 // 驱动类…
Jrebel 热部署插件的使用和破解
生成GUIDS 的网站:https://www.guidgen.com/ Jrebel 介绍和破解说明:https://www.cnblogs.com/wang1024/p/7211194.html 本地服务器软件,在使用eclipse或者idea 时打开就可以了。链接:百度云链接 密码:buin

微软SCRUM 1.0流程模板在中文版TFS2010上无法创建项目的解决办法(续)
原文: http://www.almnetworks.net/zh-CN/post/2010/08/04/Microsoft-Visual-Studio-Scrum-10-Template-on-Chinese-Version-of-TFS.aspx 经过我的进一步测试,发现以上步骤不能解决这个问题,但是我找到了一个可以暂时保证我们使用SCRUM模板的…

《父亲家书》选:给初为人师的儿子
文飞:离家已二十九天了,可能是年纪大了的缘故,不要说你妈妈,就连我也想念你了!为不影响你工作,我坚持不够一个月“决”不给你去信。这不到期了,就按时给你去信。你上次来信,早已收到…

vue-cli脚手架
安装 全局环境安装,不必要在项目地址下安装:npm install -g vue-cli 卸载 全局卸载:npm uninstall -g vue-cli 查看是否安装成功:vue list 查看vue版本,vue -V 回车,查看vue最新的版本。 使用 进入到编辑器…

JackJson 使用记录
Map<String,Object> map new HashMap();map.put("ssss","sadsad");// 定义JackJson 对象ObjectMapper mapper new ObjectMapper();//将map转换成JSON字符串String image_json mapper.writeValueAsString(map); https://blog.csdn.net/a123demi/art…

APUE 学习笔记 - Chapter 6. System Data File and Infomation
1.密码文件 每个系统都会有一个文件统一记录用户名与密码,通常是/etc/passwd。关于这个文件有:root 的 uin 通常为 0 .文件中的 x为占位符,代表真实的加密密码保存在另外的文件。没有这一列的时候,表示该用户没有设立密码。将用户…

加密工具和unlocker的使用
在我的电脑上,一些不想让人翻看的程序和资料都使用一款《E-钻文件夹加密大师》的伪加密软件来加密。 这个程序只防君子不防小人,真正想看的人还是可以找到方法看的。并且这个软件还有些bug和不方便之处。 我在电脑上编程之前需要对多个代码文件夹进行解密…

第四章:操作列表
第四章:操作列表4.1 遍历整个列表如果名单很长,将包含大量反复的代码。另外,每当名单的长度发生变化时,都必须修改代码。通过for循环,可让Python去处理这些问题1)使用for循环来打印魔术师名单中的所有名字&…

约束,索引,rownumrownum
--constraint --not null 非空约束 --unique 唯一键 --非空&唯一 --自定义检查约束 --创建约束时,为约束起名 --在添加完列后,还可以添加约束 --除了not null不可以 --主键约束 --为了保证该列的数据能够证明行记录在表中是唯一的 --主键约束从形式看…
微信小程序如何搭建本地环境开发
必要软件 ngrok :用来搭建内网穿透微信小程序开发工具微信小程序账号 如何使用ngrok 搭建内网穿透 在官网下载windows版本的ngrok,并且注册一个免费的账号,至此会给你生成一个认证码。ngrok官网,附一个下载好的文件,里包括官方版…

跨域部署Silverlight时需要注意的问题
当我们的Silverlight程序(.xap)发布地址和网页发布地址处于不同服务器上(跨域状态)时,由于安全机制在Silverlight和Javascript调用时会出现一些问题,如:Silverlight调用页面中的Javascript方法或页面中的Javscript调用Silverlight方法时报错或…

做国内最好的ITSM服务管理软件
E8.HelpDesk支持多种服务台管理体系,支持事件管理、问题管理、变更管理、配置管理、发布管理、运行管理的全程自动化;整个处理工作以流程自动化的任务贯穿,形成闭环的工作流,并有计划任务机制、报警提醒机制、事件升级机制、跟踪反…

AppBaseJs 类库 网上常用的javascript函数及其他js类库写的
AppBaseJs类库。一个借鉴了网上常用的函数及其他js类库写的,方便大家的调用。代码如下:/*----------------------------------- Web Application JavaScript Library 2009.11 janchie ------------------------------------*///String原生对象扩展 置空左右端空格 String.proto…