注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭研后台技术中心的博客

 
 
 
 
 

日志

 
 

几种常用数据库资源隔离分析  

来自江羽   2013-03-06 16:59:35|  分类: 默认分类 |举报 |字号 订阅

  下载LOFTER 我的照片书  |
本文主要分析了当今最为流行的几种数据库在用户或者系统资源隔离方面主要采取的措施,测试了包括ORALCE,SQL Server 2008, MySQL等在资源隔离上的使用方法,最后比较以上三种数据库在资源隔离上各自的优缺点。
ORACLE
oracle在用户资源隔离上,通过创建Profile,然后把创建的Profile绑定到相应的用户形式进行用户的资源隔离,其隔离的资源主要包括如下几种

parameters

comment

Session_per_user

指定限制用户的并发会话数目

Cpu_per_session

指定会话的CPU时间限制,单位为1/100s

Cpu_per_call

指定一次调用的CPU时间限制,单位为1/100s

Connect_time

指定会话的总的连接时间,为分钟为单位

Idle_time

指定会话允许连续不活动的时间,分钟为单位,超过断开连接

Logical_reads_per_session

指定一个会话允许读的数据块的数目,包括逻辑读和物理读

Logical_reads_per_call

指定一次调用所允许读的数据块的最大数目

Private_sga

指定一个会话可以在SGA中所允许分配的最大空间,字节单位

Composite_limit

指定一个会话的总的资源消耗,单位为service units

Failed_login_attempts

指定在账户被锁定之前所允许尝试登陆的最大次数

Password_life_time

指定同一密码所允许使用的天数

Password_lock_time

指定登陆尝试失败次数后账户锁定时间,以天为单位

Password_grace_time

指定宽限天数,过期后密码失效

Password_verify_function

允许复杂密码验证脚本作为参数传递到create profile


我们在测试的时候主要选取了cpu_per_call和 logical_reads_per_call进行相应的测试,测试过程和结果如下:

create user user01 identified by u01;

create profile profile01 limit cpu_per_call 100 logical_reads_per_call 1000;

alter user user01 profile profile01;

grant connect to user01;

通过上面的操作,我们新建了一个用户user01,同时创建了一个profile01绑定到该用户,这个时候用户user01对单个查询的的CPU消耗被限制为1s, 逻辑读被限制为1000,当某个查询的CPU和逻辑读消耗量满足上面条件之一时,会触发profile限制,事务被回滚,如下:

select * from all_tables;

几种常用数据库资源隔离分析 - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客
上图为IO资源操作限制时,ORACLE给出的错误提示,该查询由于超过了Profile中定义的IO资源,所以报IO调用限制的错误。同样CPU使用超过Profile限制时,提示如下:
几种常用数据库资源隔离分析 - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客

SQL Server
从SQL Server 2008开始,SQL Server提供了一种加Resource Governor的功能用于限制指定的数据库上的资源的利用,限制的资源包括CPU和系统内存,在SQL Server 2008中,主要限制包括如下几种:
MAX_CPU_PERCENT
MIN_CPU_PERCENT
MAX_MEMORY_PERCENT
MIN_MEMORY_PERCENT
同样我们选取了上面MAX_CPU_PERCENT进行相应的测试,测试步骤如下:
1. 创建2个资源池,设置各自的MAX_CPU_PERCENT分别为60,40

create resource pool pool01 with(MAX_CPU_PERCENT = 60);

create resource pool pool02 with(MAX_CPU_PERCENT = 40);

alter resource governor reconfigure;

go

通过上面的操作,我们可以在SQL Server数据库中查到刚才创建的资源池
几种常用数据库资源隔离分析 - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客
 
 2.创建2个workload group group01, group02分别对应resource pool中的pool01, pool02

create workload group group01 using pool01

create workload group group02 using pool02

alter resource governor reconfigure

go

上面创建了2个workload group, 通过相应的SQL我们可以查看刚才创建的workload group
几种常用数据库资源隔离分析 - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客
3.创建2个数据库db01, db02,创建classifier用于绑定数据库到workload group

create database db01;

create database db02;

go

创建了对应的数据库后,还需要创建一个classifier function用于实现database到workload group的绑定,如下:

create function dbo.MyClassifier()

returns sysname with schemabinding

as

begin

declare @groupName sysname;

if original_db_name() = 'db01'

set @groupName='group01'

else if original_db_name() = 'db02'

set @groupName = 'group02'

else set @groupName='default';

return @groupName;

end

go

最后把classifier绑定到resource governor

alter resource governor with(classifier_function=dbo.MyClassifier);

alter resource governor reconfigure;

go

通过上面的一系列步骤,我们建立了2个数据库分别放入到了资源池中,通过脚本模拟访问数据库db01,db02,最终通过性能监控器(控制面板- 管理工具- 性能监控器),观察到如下信息:
几种常用数据库资源隔离分析 - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客
从上面的图上可知,SQL Server的CPU利用率接近6:4的比例,跟当初设置的一致。
注意:SQL Server 2008系统资源限制是针对于当前系统资源不足的情况,如果当前系统中相应的资源还有空闲,SQL Server不会按照比例进行分配,在SQL Server 2012版本中,添加了CAP_CPU_PERCENT用于实现在系统资源还有空闲的情况下,也对库的CPU使用进行限制

MySQL
目前MySQL在用户隔离方面相对于Oracle和SQL Server来说比较弱,MySQL从5.5开始提供了如下几种方式:
MAX_QUERIES_PER_HOUR(QPH)
QPH:限制指定用户在单位小时内用户最大查询数
MAX_UPDATES_PER_HOUR(UPH)
UPH:限制指定用户在单位小时内用户最大的更新数
MAX_CONNECTIONS_PER_HOUR(CPH)
CPH:限制指定用户在单位小时内,用户最大并发连接次数
MAX_USER_CONNECTIONS
当前系统中所有用户的最大连接数,该配置针对当前系统中所有的用户
上述限制,在用户的grant语句中进行操作:

GRANT
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    TO user_specification [, user_specification] ...
    [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
    [WITH with_option ...]

with_option选项中可以指定上述项

with_option:
    GRANT OPTION
  | MAX_QUERIES_PER_HOUR count
  | MAX_UPDATES_PER_HOUR count
  | MAX_CONNECTIONS_PER_HOUR count
  | MAX_USER_CONNECTIONS count

同样我们选取了MAX_QUERIES_PER_HOUR进行测试

mysql>GRANT ALL ON *.* TO user@localhost WITH MAX_QUERIES_PER_HOUR 100;

Shell> for((i=0;i<101;i++))

do

mysql –uuser –socket=/tmp/mysql.sock –e “select * from table where id=$i”

  done

测试结果:
几种常用数据库资源隔离分析 - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客
 
 总结
 综合上面的测试,总结各个数据库在资源限制方面的问题如下:
ORACLE
  限制对象:用户单个查询或者整个会话
  限制资源:CPU使用时间 和逻辑IO读取次数
  实现方法:通过新建一个PROFILE绑定到相应的USER实现
  超限措施:事务达到资源限制时,回滚当前事务
  主要优点:资源限制针对具体用户的,对于不同的用户可以有不同的配置
  存在不足:只针对单个查询或者整个会话进行限制,单个用户在多个连接存在的情况下,不能限制整个用户的资源使用情况。在超过限制时,只能回滚当前事务,对于某些超过限制的大事务,可能需要重新进行拆分后才能执行(或者修改PROFILE限制资源)
SQL Server 2008
  限制对象:指定DATABASE
  限制资源:CPU使用率和内存使用
  实现方法:通过创建资源池和工作组,最后把相应的DATABASE放入到资源池实现
  超限措施:在整个系统资源不足时,按限制的比例协调限制资源
  主要优点:SQL Server的限制只有在当前系统资源不足的情况下才生效,对指定的DATABASE进行资源限制,只是减缓了在该库上的操作,不会造成事务的回滚
  存在不足:SQL Server的资源限制针对DATABASE进行,不能区分用户,如果存在单个用户访问多个库的情况,无法从用户进行限制
MySQL
  限制对象:指定用户
  限制资源:用户单位时间内的查询次数和更新次数
  实现方法:通过GRANT操作对用户的查询和更新次数进行配置
  超限措施:单位时间内用户的查询或者更新次数达到限制后,该用户禁止进行相关查询和更新操作
  主要优点:针对用户的查询和更新限制,对于单个用户的多个连接上的操作,都会被记录在用户下,在达到资源限制时,该用户下的所有连接都会被限制
  存在不足:当达到限制条件后,该用户不能进行任何相关操作,对于大的事务,可能单个事务的资源消耗就能达到资源上限,这样,该事务就无法被执行。每小时查询和更新次数,时间限制比较严格相比于其他两种数据库,用户资源限制的手段稍显不足。
  评论这张
 
阅读(2162)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017