SQL Server 2012中HADR读写均衡功能需要注意的一些小细节

Categories: Data Access, Denali, SQL
Tags: No Tags
Comments: No Comments
Published on: 2012 年 02 月 16 日

有时很久没上来写东西了,过年前都是开会,然后过年,回来之后继续开会,最近还好终于开始写代码了。

SQL Server 2012就要发布了,里面太多新功能,尤其是BI方面的功能,要不是这样微软也不会单独提供一个BI的版本。在数据管理上,SQL Server 2012里面提供了一个HADR的解决方案,将之前的很多技术集中整合到一个功能里,降低了高可用的实施的成本及实现方案的复杂性,当然功劳也不全是SQL Server的,Windows的贡献也很大,毕竟HADR是要基于Windows Cluster的,而且多站点群集也非常的实用。

这里我要说的是HADR中一个很重要的功能和参数,就是对于数据库负载均衡的功能。SQL Server一直以来都没有这种在数据库级的负载均衡功能,但是在SQL 2012里面可一看到一部分这样的实现。在HADR中,有一个Primary的副本可以用于应用程序对于数据库的读写操作,其他的一些副本可以设置为接受只读操作。所有对于只读数据库内表的非只读操作都会被拒绝。对于应用来说提供一个只读副本就可以将一些查询和报表的查询放到只读副本上,虽然说起来容易,做起来可就是还需要考虑一些其他的了。因为HADR中的任何副本都有可能称为Primary副本,尤其是可以自动切换的副本,我们需要让应用程序知道哪个是只读副本,哪个是读写副本,这样才不会把查询发错了方向。在HADR中,可以提供一个虚拟名称VNN,通过虚拟名称连击过去的肯定是读写副本,当发生故障转移的时候,这个名称也会随着数据库的转移移动到响应的服务器上,这样我们就可以确定读写副本的地址。对于只读副本来说,SQL Server 2012的Native Client中提供了一个新的连接字符串参数ApplicationIntent,把这个参数设置为READONLY就可以声明,当前的这个应用是只读的,当然这个只是程序的声明,你必须保证程序里面只会发出只读的查询。只要把这个参数设置好,同时在HADR的数据库上设置好只读数据库路由列表,当带有ApplicationIntent=READONLY的连接发到VNN的时候,SQL Server 2012会自动将指引连接到配置好的只读副本上,这样应用中的读、写负载就可以分开。同时当发生故障转移的时候,还可以保证这个操作是分开的,如果没有只读路由列表,这个功能实现将相当的复杂。

通过一些测试,我还发现HADR对于连接池需要一些特殊注意的地方。当Primary副本发生故障的时候对于读写操作的连接池将被Clear,毕竟连接的物理服务器已经无法进行读写操作的连接。但是对于READONLY的连接来说,这就是一个问题了,因为连接池里缓存的连接并没有失效,执行只读操作的Secondry副本依然可以工作,对于连接池来说连接就不会被Clear,这样就可能出现读写/只读操作都在一台机器上执行的情况。对于这种情况来说需要实用连接字符中Connection Lifetime或者Load Balance Timeout关键字,当一个连接被Close之后Pool将对比当前时间及该连接的创建时间,如果大于该参数,将把该连接抛出连接池,否则还放到连接池里面。通过适当设置这个参数就可以解决问题,对于一些性能敏感的应用来说尤其重要。

这些功能需要SQL Server Native Client支持,如果你的程序是用ADO.NET你还需要 KB2544514

 

SQL Server 2012 FileTable is so cool

Categories: Denali, SQL
Tags: No Tags
Comments: No Comments
Published on: 2011 年 12 月 07 日

之前的版本里面SQL Server已经可以支持Filestream的功能,通过Win32 API或TSQL来访问存储在文件系统中的BLOB数据,但是最大的问题来自于与遗留应用程序的兼容性无法解决,如果相提高性能必须通过TSQL先获取文件的handle然后用API访问文件,很多程序使用了Copy等Windows命令或类似于.net framework File类的方式来处理,这样一来好的功能也无法广泛的使用。在SQL Server 2012中提供了一个FileTable的功能,通过文件驱动的方式模拟了一个共享目录,用户的应用程序可以通过文件API直接对有SQL Server管理的Blob进行操作,这样一来与遗留程序的兼容性就可以解决了。但是目前的产品里面也不是非常的完美,主要就是FileTable的列是固定的,无法根据用户的需求进行自定义,同事对于文件夹的深度也有限制,这些小问题在一些特殊的情况下还需要进行一些定制的操作,但是有了通过文件系统的访问方式已经很不错了,至少简单的通过数据库对文件系统进行管理的基本功能已经有了,剩下的额外功能倒是可以有ISV定制开发了。

SQL Denali-FileTable

Categories: Denali, SQL
Comments: No Comments
Published on: 2011 年 05 月 02 日

Filetable是一个很有意思的一个功能。很久很久以前微软曾经想把Windows的文件系统放到SQL里面来管,这样就能将结构化和非结构化的数据整合在一个平台来管理,而且可以嵌入在Windows的内部来实现。在Windows Vista年代曾经有一个叫WinFS的原型,当然最后这个东西还是没有最终Release。在SQL Server 2008里面微软还是希望将数据的应用(包括非结构化数据)整合到数据库里面,毕竟之前已经做了Text和Image数据类型,而且在SQL 2005里面也有了Max的数据类型,基本上可以说快要准备好了,所以在SQL 2008里面提供了一个新的数据类型叫Filestream,这个数据类型就不多说了,没听过的就去Bing一下吧。我在这个SQL 2008里面也针对Filestream做了一个项目,利用了RBS的框架写了一套具有负载均衡的RBS Provider,可以通过RBS为客户提供统一的数据访问接口,后面接上我的Provider就可以在SQL中管理Blob数据,当然数据是海量的,设计容量就要20TB。但是当时也觉得会有一些问题,其中最主要的还是在接口上。Filestream提供了Win32和TSQL这2中接口,但是对于应用程序来说必须针对Win32接口做特殊的处理,因为Win32接口处理文件的时候必须要先提供一个句柄,而这个句柄必须通过Filestream的特殊函数才可以获取,总之对于应用程序来说不是很友好。虽然可以通过RBS来进行扩展和包装,但是对于遗留应用来说除了重新写接口代码别无选择。

在Denali中(CTP2)里面,我终于看到了这个FileTable。FileTable是一种特殊的表,这个表有固定的列和索引,这个表的结构是不能修改的。其中存储了文件的基本信息和内容,当然内容列肯定是Filestream。和之前最大的变化是Denali在驱动层做了一些修改,将FileTable转换成一个通用的UNC路径,也就是说我们可以通过Windows Explorer来直接访问数据库里的这个表。这样一来对于现有的遗留应用程序来说就好多了,可以在不改变应用的前提下直接使用Filestream的特性,就像访问远程的共享目录一样,而文件的管理和备份直接在SQL里面完成,与应用程序数据也能完美的结合。

在FileTable上最适合的应用就是扩展的一些文件搜索应用了,例如Lucene。如果你觉得SQL的FTS不够强大(确实差一些,尤其是中文),就可以通过Lucene直接去读取FileTable,而且不需要在写特殊的代码,只需要配上分词就可以了。在SharePoint  2010里面已经提供了一个Filestream的RBS Provider,通过这个Provider可以将SharePoint的Blob数据写到数据库里面去(存储在文件系统上),只不过原始的Filestream对于应用来说是一个噩梦,用FileTable吧,改改配置文件就够了。

另外还要说一下,FileTable毕竟还是数据库,不是NTFS文件系统(你可以把它看成一个FAT32),一些NTFS支持的加密及压缩属性还是不支持的,至少是在文件系统的驱动上不支持。还有就是负载均衡,目前还有相应的解决方案,当然这个是可以进行二次开发的,如果我把之前的那个Provider改改就行了,且也非常简单。

page 1 of 1


Warning: Creating default object from empty value in /var/www/html/wp-includes/comment-template.php on line 1056

Warning: Creating default object from empty value in /var/www/html/wp-includes/comment-template.php on line 1056

Warning: Creating default object from empty value in /var/www/html/wp-includes/comment-template.php on line 1056

Warning: Creating default object from empty value in /var/www/html/wp-includes/comment-template.php on line 1056

Warning: Creating default object from empty value in /var/www/html/wp-includes/comment-template.php on line 1056
近期评论

Welcome , today is 星期五, 2017 年 10 月 20 日