在SQL Server 2005上的MSN CSP示范研究
我们在SQL Server 扩展能力实验室中使用最简单的故障保险集部署了一个较小规模的MSN CSP。实验环境允许我们来进行测试,尝试不同的配置,并且建立不同的可扩展性数据指向。我们的示范实验室部署由12个客户端,3个Web服务器,2个LPS服务器,4个后端数据库服务器和一个向外扩展管理层管理服务器组成。3个Web服务器为了进行负载均衡通过一台交换机连接到网络中。所有数据库服务器的数据和日志文件都在一个EMC Clariion存储域网络中跨同样的一组磁盘存储,其中每一台服务器上面安装了两个Emulex主机总线适配器来提供I/O负载均衡和故障转移。有关硬件配置的更多细节请参阅附录A
使用额外节点的吞吐量增长
图表5显示了在我们的测试中当增加了后端服务器的数量时,为所有后端数据库服务器处理的总的查询的数量是如何按比例增长的。它说明了某些用户选择向外扩展应用程序的原因所在;他们期望使用额外的节点获得线性的扩展。这也是MSN CSP小组会在他们的用户的基数增加后把他们的应用程序增加到当前的100个后端服务器规模的一个原因,如果需要的话他们可能将其数量增加到超过100
存储子系统扩展
我们选择了在直接附加存储(DAS)之上的存储域网络存储是出于以下原因:
• 集中化的管理
• 增加的灵活性和可扩展性,原因是存储可以添加而无须添加服务器
• 当添加或者重新部署存储资源时的不间断业务操作
• 存储域网络提供的硬件级别高可用性解决方案
存储域网络存储的潜在问题包括:
• 存储域网络存储可能比DAS要昂贵很多
• 需要特殊的专门技术来管理
当添加服务器时,有可能在磁盘子系统遇到一个性能瓶颈而导致磁盘队列的增长(通过性能计数器Logical Disk/Avg. Disk sec/[Read,Write]来监视)。这是一个和没有足够的磁盘空间不一样的问题。许多存储域网络(SAN)供应商,包括EMC Clariion,支持在线的磁盘LUN扩展。作为我们测试的一部份,通过故意的限制在后端服务器上可以使用的物理spindle的数量,我们模拟了一个在EMC Clariion存储域网络上出现的磁盘子系统的性能瓶颈。
Microsoft Windows Server 2003提供了一个在线磁盘扩展功能,可以用来在LUN上连接更多的spindles而不是重建整个的条带集。EMC Clariion提供了一个通过在磁盘级别拷贝和移动数据来重建整个的条带集的功能。EMC的方法为我们的应用程序带来了几个好处:
• 在重整条带集之后数据更均匀的分布在物理spindles上;这就提供了跨整个LUN的性能改进
• 对于磁盘子系统的配置我们有了更大的灵活性,比如在保持LUNs大小的同时增加spindles的数量,这样就允许其它的数据库可以使用新的存储容量,或者在spindles上已经没有额外的空间时增加LUNs的容量而不增加spindles的数量
• 对于操作系统而言这一操作是透明的并且在基本磁盘和动态磁盘系统上执行
在我们的测试中,我们是从两个后端数据库服务器起步的,然后又添加了两个节点,为数据库文件共享了同样的一组物理spindles。在添加了两个额外的节点之后,我们将工作负载压力级别加倍。磁盘的队列长度还有磁盘的延时也随之增加;有工作负载时的性能是与I/O绑定的。图表6中的红线部份显示了一个从两个节点到四个节点的工作负载的非线性扩展。
注意:在一个真实的生产环境中,推荐在工作负载增加之前就进行LUN的扩展操作。这样就允许在添加新的向外扩展数据库服务器之前存储可以被扩展和重新分布而不会影响当前环境的性能。
对于存储域网络LUN的扩展操作EMC提供了三个优先级别。我们在测试中使用了缺省的设置(低优先级),这样会花更长的时间才能完成但操作引发的磁盘活动被降到了最低程度,因而对当前工作负载的影响也是微乎其微的。
表2列出了EMC Clariion 存储域网络在LUN扩展前后的磁盘配置。应注意的是我们增加了LUNs spindles的数量而没有增加LUN的大小。整个的过程花了44小时而没有对工作负载造成可测量的影响。当为此操作使用中等或高的优先级别时完成它所花的时间会更少一些,但是对工作负载的影响会增加。使用同样的优先级设置,操作所用时间和需要重新配置的磁盘空间是成比例的。
图表6显示了I/O瓶颈在扩展之后是如何被消除的以及工作负载性能达到的线性比例级别

将复制作为一个高可用性解决方案
正如本文之前的讨论过的那样,与向外扩展管理层相结合的复制提供了一个非常不错的高可用性解决方案。一个障碍就是在SQL Server 2000中事务复制的单线程限制,它阻碍了MSN CSP充分利用服务器的可用资源。
在SQL Server 2005中通过对并行的复制数据流的支持这个问题得到了解决。分发者可以在多个(1-64个)数据流中处理复制命令的同时保证严格的事务串行性。最佳的数据流的数量以及性能会好到什么程度取决于多个因素:
• CPU的数量。不推荐使用比CPU数量还多的数据流。我们的测试结果显示了在一个4处理器的机器上使用64个数据流的复制,与在给定的吞吐量下使用一到两个数据流的相比,明显增加了CPU的消耗
• 阻塞。如果事务在表上出现了交叠,数据流可能就会相互阻塞。由CSP的工作负载中的事务所提交的写访问请求基本上是跨很多表随机分布的,其中每一个只包含很少的几行。因此在我们的示范中,在使用不超过4个数据流的复制时没有明显的阻塞
• 剩余的CPU容量。添加更多的数据流将会增加CPU的消耗因而应当有一定的CPU余量
• 在一段给定的时间内的复制命令的数量。如果复制的队列可以适时的耗尽就不需要运行更多的数据流
图表7和8显示了在我们的测试中,当复制数据流的数量增加时复制吞吐量指标(每秒钟传递的复制命令的数量)显著的增长。每个额外的数据流增加1-2% 左右的CPU消耗
数据库管理系统维护
我们测试了以下的3个操作来证明正确的应用程序与管理设计是如何实现将对应用程序可用性的SQL Server降低到最小程度的
1. 添加一个故障转移组
2. 索引碎片整理
3. SQL Server 的主要版本升级
添加一个故障转移组
我们通过添加一个新的故障转移组到向外扩展管理层的配置文件中以及在新的机器上安装硬件设备,操作系统和SQL实例来完成这个测试。向外扩展管理层随后在新建的SQL Server实例上继续设置数据库,包括架构,存储过程,以及复制的任务。然后向外扩展管理层更新在LPS服务器上的分区映射和DDR信息来反映新近可用的分区(如图表4所示)。再后来,依据最新的DDR信息,来自于Web服务器的请求被定向到之前就已经存在的服务器以及新建的服务器上。
索引碎片整理
有着大量的插入和更新操作的数据库应用程序将会出现数据库索引文件的碎片,对于某些工作负载来说这将导致性能的下降。最终为了保持最佳的I/O性能需要进行碎片整理。有关更多索引碎片整理的最佳实践和讨论,请参阅Microsoft SQL Server 2000 Index Defragmentation Best Practices
SQL Server 2000为索引碎片整理提供了两个选择:DBCC INDEXDEFRAG 和DBCC REINDEX。当碎片的级别非常高并且使用了多个处理器时DBCC REINDEX运行的速度明显高于DBCC INDEXDEFRAG。不过,在SQL Server 2000中数据库必须脱机才能重建索引。对于SQL Server 2005,它两个命令被对应的换成了ALTER INDEX <table> REORGANIZE 和 ALTER INDEX <table> REBUILD WITH (OFFLINE)。在我们的测试实验室中使用向外扩展管理层进行的是脱机的索引重建,具体如下:
1. 将作为辅助的数据库标记为“脱机”的
2. 运行 ALTER INDEX <table> REBUILD WITH (OFFLINE) 来在辅助数据库上重建所有的索引
3. 将数据库标记为“联机”的,这样就可以继续在两个数据库间复制和同步。因为主要数据库和新还原的辅助数据库的之间的复制延时要达到目标水平10分钟左右,这一步要花上20分钟的时间。如果主要数据库出了故障,可接受的潜在事务损失是由之前讨论过的服务级别协议决定的
4. 使用降级/提升来切换两者间的角色并且在新的辅助数据库上重复步骤1-3
5. 在对原来的主要数据库完成了碎片整理之后,使用降级/提升来切换两者间的角色来返回原来的配置
在Microsoft® SQL Server™ 2005 Beta 2上,通过以下的新特性,索引可以在线的进行创建,重建或者删除的操作:在线索引操作。在进行这些索引操作的过程中,ONLINE选项允许对基表或者聚簇索引数据以及任何相关联的非聚簇索引的并发访问。在我们的测试中我们通过执行以下的SQL Server命令来在线的重建一张表的所有的索引:
ALTER INDEX ALL ON <table> REBUILD WITH (ONLINE, MAXDOP = degree of parallelism desired)
重建的索引的parallelism级数在步骤1-4都设置了。我们的服务器每个有4个CPU。我们使用了三种不同的方法对带有平均20%的逻辑扫描碎片以及常规的并发访问工作负载压力级别的55 GB的数据执行索引碎片整理。对主要数据库的工作负载的压力级别被调整到消耗52%的CPU并且事务的数量是286。对所有的表运行ALTER INDEX <table> REORGANIZE,其结果是让额外的CPU消耗被降到了最低程度而在线索引重建消耗的CPU资源是根据MAXDOP的值决定的。用高的MAXDOP值来执行在线索引重建时会对工作负载性能造成影响。离线的索引重建的速度比在线的要快得多。在线索引重建比在线ALTER INDEX <table> REORGANIZE的速度要快得多,而实际时间的计算要根据MAXDOP。在大多数情况下,对于高可用性环境而言,假定你可以容忍需要完成操作的时间长一些的话,在线索引重建要比离线索引重建更好一些。是运行在线索引重建还是在线ALTER INDEX <table> REORGANIZE主要取决于以下3个因素:
• 工作负载的压力级别。ALTER INDEX <table> REORGANIZE可以根据当前的压力级别减少资源消耗
• 执行操作的频次如何。ALTER INDEX <table> REORGANIZE需要花更长的时间才能完成
• 碎片的特征。ALTER INDEX <table> REORGANIZE在一个数据文件中留下交错的扩展盘区。ALTER INDEX <table> REORGANIZE也不能纠正索引的扩展盘区的碎片。交错出现在当一个索引的索引扩展盘区(一组8个索引页)在数据文件中不完全连续时,来自于一个或多个索引的剩下的扩展盘区在文件中掺在了一起。
SQL Server的在线升级
在任何的数据中心中升级数据库管理系统的版本都是一个有挑战性的任务。我们希望证明我们可以在不产生任何down机时间的前提下执行一个SQL Server的主要版本的升级。这种在线的滚动升级只可能在结合使用了一个象MSN CSP这样的完善的应用程序管理层后才能使用。
我们将一个故障转移组中的两台后端数据库服务器从SQL Server 2000升级到SQL Server 2005,具体操作如下所示:
1. 对后端数据库服务器运行SQL Server 最佳实践分析器(BPA)。该工具会标识出兼容性的问题并且进行纠正。你可以从微软的下载中心来下载BPA和所有相关文档,网址是
http://www.microsoft.com/downloa ... &displaylang=en . The use of BPA tool for this purpose is subject to change.
2. 将服务器1标记为脱机。在服务器1上的分区#1的主要数据库被降级而在服务器2上的分区#1的辅助数据库被提升。在服务器1上的两个数据库的复制进程都被暂停。所有的针对分区#1和#2的工作负载都被定向到服务器2上
3. 在服务器1上执行向SQL Server 2005的升级,这要花30分钟的时间
4. 在升级之后,使用向外扩展管理层管理控制台将服务器1重新联机。为了复制延时能达到10分钟的目标,这一步要花上47分钟
5. 为服务器2重复步骤2-4。所有针对分区#1和#2的工作负载被定向到服务器1
6. 提升和降级来还原主要和辅助数据库的原始分布状态,让工作负载在服务器1和2之间平衡
整个的操作在没有任何可用性损失的情况下花了3个小时完成。
结论
本文讨论了向外扩展数据库应用程序的好处与挑战。通过使用一个真实世界中的消费者应用程序,MSN通信服务平台(CSP),我们在一个示范的环境中设计了不同的场景来演示如何使用数据依赖路由来在适应数据和工作负载的增长同时提供线性的性能扩展的,如何使用SQL Server事务复制来获得高可用性以及进行在线系统维护的。我们证明了一个结论那就是SQL Server可被用来成功的管理和向外扩展一个企业级别应用程序。