RBS 补充解释

Categories: 未分类
Tags: No Tags
Comments: 1 Comment
Published on: 2009 年 11 月 09 日

在TechED09上我讲了一节关于非结构化数据存储的课程,其中里面提到了RBS,由于时间有限,有一些概念并没有讲清楚。

RBS只是一个框架,必须依赖于数据存储的Provider来工作,如果没有Provider,RBS无法存储数据。默认情况下RBS安装之后没有Provider,必须安装Provider,现在Provider其实并不多,正式发布的Provider不多,EMC有相应的Provider,微软也有一个基于Filestream的Provider,其他的Provider正在开发过程中。

我在演示中给大家看到的那个Provider,并不是微软正式发布的Provider,而是我们在项目中开发的一个Provider,这个Provider有负载均衡的功能,如果大家有这种项目可以联系微软。在MSDN上有专门关于RBS Provider的开发规范,大家只需要按照这个规范来实现就可以了。

RBS提供了公共的维护操作,可以时间GC、Delete Blob、Delete Pool等操作,客户端调用RBS类库的时候只需要执行读或写就可以了,删除的操作只需要将元数据中的记录删除就可以了,当运行公共维护程序的时候,RBS会调用GC及DeleteBlob、DeletePool来真正的删除Blob数据,这是一个异步过程,可以优化IO。

在SQL  Server 2008里的RBS是第一个版本,里面有一个很严重的问题,就是应用程序(.exe)必须直接引用RBS类库,否则无法运行,典型的应用场景就是ASP.NET应用程序无法调用RBS,这个问题在SQL 08R2的RBS中已经解决了。当然之前的那个问题也有其他的解决方案,例如文件先落地生成本地文件,利用本地文件做一个双向的缓存,或者建立一个WCF服务来访问RBS。

下面我讲讲这个Provider的设计思路。

在我们实现的Provider中主要使用了Filestream来存储数据并提供均衡功能。我们的设计中有一个数据库提供了整个存储系统的元数据管理,例如系统中包含哪些数据库,哪些Schema,每个Schema上表的存储位置,每个Schema的负载比例等。负载均衡其实就是读取当前可以写入Pool的表,然后随机数取模,随机或得一个可用的表,然后将Blob数据通过Filestream Win32API存储到这个表上。

在RBS中有一个概念叫做Pool,是存储的基本单元,在Pool内存储的就是Blob了。Pool可以与blob_store及Collection关联,blob_store与Provider关联,在使用的时候在RBS客户端可以选在将Blob存储在相应的Collection,这样就可以选则Provider了。每个Pool都有一个属性can_store_new_blobs,我们可以利用这个属性来进行很多配置,例如存档。在我们的Provider中,每个Pool都会对应存储在不同数据库中的很多表,每个表都有自己的2个文件组,一个用户存储Row Data,一个用于存储Blob数据,这样在备份的时候我们就有很多中可选择的方式。例如,每天备份Primary文件组,因为这里存储了元数据(表及文件组信息)及每天创建的文件组,这是一种滚动的增量更新的方式。当然还可以有其他的方式,例如,每天创建新的数据库并调整配置,可以将新的数据写入新的数据库等,这些方式取决于你的要求。

对于均衡,我在Demo的时候已经给大家看了,其实就是通过调整一个创建表的数量来调整的,每次修改这个值之后必须将现有的Pool can_store_new_blobs置为0,这样先一个存储请求将建立新的Pool,新的存储配置才能够生效。

另外,如果大家写程序的时候一定要注意CreatePool的这个操作。因为RBS是在客户端调用的就可能会出现多线程同时访问CreatePool的这个方法的情况。我们的解决方法是创建一个服务,将并行转为串行,只有第一个进入CreatePool服务的请求会真正创建,其他的都直接返回已经创建好的PoolId。

如果大家有什么关于RBS的问题可以直接发邮件至 sunwei@itgoldenbridge.com 或者发到微软SQL Server论坛中。

1 Comment - Leave a comment
  1. demonfox说道:

    嗯,很不错的介绍。只可惜对那些刚刚开始了解RBS的人帮助会比较有限。如果再能写几篇introductory的文章就好了。

Leave a comment


Welcome , today is 星期二, 2017 年 08 月 22 日