在SharePoint 2010系统中安装RBS FILESTREAM Provider
这两天在研究怎么写一个RBS Provider,可惜文档实在是很缺乏,基本上除了一篇Spec之外,就只有SQL产品组写的一个sample了。之后如果研究有结果,再整理成文章吧,现在先讲讲怎么直接安装并使用RBS FILESTREAM Provider。
-------------- 胡言乱语与正文的分隔线 --------------------
如果使用SharePoint 2007作为文档管理平台,它很让人诟病的一点就是,SharePoint 2007将文件本身直接存储在SQL Server数据库之中。虽然Windows SharePoint Services 3.0 SP1增加了一个External BLOB Storage(EBS)接口,但是微软并没有提供实现,而是需要开发人员自己来实现它。
SharePoint 2010仍然对EBS提供兼容,但并不推荐使用EBS,推荐的解决方案,乃是使用SQL Server 2008 Remote BLOB Storage(RBS)。
SQL RBS是一组API,通过RBS,一个SQL Server 2008数据库就不再需要将大二进制数据(BLOB)存储在数据库内部,而是可以存储到外面的某个地方,在数据库里面可能只会存储一个对外部BLOB数据的引用。SQL Server 2008和SQL Server 2008 R2都支持RBS。
听起来RBS实在是一个很好的东东。但是(总是有但是),RBS仅仅是一组API,换句话说,RBS可以让开发人员利用这组API,开发出一个RBS Provider,真正实现对BLOB数据的存取。如果没有RBS Provider,RBS自己可不会自动的将BLOB存储到某个指定的地方去。不同的RBS Provider,可以让我们将BLOB存储到文件系统、磁盘存储设备、文件服务器等等各种地方,反正不继续放到SQL Server数据库里面就对了。
在你对RBS有了初步认识之后,我们接着介绍SQL Server 2008里面的另外一个新特性:FILESTREAM。下面这句话摘自SQL Server 2008联机丛书:“通过将 varbinary(max) 二进制大型对象 (BLOB) 数据以文件形式存储在文件系统上,FILESTREAM 使 SQL Server 数据库引擎和 NTFS 文件系统成为了一个整体。”所以,FILESTREAM可以让管理员选择将SQL Server数据库里面的varbinary(max)类型BLOB数据,存储到本地NTFS文件系统上。在通过FILESTREAM对BLOB数据进行存取的时候,还能顺便能够享受到数据库事务处理的好处。
听起来,FILESTREAM和RBS很相似,是不是?但其实,RBS和FILESTREAM是两个不同的东东,它们互不依赖。RBS是一组API接口,通过这组API,应用程序就能将BLOB数据存储到数据库之外的某个地方,具体实现由开发人员创建的RBS Provider来完成。FILESTREAM是SQL Server 2008内置的一个特性,它能将原本存储在数据库里面的BLOB数据,存储到服务器本地的NTFS文件系统上。
SharePoint 2010所利用的,是RBS API,而并非FILESTREAM特性。所以,如果没有一个RBS Provider,我们并不能马上就将SharePoint 2010里面存储的文件,存储到数据库之外的某个地方去。但是,既然FILESTREAM特性已经拥有了现成的将数据库中的BLOB数据存储到NTFS文件系统上的能力,为什么不能直接使用FILESTREAM,做一个RBS FILESTREAM Provider,也就是利用FILESTREAM的功能实现的一个RBS Provider呢?这样,岂不是就能将SharePoint 2010中的文件,都存储到NTFS文件系统上了吗?
微软也想到了,所以,微软以特性包(Feature Pack)的形式,提供了一个RBS FILESTREAM Provider。你可以从这里下载x64版本的RBS FILESTREAM Provider。但是要在SharePoint 2010系统上安装并使用它,也是需要按照一定的步骤来操作的。下面就是具体的操作步骤。
1、确定SQL Server 2008已经启用了FILESTREAM
在安装SQL Server 2008时,会有一个步骤提示是否安装FILESTREAM。如果你不确定是否安装了此特性,从SQL Server 2008服务器上打开SQL Server配置管理器,从左边选中"SQL Server 服务",然后从右边的窗格中用鼠标右键点击运行的SQL Server实例,选择"属性"菜单项。
在打开的属性窗口中,选择"FILESTREAM"选项卡,然后选中启用FILESTREAM的选择框,点击"确定"按钮。
打开SQL Server Management Studio,选中左侧的SQL Server实例,然后点击工具栏区域的"新建查询",打开一个查询界面,然后在里面输入下面的SQL语句并执行。
EXEC sp_configure filestream_access_level, 2 RECONFIGURE
2、确定要应用RBS FILESTREAM Provider的内容数据库
由于RBS是基于数据库为单元来启用的,所以你可以选择在哪些SharePoint内容数据库上启用RBS。这意味着,对于SharePoint服务器场里面那些存储文件数量并不多的内容数据库,可能并没有必要为它启用RBS,而那些可能会存储大量文件的内容数据库,则可以启用RBS,有效的优化它们。
SharePoint 2010系统中,内容数据库与网站的关系是:
● 一个Web应用程序可以使用一个或多个内容数据库; ● 在新建Web应用程序时,会为其自动创建一个内容数据库,管理员可以稍后为此Web应用程序创建更多的内容数据库; ● 在Web应用程序中创建一个网站集时,这个网站集会被存储到Web应用程序的某个内容数据库中; ● 一个网站集(包括其所包含的首要网站和所有子网站),只能被存储在一个内容数据库中,而不能被分拆存储到多个内容数据库中。
管理员可以打开SharePoint 2010管理中心的内容数据库管理界面,查看每个Web应用程序所使用的内容数据库,或是为某个Web应用程序添加新的内容数据库。
在下面的示范操作中,我们就为上图中所示的这个名为"WSS_Content"的内容数据库,启用RBS。
3、配置内容数据库
在确定了要启用RBS的内容数据库之后,打开SQL Server 2008 Management Studio,找到这个内容数据库,用鼠标右键点击并选择"新建查询"菜单项。
在打开的查询窗口中,输入下面这些SQL语句并执行。
use [WSS_Content] if not exists (select * from sys.symmetric_keys where name = N'##MS_DatabaseMasterKey##') create master key encryption by password = N'Admin Key Password !2#4'
use [WSS_Content] if not exists (select groupname from sysfilegroups where groupname=N'RBSFilestreamProvider') alter database [WSS_Content] add filegroup RBSFilestreamProvider contains filestream
use [WSS_Content] alter database [WSS_Content] add file (name = RBSFilestreamFile, filename = 'c:blobstore') to filegroup RBSFilestreamProvider
在上面这些SQL指令中,标记为绿色的,是你在复制了这些指令后,需要按照你的环境中的实际情况,需要修改的部分。"WSS_Content"需要修改为你要启用RBS的内容数据库的实际名称。"c:blobstore"要修改成你希望用来存放BLOB文件的文件夹路径。从实践角度出发,你需要选择一个位于非系统分区、剩余空间大、速度快、稳定可靠的文件夹。注意,这个文件夹只能是一个本地路径,而不能是网络路径,因为FILESTREAM不支持远程NTFS文件夹。另外,这个文件夹也不要事先建立好,上面的SQL指令会自动帮你将这个文件夹创建出来。
上述SQL语句执行完毕之后,可以打开资源管理器,确认在SQL Server服务器上,相应的文件夹已经创建成功。
4、安装RBS FILESTREAM Provider
将下载到的RBS_x64.msi文件复制到SharePoint服务器场中的每一台服务器上,所有的SQL Server数据库服务器和SharePoint服务器上都必须安装此RBS Provider。
先在SQL Server数据库上和SharePoint服务器上(如果服务器场中有多台SharePoint服务器,则在一台Web前端服务器上),安装RBS FILESTREAM Provider,安装步骤如下。
以管理员身份运行命令提示符。
在命令提示符窗口中,使用"cd"指令将当前路径设置为"RBS_x64.msi"所在的文件夹,然后输入下面这行指令并执行:
msiexec /qn /lvx* rbs_install_log.txt /i RBS_X64.msi TRUSTSERVERCERTIFICATE=true FILEGROUP=PRIMARY DBNAME="WSS_Content" DBINSTANCE="sp2010" FILESTREAMFILEGROUP=RBSFilestreamProvider FILESTREAMSTORENAME=FilestreamProvider_1
上面指令中用绿色标注的部分,是需要按照你的环境中的实际情况进行修改的部分。"WSS_Content"需要修改为需要启用RBS的内容数据库,"sp2010"需要修改为实际的SQL Server 2008实例名称(如果在安装SQL Server 2008时,你没有使用默认实例名称,那么它的值可能类似"sp2010express"这样的格式)。对每个内容数据库,都只应该使用msiexec.exe执行一次这条指令。
在你敲入了上面这行很长的指令并敲下回车之后,命令提示符窗口看起来会立即执行完成,但实际上,后台会继续执行RBS Provider的安装程序。你可以打开Windows任务管理器,应该会看到有好几个msiexec.exe进程在执行中。过上一会儿,任务管理器中就不会再显示有几个msiexec.exe在运行(在我的环境中仍会剩下一个另外的msiexec.exe进程),这表明RBS Provider安装过程已经完成。
在RBS Provider安装过程中,它会将log信息写入与"RBS_x64.msi"安装文件同目录的"rbs_install_log.exe"文件。从资源管理器中打开这个log文件,搜索其中是否有如下"Installation completed successfully"之类的信息,这些信息表示"RBS_x64.msi"的安装是成功的。
如果在你的SharePoint服务器场中,只有一台SharePoint服务器,那么按照上面的描述,在它上面安装完RBS FILESTRREAM Provider就完事了。但是如果服务器场中存在多台SharePoint服务器,那么就需要继续在其他的Web前端服务器和应用服务器上,安装RBS FILESTREAM Provider,不过,命令提示符里面的指令需要换成:
msiexec /qn /lvx* rbs_install_log.txt /i RBS_X64.msi DBNAME="WSS_Content" DBINSTANCE="sp2010" ADDLOCAL="Client,Docs,Maintainer,ServerScript,FilestreamClient,FilestreamServer"
在RBS FILESTREAM Provider安装到所有服务器上之后,打开SQL Server 2008 Management Studio,刷新内容数据库的Table列表,应该会看到多出来许多名称以"mssqlrbs"开头的,与RBS有关的Table。如果在查询窗口中执行下面的SQL语句,也应该能查询出一些结果。
select * from dbo.sysobjects where name like 'rbs%'
如果在内容数据库中并没有上面这些Table,运行上面的SQL语句也查询不出任何结果,那么表明RBS Provider并没有正确安装到内容数据库上。如果真是这样,在每台服务器上,打开资源管理器,双击"RBS_x64.msi",然后在出现的安装界面中,使用"卸载"选项先将RBS Provider卸载掉,然后再按照上面的步骤,重新在命令提示符窗口中尝试安装它。
5、为内容数据库启用RBS FILESTREAM Provider
终于到了最后一个步骤。在SharePoint服务器上,打开SharePoint 2010 Management Shell,这是一个基于Windows Powershell的命令行管理工具。
在SharePoint 2010 Management Shell中,依次执行下面的指令:
(1) $cdb = Get-SPContentDatabase "WSS_Content" 获取到指定的内容数据库(SPContentDatabase)对象实例,绿色所标注的"WSS_Content"需要更换成在你的环境中,实际的内容数据库名称。
(2) $rbss = $cdb.RemoteBlobStorageSettings 获取内容数据库的RBS设置(SPRemoteBlobStorageSettings)对象实例。
(3) $rbss.Installed() 检查在内容数据库上是否安装了RBS,如果需要,更新相应的属性值。
(4) $rbss.Enable() 在内容数据库上启用RBS。
(5) $pvdName = $rbss.GetProviderNames()[0] 获取第一个注册到内容数据库上的RBS Provider的名称。
(6) $rbss.SetActiveProviderName($pvdName) 为内容数据库设置要激活的RBS Provider。
然后,你可以执行"$rbss"来查看它的一些属性值,如果设置正确,它输出的内容应该如上图所示。
如果你启用RBS FILESTREAM Provider的内容数据库中,已经存储了一个网站集,那么在你启用了RBS Provider之后,网站集里面的文档,并不会自动的马上通过FILESTREAM,转存到NTFS文件系统上。只有新增的文档才会被存储到NTFS文件系统上,网站集里面之前上载的文档,仍然会保存在内容数据库里面。如果你希望现在将那些旧的文档,统统转存到我们所指定的NTFS文件系统中,那么可以继续在SharePoint 2010 Management Shell中执行下面这个指令:
(7) $rbss.Migrate()
如果你希望设置一个文档大小阈值,只有大小超过此阈值的文档,才通过RBS FILESTREAM Provider存储到NTFS文件系统上,而小于此阈值的文档,仍然存储在内容数据库中,那么可以在SharePoint 2010 Management Shell中继续执行下面的指令(假设阈值是1048000字节,也就是1M):
(8) $rbss.MinimumBlobStorageSize = 1048000 (9) $rbss.Update()
上面的这些指令,都是针对一个内容数据库的。如果你有多个内容数据库要启用RBS,那么就对每个内容数据库都执行一遍上述指令。
6、检查最终效果
在完成了上述所有操作步骤之后,在SharePoint网站中上载一些文档,然后检查你所设定的NTFS文件夹,里面应该会包含有一些子文件夹,存储着这些文档。