浅谈数据库资源使用的按需分配方法

简介: 如果有5个业务都很繁忙的数据库需要部署在一台服务器上,为了避免相互的资源抢占,我们通常会在服务器上安装5个SQL Server实例来分别承载这5个数据库,然后分别设置每个实例的最大和最小内存、CPU掩码等,用以s控制这5个业务数据库的资源分配。

SQL Server资源调节器的作用

如果有5个业务都很繁忙的数据库需要部署在一台服务器上,为了避免相互的资源抢占,我们通常会在服务器上安装5个SQL Server实例来分别承载这5个数据库,然后分别设置每个实例的最大和最小内存、CPU掩码等,用以s控制这5个业务数据库的资源分配。

笔者的公司曾经就有这样的案例。这种方式的缺点显而易见:首先是授权,在上述例子中,5个SQL Server实例的费用应该是比1个要高;其次是管理成本提高,DBA不得不安装和维护5个实例。那么,有没有更好的方法呢?

其实从SQL Server2008(企业版)开始,微软就已经考虑过这种情况,并提出解决方案——“SQL Server的资源调节器”。SQL Server的资源调节器引入了一种多租户的理念,它将一个SQL Server实例的资源“出租”给不同的客户端负载,每个客户端负载所分配到的资源彼此隔离,互不影响。

下面我们看看SQL Server的资源调节器的原理和一个实例的来了解下SQL Server的资源调节器:

 

SQL Server的资源调节器的原理

在SQL Server的资源调节器有三个重要的概念:

1. 资源池

在上文多租户的理念中,不同的客户端负载之所以能够分配彼此隔离的资源,其原因就是他们拥有各自独立的资源池。

在资源池里面,DBA可以设置最大、最小内存和CPU资源,也就是说,资源池实际上就是内存和CPU资源的集合,DBA根据业务的需要,可以为重要业务设置较大的资源池,而SLA较低的业务设置小的资源池。

2. 工作组的负载

工作组负载是一些具有共同特征的客户端请求的集合。SQL Server将客户端请求按照一定的规则分类后,形成多个工作组负载。

工作组负载是资源池利用的主体。将不同的资源池绑定到不同的工作组负载,从而实现了各个工作组负载的资源隔离。

3. 分类器

分类器提供一套划分工作组负载的规则,在此规则基础上,SQL Server将客户端的请求进行分类形成多个工作组。

举个例子:把SQL Server的用户名作为一个分类器,来自A用户的所有请求划分到工作组负载1,来自B用户的所有请求划分到工作组负载2。然后工作组负载1和2分别对应不同的资源池。

原理图如下:

clip_image002

 

用资源调节器来分配两个数据库的CPU资源

假设有市场和销售两个部门,各自使用不同的数据库,但两个数据库在同一个SQL Server实例上,为了确保两个部门的数据库彼此不受对方资源使用的影响,我们使用SQL Server的资源调控器来控制两个数据库的资源使用。

1. 创建测试数据库

create database Sales

create database Marketing

 

2. 配置CPU环境

为了更好的查看CPU资源的争用情况,我们先设置SQL Server的CPU affinity mask,使SQL Server只能使用一个逻辑核心,所有的工作组负载共享同一个CPU核心资源。

sp_configure 'show advanced', 1

GO

RECONFIGURE

GO

sp_configure 'affinity mask', 1

GO

RECONFIGURE

GO

 

3. 配置资源调控器

1) 创建资源池

CREATE RESOURCE POOL SalesPool

CREATE RESOURCE POOL MarketingPool

2) 创建工作组负载

--创建SalesGroup的工作组,并绑定到SalesPool

CREATE WORKLOAD GROUP SalesGroup

USING SalesPool

--创建MarketingGroup的工作组,并绑定到MarketingPool

CREATE WORKLOAD GROUP MarketingGroup

USING MarketingPool

GO

3) 创建分类器(分类函数)

--创建自定义的二分类函数,按照客户端连接字符串中的数据库分类并返回数据库的名字

CREATE FUNCTION CLASSIFIER_DbName()

RETURNS SYSNAME WITH SCHEMABINDING

BEGIN

DECLARE @val varchar(32)

SET @val = 'default';

IF 'Sales' = ORIGINAL_DB_NAME()

SET @val = 'SalesGroup';

ELSE IF 'Marketing' = ORIGINAL_DB_NAME()

SET @val = 'MarketingGroup';

RETURN @val;

END

GO

--将分类函数绑定到资源调节器中

ALTER RESOURCE GOVERNOR

WITH (CLASSIFIER_FUNCTION = dbo.CLASSIFIER_DbName)

GO

4) 启用资源调控器

ALTER RESOURCE GOVERNOR RECONFIGURE

GO

 

4. 测试sales数据库的负载

Ø 创建如下测试SQL语句,并保存到workload.sql文件中

SET NOCOUNT ON

DECLARE @i INT

DECLARE @s VARCHAR(100)

SET @i = 100000000

WHILE @i > 0

BEGIN

SELECT @s = @@version;

SET @i = @i - 1;

END

Ø 以管理员身份运行cmd

Ø 然后以sqlcmd的方式加载workload.sql语句

sqlcmd -S localhost\sql2014 -U sa -P 95938 -d Sales –I "d:\workload.sql"

这条语句的意思是在sales数据库中执行workload.sql,

clip_image004

Ø 打开性能计数器

SQLServer:Resource Pool Stats->CPU usage

clip_image006

可以看到salespool的CPU资源占用情况如下图:

下图中,salespool CPU资源的使用率为25%,(相当于完全使用了使用了笔者电脑4核CPU中1核资源(前面设置了SQL Server的affinity mask为1))。因为我们在前面的分类器的中把sales数据库绑定到了资源池salespool上了,sales数据库的CPU资源占用情况就是25%。

clip_image008

 

5. 再测试下sales库和marketing库的资源争用情况

Ø 新开一个cmd窗口,执行如下语句:

sqlcmd -S localhost\sql2014 -U sa -P 95938 -d Marketing -i "d:\workload.sql"

这条语句的意思是在Marketing数据库中执行workload.sql,

此时出现如下结果:

salespool和marketingPool共享25%的CPU资源(且两者占用的资源量相同(接近),这是因为他们都是采用默认的资源分配权重)。这里的marketingPool同上文中介绍的salespool一样,它也是绑定到了一个数据库,不同的是这里绑定了marketing数据库。

因此,这两个资源池的CPU资源争用反映的就是sales数据库和Marketing数据库的资源争用。

clip_image010

备注:红色的曲线代表sales pool

绿色曲线代表marketingPool

Ø 现在,我们更改销售系统的资源池的CPU资源的权重为70

ALTER RESOURCE POOL SalesPool

WITH (MIN_CPU_PERCENT = 70)

GO

ALTER RESOURCE GOVERNOR RECONFIGURE

GO

结果如下:

此时salesPool占用的资源将增加到70%,而marketingPool的CPU资源降低到30%,两者按照7:3进行分配。

这样就相当于给sales数据库分配了更多的CPU资源,而削减了marketing的CPU资源。

clip_image012

 

6. 最后,我们来看一个设置最大CPU资源权重的例子

--设置MarketingPool的最大CPU占用

ALTER RESOURCE POOL MarketingPool

WITH (MAX_CPU_PERCENT = 5)

GO

ALTER RESOURCE GOVERNOR RECONFIGURE

GO

此时,在marketingPool占用的资源如下图:

clip_image014

如果此时在sales数据库中执行的workload.sql已经执行完毕,则marketing数据库会突破之前设置的MAX_CPU_PERCENT = 5的限制,使用到全部CPU资源,这样的好处就是可以充分利用资源,避免资源浪费。如下图的蓝色框中的曲线。

clip_image016

当然,如果你一定要限制Marketing数据库的CPU资源必须在5%以内,可以通过如下语句实现:

ALTER RESOURCE POOL MarketingPool

WITH (CAP_CPU_PERCENT=5)

GO

ALTER RESOURCE GOVERNOR RECONFIGURE

GO

总结

SQL Server资源调节器通过资源池、工作组负载、分类器等机制可以为不同的数据库、不同的请求、不同的用户分配彼此独立的CPU、内存、IO等资源,起到资源调节和隔离的作用。通过该技术,我们可以在确保每个数据库分配到合理的资源的前提下,合并多个数据库到同一个实例,也可以为某些SQL代码预定义服务器资源及避免某些SQL语句占用过多资源,还可以按照业务的优先级分配资源等。总之,使用SQL Server资源调节器可以更为细腻的分配服务器资源,是DBA的必杀技之一。

 

2015.1.8补充:

我在样例中使用的创建资源池的方法非常简单,其实,详细的语法如下:

CREATE RESOURCE POOL pool_name
[ WITH
    (
        [ MIN_CPU_PERCENT = value ]
        [ [ , ] MAX_CPU_PERCENT = value ] 
        [ [ , ] CAP_CPU_PERCENT = value ] 
        [ [ , ] AFFINITY {SCHEDULER =
                  AUTO | ( <scheduler_range_spec> ) 
                | NUMANODE = ( <NUMA_node_range_spec> )} ] 
        [ [ , ] MIN_MEMORY_PERCENT = value ]
        [ [ , ] MAX_MEMORY_PERCENT = value ]
        [ [ , ] MIN_IOPS_PER_VOLUME = value ]
        [ [ , ] MAX_IOPS_PER_VOLUME = value ]
    ) 
]
[;]
目录
相关文章
|
6月前
|
人工智能 运维 关系型数据库
数据库运维:mysql 数据库迁移方法-mysqldump
本文介绍了MySQL数据库迁移的方法与技巧,重点探讨了数据量大小对迁移方式的影响。对于10GB以下的小型数据库,推荐使用mysqldump进行逻辑导出和source导入;10GB以上可考虑mydumper与myloader工具;100GB以上则建议物理迁移。文中还提供了统计数据库及表空间大小的SQL语句,并讲解了如何使用mysqldump导出存储过程、函数和数据结构。通过结合实际应用场景选择合适的工具与方法,可实现高效的数据迁移。
1152 1
|
4月前
|
存储 关系型数据库 MySQL
MySQL数据库中进行日期比较的多种方法介绍。
以上方法提供了灵活多样地处理和对比MySQL数据库中存储地不同格式地日子信息方式。根据实际需求选择适当方式能够有效执行所需操作并保证性能优化。
491 10
|
9月前
|
数据库
【YashanDB知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
【YashanDB知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
【YashanDB知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
|
5月前
|
SQL Oracle 关系型数据库
比较MySQL和Oracle数据库系统,特别是在进行分页查询的方法上的不同
两者的性能差异将取决于数据量大小、索引优化、查询设计以及具体版本的数据库服务器。考虑硬件资源、数据库设计和具体需求对于实现优化的分页查询至关重要。开发者和数据库管理员需要根据自身使用的具体数据库系统版本和环境,选择最合适的分页机制,并进行必要的性能调优来满足应用需求。
296 11
|
7月前
|
存储 算法 Java
实现不同数据库的表间的 JOIN 运算的极简方法
跨库计算是数据分析中的常见难题,尤其涉及多数据库系统时,表间 JOIN 操作复杂度显著提升。esProc 提供了一种高效解决方案,能够简化跨库 JOIN 的实现。例如,在车辆管理、交管和公民信息系统中,通过 esProc 可轻松完成如下任务:按城市统计有车公民事件数量、找出近一年获表彰的车主信息,以及按年份和品牌统计车辆违章次数。esProc 支持不同关联场景(如维表关联与主子表关联)的优化算法,如内存索引、游标处理和有序归并,从而大幅提升编码和运算效率。无论是同构还是异构数据源,esProc 均能灵活应对,为复杂数据分析提供强大支持。
|
8月前
|
Oracle 安全 关系型数据库
【Oracle】使用Navicat Premium连接Oracle数据库两种方法
以上就是两种使用Navicat Premium连接Oracle数据库的方法介绍,希望对你有所帮助!
1678 28
|
8月前
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
|
9月前
|
SQL 数据库连接 Linux
数据库编程:在PHP环境下使用SQL Server的方法。
看看你吧,就像一个调皮的小丑鱼在一片广阔的数据库海洋中游弋,一路上吞下大小数据如同海中的珍珠。不管有多少难关,只要记住这个流程,剩下的就只是探索未知的乐趣,沉浸在这个充满挑战的数据库海洋中。
244 16
|
10月前
|
数据库
【YashanDB 知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
**数据库主备切换简介** 在数据库正常或异常情况下,实现主备切换至关重要。若配置不当,主节点故障将影响业务使用,尤其在23.2版本中。原因包括资源紧张或主节点异常。解决方法涵盖手动和自动切换: 1. **一主一备部署**: - **手动切换**:支持Switchover(同步正常时)和Failover(主库损坏时)。 - **自动切换**:启用yasom仲裁选主开关。 2. **一主两备部署**: - 默认最大保护模式,自动切换开启。 需检查并配置自动切换以确保高可用性。经验总结:一主一备默认关闭自动切换,需手动开启;一主两备默认开启。
|
10月前
|
SQL 运维 关系型数据库
体验用分布式数据库突破资源瓶颈,完成任务领智能台灯!
体验用分布式数据库突破资源瓶颈,完成任务领智能台灯!

热门文章

最新文章