当前位置: 首页 > news >正文

在SQL Server 2008上实现资源的负载均衡

摘要:

SQL Server 2008引入的资源调控器功能,它为我们在一定程度上控制数据库系统资源提供了便利。本文将谈谈通过配置 ServerSecurity/Database/'> SQL Server2008引入的“资源调控器”功能,它为我们在一定程度上控制数据库系统资源提供了便利。本文将谈谈通过配置 ServerSecurity/Database/'> SQL Server2008的“资源调控器”以实现负载均衡。

  1、为什么引入“资源调控器”?

  在ServerSecurity/Database/'>SQLServer2008之前,数据库引擎曾尝试为所有并发用户提供均衡的性能,这使我们几乎无法控制分配给用户或工作负载的优先级,而且随着并发登录的增加会雪上加霜。 “资源调控器”有助于防止性能问题,并识别正在使用的应用程序。“资源调控器”可以控制分配给会话的CPU和内存,并进一步设置应用程序能够使用的最大和 最小的CPU百分比和内存,以及允许的最大并行度。尽管资源调控器目前还有一些不足之处,但它对于处理许多常见的资源问题已经足够了。

在SQL Server 2008上实现资源的负载均衡

  2、创建“资源池”

  配置“资源调控器”是从创建“资源池”开始的。在ServerSecurity/Database/'>SQLServer2008中使用CREATE RESOURCE pool命令来创建资源池,从而通过它来分配会话,并设置其占用系统资源的最大和最小百分比。

  比如使用下面命令以根据CPU百分比限制来创建3个资源池:


CREATERESOURCEpoolLowPriorityAppspoolWITH(MAX_CPU_PERCENT=20);
CREATERESOURCEpoolMediumPriorityAppspoolWITH(MAX_CPU_PERCENT=60);
CREATERESOURCEpoolHighPriorityAppspoolWITH(MAX_CPU_PERCENT=100);

 在SQL Server 2008上实现资源的负载均衡

  这些命令中使用的CPU百分比不是硬性限制。例如,如果操作系统上只有一个低优先级应用程序在运行,那么它将能够使用整个CPU。基于CPU百分比的资源调控只有在并行需求重叠时才会发挥作用。

  另外,在“资源调控器”中,最多可以建立2O个资源池,其中18个可以进行配置。在另外两个资源池中,一个分配给内部进程,如清理类操作;另一个供没有分配给其它池的会话使用的默认池。因此,不应过早创建太多资源池,应该谨慎考虑哪些池是必要的。
3、创建工作负载组

  对现有资源进行分组以后,我们需要创建创建工作负载组以实现对分配给这些资源池的应用程序分组。在ServerSecurity/Database/'>SQLServer2008中使用CREATE WORKLOAD GROUP命令创建工作负载组。

  下面列举几个CREATE WORKLOAD GROUP命令应用实例:


CREATEWORKLOADGROUP
UnidentnifiedApplications
USINGLowPriorityAppspool;

  CREATEWORKLOADGROUP
WellBehavedAccessApplications
USINGMediumPriorityAppspool;

  CREATEWORKLOADGROUP
PoorlyBehavedAccessApplications
USINGLowPriorityAppspool;

  CREATEWORKLOADGROUP
WellBehavedExcelApplications
USINGMediumPriorityAppspool;

  CREATEWORKLOADGROUP
CriticalCorporateApplications
USINGHighPriorityAppspool;

在SQL Server 2008上实现资源的负载均衡

  上面实例我们创建了5个工作负载组,它们被分配给3个资源池。Access和Excel应用程序被分配给不同的资源池,这样,我们可以在未来根据一个资源池对分配给另一个资源池的资源进行更改。为性能较差的Access应用程序和无法识别的其它应用程序分配较少的资源。我们为已经识别的对工作至关重要的应用程分配具有最高的资源分配的优先级。

4、查看“资源调控器”配置

  创建了工作负载组并将其分配给资源池以后,它们不会立即开始工作。要确定还需要进行什么配置才能使“资源调控器”正常运行,可以查看当前的“资源调控器”配置,这些信息在一个新的动态管理视图中显示。

  (1).查看“资源调控器”配置信息

  执行命令:

  SELECT*FROMsys.dm_resource_governor_configuration;

在SQL Server 2008上实现资源的负载均衡

  命令执行完毕就会输出“资源调控器”的配置信息。需要注意的是:此输出信息是在ServerSecurity/Database/'>SQLServerManagement Studio(SSMS)的Results选项卡中显示的。最左边一列显示的值1是输出的行号。

  此输出信息告诉我们两个信息:

  第一、is_reconfiguration_pending标记表示在你所做的更改生效之前,需要执行命令:ALTER RESOURCE GOVERNOR RECONFIGURE。运行这条命令之后,is_reconfiguration_pending的值就变成0。

  第二、classifier_function_id的值为0,表示没有分配分类器函数。分类器函数用于决定一个会话应该放在哪个工作负载组中。

  (2).查看资源池配置信息

  执行下面的命令来查看资源池配置:


SELECT*FROMsys.dm_resource_governor_resource_pools;

在SQL Server 2008上实现资源的负载均衡

  命令执行完毕后会看到资源池的相关信息。需要注意的是:,在执行重新配置命令之前,这个输出信息中只显示内部资源池和默认资源池。

  可以使用下面这个命令查看工作负载池配置:


SELECT*FROMsys.dm_resource_governor_workload_groups;

在SQL Server 2008上实现资源的负载均衡
5、应用程序实现分类

  配置“资源调控器”的最后一步是确定想要控制的会话。这可以利用分类器函数来实现,分类器将会话分配给特定的工作负载组。

  (1).应用APP_NAME()函数分类

  分类器函数必须返回一个SYSNAME类型的值,这个值当前是NVARCHAR(128)的别称。对于本文来说,我们根据应用程序名称函数 (APP_NAME())来决定会话应该归入哪一个工作负载组,这个函数返回应用程序的连接字符串中指定的值。笔者特别喜欢选择这个选项,因为它支持对正 在运行的应用程序进行分类,在对会话进行分类时还有其它几个选项可供选择我们后面再说。

  构建应用程序时通常不会在连接字符串中指定应用程序名称,但把应用程序名称添加到连接字符串或在应用程序配置文件中指定该值是很重要的。这种方法在“资源调控器”之外也很有用,因为应用程序名称会出现在ServerSecurity/Database/'>SQLServerProfiler创建的跟踪记录中,能够用来筛选跟踪记录中的事件。通过连接字符串访问应用程序名称也有助于在隔离与应用程序相关的问题时跟踪对ServerSecurity/Database/'>SQLServer的访问。不过,有些设计不太好的应用程序具有硬编码的连接字符串,这时它们不适合使用这种方法。硬编码连接字符串是一种应该避免的做法。

  在使用中笔者还发现,按名称对应用程序进行分类是识别连接服务器的未知应用程序的一个好的起点。在这种情况下,“资源调控器”的好处在于,未知应用程序将被放在低优先级的资源池里,随后我们能够快速识别正在使用的应用程序。这项功能可帮助你确定谁正在使用你的系统。

  (2).其他分类函数和属性

除了使用APP_NAME()函数可进行会话分类外,也可以使用许多其它函数来实现,比如HOST_NAME()、SUSER_NAME()、SUSER_SNAME()、IS_SRVROLEMEMBER()和IS_MEMBER()。

  如果决定使用HOST_NAME()或APP_NAME()作为分级器函数,一定要注意用户可能更改这些函数。不过在实际中,笔者发现APP_NAME()很好用。

  此外,在决定如何分类时,还可以使用一些属性。L0GINPROPERTY()函数现在包含两个可在分类函数中使用的属性 (DefaultDatabase和DefauItLanguage)。而且L0GINPROPERTY()函数提供了对连接所用网络协议的访问,还支持 访问验证方案、本地IP地址、TCP端口和客户端IP地址。ORIGINAL_DB_NAME()函数也很有用,因为它可以返回会话在首次连接时提供的数 据库名称,而不是默认数据库。这些属性支持基于任何这类值进行分类。例如,可以基于用户通常使用的数据库把连接分配给工作负载组。

  (3).分类前必要的测试

  在使用分类器函数之前对其进行测试是很重要的,否则系统可能无响应。例如,可以在SSMS中执行以下命令来测试APP_NAME()分类器函数:


SELECTAPP_NAME();

  因为分类器函数无法识别SSMS,因此执行命令:


SELECTdbo.UserClassifier();

在SQL Server 2008上实现资源的负载均衡

  如果不修改分类器函数而直接启用它,SSMS将在低优先级应用程序资源池中运行。也可以使用分类器函数在数据库表中查找工作负载组名称,而不是 将所有应用程序名称硬编码到该函数中。通常,在访问数据库表来查找工作负载组时,性能不会受到太大影响,因为数据库表不会很大,能够被快速缓存,并且只有 在建立连接之后才能使用该函数制定分类决策。
现在可以使用以下命令实现分类器函数:


ALTERRESOURCEGOVERNOR
WITH(CLASSIFIER_FUNCTION=dbo.UserCIassifier);

  然后必须重新配置“资源调控器”,使挂起的配置生效。这可以使用以下命令来完成:


ALTERRESOURCEGOVERNORRECONFIGURE;

在SQL Server 2008上实现资源的负载均衡

  至此,“资源调控器”配置就完成了。然后需要确保“资源调控器”能够按预期工作。如果未对分类器函数进行良好的测试,系统可能不会响应新的登录操作,可能需要使用专用管理员连接(DAC)来获取对ServerSecurity/Database/'>SQLServer的访问。如果还没有配置DAC,可以以单用户模式重启服务器。在以单用户模式运行时,连接不会受到“资源调控器”约束,因此可以禁用资源调控器,直到问题修复。

  (4).改变分类器函数的注意事项

  如果需要改变分类器函数,必须首先禁用“资源调控器”,因为无法在“资源调控器”正在运行时对其进行更改。可以运行以下命令来禁用当前的分类器函数:


ALTERRESOURCEGOVERNOR
WITH(CLASSIFIER_FUNCTION=NULL);

在SQL Server 2008上实现资源的负载均衡

  需要注意的是:“资源调控器”更改应该由组织中最资深的DBA(数据库管理员)来执行,以免由于错误配置“资源调控器”而引起问题。

  6、监控和配置资源的其它技术

  除了“资源调控器”,我们也可以通过系统监控(perfmon exe)工具来监控ServerSecurity/Database/'>SQLServer分配的CPU资源。当添加想要监控的计数器时,ServerSecurity/Database/'>SQLServer:Resource pool Stats对象会显示已配置的每个资源池的实例。

  一些类似的与实例相关的选择已被添加到ServerSecurity/Database/'>SQLServer:Workload Group Stats计数器,相关的值也可通过查询sys.dm_os_performance_counters视图获得。

  为了进行更仔细的监控,ServerSecurity/Database/'>SQLServer中还添加了其它一些事件,包括CPU Threshold Exceeded、PreConnectStarting和PreConnect:Completed事件。如果想要使用.NET代码以编程方式控制“资源调控器”,可以使用已经添加到ServerSecurity/Database/'>SQLServerManagement Objects(SMO)中的ResourceGovernor类。

  通常情况下,我们比较关注配置资源池时最大的CPU百分比,因为必须非常谨慎地配置最小百分比。如果将最小值配置得太高,很容易过度限制系统的资源利用率,尤其是内存的最小百分比不宜过高。

  总结:

  需要说明的是,我们并不能利用“资源调控器”及时降低刚发现的严重影响系统性能的查询的优先级,因为在连接 会话时,工作负载组和资源池就已经分配完成。所以,在配置“资源调控器”前做好统筹安排是非常必要的。虽然“资源调控器”并不是尽善尽美,但对于DBA任 不失为一个实现资源的负载均衡的利器。

相关文章:

  • 【转】angular基本概念的认识与实战
  • SQL Server中未公布的扩展存储过程
  • 利用jQuery中live为动态生成Dom添加datepicker效果
  • ABAP clear,refresh,free清空内表的区别
  • 作为软件开发人员应该知道的最基本的东西
  • 让IE6、IE7、IE8、IE9、IE10、IE11支持Bootstrap的解决方法
  • 虚拟服务器负载均衡实现方法
  • 架构重构改善既有代码的设计
  • 详解SQL Server中创建数据仓库已分区表
  • SQL server故障转移和负载均衡
  • [LeetCode]284. Peeking Iterator(C++,类,暴力)
  • SQL Server——海量数据库的查询优化及分页算法方案
  • 什么样的代码才是好代码
  • prototype 常用方法
  • 构建高质量的C#代码
  • [译]Python中的类属性与实例属性的区别
  • 【Leetcode】104. 二叉树的最大深度
  • AWS实战 - 利用IAM对S3做访问控制
  • C++类的相互关联
  • canvas 高仿 Apple Watch 表盘
  • DataBase in Android
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • Effective Java 笔记(一)
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • exports和module.exports
  • JavaScript 一些 DOM 的知识点
  • js中forEach回调同异步问题
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • mongodb--安装和初步使用教程
  • Twitter赢在开放,三年创造奇迹
  • 机器学习中为什么要做归一化normalization
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 爬虫模拟登陆 SegmentFault
  • 如何在 Tornado 中实现 Middleware
  • 微信公众号开发小记——5.python微信红包
  • 一份游戏开发学习路线
  • 在Unity中实现一个简单的消息管理器
  • Linux权限管理(week1_day5)--技术流ken
  • #《AI中文版》V3 第 1 章 概述
  • #14vue3生成表单并跳转到外部地址的方式
  • #stm32驱动外设模块总结w5500模块
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (c语言)strcpy函数用法
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (一)基于IDEA的JAVA基础12
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • *2 echo、printf、mkdir命令的应用
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .jks文件(JAVA KeyStore)
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .net framework 4.0中如何 输出 form 的name属性。
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .net 反编译_.net反编译的相关问题