注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭研后台技术中心的博客

 
 
 
 
 

日志

 
 

数据一致与单页损坏  

来自wanggongpu2005   2012-06-18 12:20:48|  分类: 默认分类 |举报 |字号 订阅

  下载LOFTER 我的照片书  |
数据库数据错误或丢失对于互联网应用来说有时可能会是致命的,一个典型的例子就是在线书签网站Ma.gnolia.com,该网站因为文件系统冲突扩散至数据备份,导致网站存储的用户数据主备库均丢失,最终不得已关门大吉。

   传统的系统故障有三类:系统故障,存储介质故障和事务故障,影响最轻的是事务故障,单个事务的失败并不影响其他事务的运行,事务失败后会通过回滚操作来保证要么全做要么不做的事务ACID语 义。其次是存储介质的故障,典型的例子是读写磁头擦伤硬盘表面,导致整个硬盘的数据失效。这种情况下操作系统和数据管理系统会照常运行,但一旦使用了损坏 磁盘的数据就会出错。系统故障是最严重的,整个数据库管理系统乃至操作系统都有可能需要重启作恢复,所有未提交的事务将失败,也会删除该未提交事务的所有 更新,而所有已提交的事务和它们的更新将被保存或修复。

   传统解决数据故障的方案有:

 
数据库系统中单页损坏故障的定义检测与恢复 - wanggongpu2005 - sunny
 

 前 微软现惠普的两位工程师引入了第四类故障类型,即单页损坏,一种因为读取数据页时,数据页本身存在少量似是而非的内容导致的错误,作者还介绍了一种名为 page recover index的新方法来替换传统的解决方案(原有方案是把这种错误等同于介质错误来处理,代价较高),这种方法是通过和目前常见的高效日志恢复实现类似的日 志恢复来完成的,单页损坏的检测与恢复都会非常快,既不会影响普通事务也不会影响到读取数据的速度。

这篇博文主要介绍该方法是如何检查单 页故障,并作单页故障恢复操作的。传统的故障检测技术需要线下运行并且是扫描全表甚至是整个数据库,有些系统的实现对一些页还会多次读取,而更具扩展性的 算法应该是对同一页只需要读取检验一次,而且读页的属性也不是按照也在磁盘里的顺序,导致随机读页效率变差。线下校验要求数据只读,这样就影响应用程序的 用户体验,已经提出的部分方案采用快照的方式解决,但快照有一个缺陷,就是当快照完成生成报告时,当前的数据在快照一刻之后又发生了新的修改变动,结果就 不是实时的了,另外那些方案的检验也还不够充分,因为要为每一个从存储器里读取加载到缓冲buffer池的页面都应该进行检验操作。

1.单页损坏故障的检测

       以数据库中普遍用到的B树为例,目前为止在所有的B树实现中,复杂的在线数据一致性检查算法还没有发明出来,但是带有fence key的B树,以从root到leaf完整遍历整棵树的副效应,能够做到高效在线数据验证。B树节点只有一个值域不能验证,需要一个额外的数据 域,pageLSN,表示最近一次数据页的修改日志,并包含在记录日志的位置;
     对于全面的结构验证,没一个节点需要一个低fence key和一个高fence key,这是两个来自父节点的独立键值,以保护该段分裂为两兄弟节点。顺着由父节点指向子节点的指针,父节点的下一个节点一定是子节点的一个fence key,这对于B树所有节点都是正确的,而对于不是兄弟节点,但共用一个祖父节点的表亲节点验证也只需要两趟由根至叶的遍历,因为共同祖先的fence key是在分裂的同时进行了复制。
    图示解释了B树中的fence key,所有其他键值落在最大最小fence key之间,因为前缀压缩的原因,fence key一般较小,
    
                                                       黑色表示高fence key,白色表示低fence key.
就 像B-link树,foster B树的本地节点分裂并不会立即向上增殖(上一级节点也进行分裂操作),也因此所有B树操作只需要两把latch,就像write-optimized B树任何时候只支持单一的内部指针,这样就能支持在删除节点时有高效的页分裂和叶重整操作同时还能保持简单的并发控制。这能够尽早检测出页数据错误。
     下图显示了Foster B树的实例,一个根节点两个节点分支,三个叶子节点。颜色相同表示key值相同,所有节点有两个fence key,
          
在 节点分裂时独立key会扩散到父节点层,左边分支最近发生过一次分裂,产生了中间的一个叶子节点,最左边的节点就成了中间节点的foster(养父母)节 点,在暂态完整链的关系上,最左边节点和中间节点是领养关系,每个foster节点都包含了整个完整链的高fence key,这为由父节点开启顺着完整链的复杂并发检测提供了保证。上图可以看出每次由根到叶的遍历过程不论是父节点到标准子节点还是foster节点到子节 点都必须匹配上一级的两个fence key.
  立即检查的优势显而易见,可以在第一次发生数据页冲突时就能检测出来,并用恰当的恢复技术进行恢复操作。

2.单页损坏故障的恢复

      

上图显示了,系统在发生单页故障时,因对单页故障恢复是否支持而走的不同逻辑,如果发生数据不一致现象,且支持单页恢复,就利用单页恢复技术进行页数据恢复,如果不支持单页故障恢复,就归为媒体介质数据错误,按第三类媒体数据错误进行故障恢复。




单 页恢复也是使用日志记录机制进行恢复操作,有页版本信息,每次对页做修改也有页修改日志。根据不同时间的页备份数据和备份后的日志修改记录,进行恢复操 作,当页发生了损坏时,首先找损坏页的早期版本,主要来源是数据备份,通过recover log将备份时间到当前时间对该页的修改进行重做,从而恢复出损坏页。

                            


下图为页恢复索引所做的更新顺序:依次为:

1. 将页读进buffer缓冲;

2.在buffer池进行页数据的更新操作;

3.将页的更新操作记录在the recover log日志里;

4.将修改后的页从buffer缓冲池中写入到存储磁盘中去;

5.写the page recovery index日志记录;

6.将页内容写入到稳定有保障的存储设备中去,作为恢复版本;

7.将页正式从buffer缓冲池中摘除;

8.到此时该页已经被写在在page recovery index中了,以后可以作为恢复页的原始数据利用。




本 文主要根据《Definition, Detection, and Recovery of Single-Page Failures, a Fourth Class of Database Failures》编写,对foster B树的细节因资料有限,还不能完全理解,但作者为单页故障即时检测与最小成本的恢复提供了一种新的方案,值得借鉴,以最大程度保障数据安全。
  评论这张
 
阅读(498)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018