在这篇文章中,我们将提供新的MySQL 8.0 RESOURCE_GROUP特性的概述。
在MySQL 8.0中引入的一个伟大的新特性——在我看来——需要注意的RESOURCE_GROUP。
短的免责声明:我想指出,MySQL 8.0尚未GA,所以有可能MySQL 8.0RESOURCE_GROUP实现的变化特性和/或行为。
我使用了MySQL社区服务器8.0 RC,下面提到的一切适用于这个MySQL版本。
在这篇文章中,我将很快看这个特性和总结它是什么,它如何使DBA的日子好过一点,突出一些已知的限制。
MySQL文档描述如下:
“MySQL支持资源组的创建和管理,和许可分配线程运行在服务器特定的组,这样线程执行根据可用的资源。组属性使控制其资源,启用或限制资源消耗的线程组。dba可以修改这些属性,适合不同的工作负载。
“目前,CPU时间是可管理的资源,为代表的概念“虚拟CPU”作为一个术语,包括CPU核,核,硬件线程,等等。服务器在启动时决定多少虚拟cpu,以适当的权限和数据库管理员可以将这些cpu资源组和分配线程组。”
太好了,现在我们可以给个vCPU资源分配不同的群体和不同的侧重点。在继续之前发现资源组是什么以及它们是如何酷,让我们快速浏览一下限制:
- 资源组插件不可用,如果你安装线程池
- macOS资源组不可用,没有提供的API将cpu绑定到线程
- FreeBSD和Solaris资源组线程优先级被忽略(有效,所有线程运行优先级0)
- 在Linux上,资源组线程优先级被忽略,除非
CAP_SYS_NICE能力集。MySQL包安装Linux系统应该设置这个功能。安装使用压缩焦油从源文件二进制发行版或,CAP_SYS_NICE功能可以设置手动使用setcap命令,指定的路径名mysqld可执行(这需要sudo访问)。 - 在Windows中,线程运行在5个线程优先级水平。-20年至19的资源组线程优先级范围映射到这些水平。
- 资源组管理是本地服务器它发生。资源组SQL语句和修改resource_group数据字典表不写入二进制日志,不是复制。
因为我们现在知道的限制,让我们看看如何使用它对现实世界的场景。
从我的经验,许多DBA的缓慢的问题报告和/或聚合查询的相同实例密集型OLTP工作负载时,正在执行一些批处理作业。最简单的,通常的解决这个问题的方法是将这些活动一个奴隶实例。虽然这个工作,需要一些时间提供新的硬件资源,设置它,等。所以在大多数情况下,这种方法可以考虑中期。
如果你需要修复现有的服务器上的资源争用问题,和卸载以后这样的活动吗?或者你不能移动所需的批处理作业的奴隶,因为它的一致性,你负担不起奴隶滞后吗?批处理作业或在某些情况下,可能需要执行一个写所以无法去奴隶吗?
在这种情况下,资源组是一个很好的修复。
目前我们有两个默认组,我们不能删除或修改:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
mysql>
选择
*
从
INFORMATION_SCHEMA.RESOURCE_GROUPSG
* * * * * * * * * * * * * * * * * * * * * * * * * * *1。
行
* * * * * * * * * * * * * * * * * * * * * * * * * * *
RESOURCE_GROUP_NAME:USR_default
RESOURCE_GROUP_TYPE:
用户
RESOURCE_GROUP_ENABLED:1
VCPU_IDS:0- - - - - -8
THREAD_PRIORITY:0
* * * * * * * * * * * * * * * * * * * * * * * * * * *2。
行
* * * * * * * * * * * * * * * * * * * * * * * * * * *
RESOURCE_GROUP_NAME:SYS_default
RESOURCE_GROUP_TYPE:系统
RESOURCE_GROUP_ENABLED:1
VCPU_IDS:0- - - - - -8
THREAD_PRIORITY:0
|
每组有一个类型,它是
系统或用户。资源组类型影响的范围优先级值分配。这个属性,允许不同的优先级,使系统线程能够被识别,以保护他们免受竞争对用户线程的CPU资源。下面的列表显示了优先级范围,每一组相关类型:
- 对于系统资源组,允许优先级范围是-20到0。
- 对于用户资源组,允许优先级范围是0到19。线程的优先级线程的执行优先级分配给资源组。优先级值的范围从-20(最高优先级)至19日(最低优先级)。默认优先级为0,对系统和用户组。系统组比用户组被允许一个更高的优先级,确保用户线程没有优先级高于系统线程:
假设我们有8个CPU(这是我的情况下)。
现在让我们为我们的报告查询,创建一个资源组和另一组批作业:
|
1
2
3
4
|
创建
资源
集团
报告
类型
=
用户
个VCPU=5- - - - - -6
THREAD_PRIORITY=10;
|
|
1
2
3
4
|
创建
资源
集团
Batch_job
类型
=
用户
个VCPU=7- - - - - -8
THREAD_PRIORITY=8;
|
让我们验证组是否被正确地创建:
|
1
2
3
4
5
6
7
8
|
mysql>
选择
*
从
INFORMATION_SCHEMA.RESOURCE_GROUPS
在哪里
RESOURCE_GROUP_NAME=
“Batch_job”G
* * * * * * * * * * * * * * * * * * * * * * * * * * *1。
行
* * * * * * * * * * * * * * * * * * * * * * * * * * *
RESOURCE_GROUP_NAME:Batch_job
RESOURCE_GROUP_TYPE:
用户
RESOURCE_GROUP_ENABLED:1
VCPU_IDS:7- - - - - -8
THREAD_PRIORITY:8
|
|
1
2
3
4
5
6
7
8
|
mysql>
选择
*
从
INFORMATION_SCHEMA.RESOURCE_GROUPS
在哪里
RESOURCE_GROUP_NAME=
“报告”G
* * * * * * * * * * * * * * * * * * * * * * * * * * *1。
行
* * * * * * * * * * * * * * * * * * * * * * * * * * *
RESOURCE_GROUP_NAME:报告
RESOURCE_GROUP_TYPE:
用户
RESOURCE_GROUP_ENABLED:1
VCPU_IDS:5- - - - - -6
THREAD_PRIORITY:10
|
现在让我们考虑几个场景:
- 我们已经有了巨大的报告查询服务器上运行,它会消耗大量的资源,使一切变慢。在这种情况下,我们可以做以下几点:
- 发现这个报告查询的thread_id性能模式
线程表thread_id并分配一个特定的资源组:
- 发现这个报告查询的thread_id性能模式
|
1
|
集
资源
集团
报告
为
4537;
|
- 执行一个语句使用报告组,使用
RESOURCE_GROUP优化器提示:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
选择
* / / * + RESOURCE_GROUP(报告)
“main_table”。“subscriber_id”,“main_table”。“subscriber_email”,“main_table”。“可以”,“main_table”。“subscriber_status”,(
选择
created_at
从
sales_order
在哪里
customer_email=main_table.subscriber_email
命令
created_at
DESC
限制
1
)
作为
“last_order_date”,(
选择
entity_id
从
sales_order
在哪里
customer_email=main_table.subscriber_email
命令
created_at
DESC
限制
1
)
作为
“last_order_id”,(
选择
increment_id
从
sales_order
在哪里
customer_email=main_table.subscriber_email
命令
created_at
DESC
限制
1
)
作为
“last_increment_id”,(
...............................................................................
|
线程分配给报告组执行的资源,你可以根据需要修改。
例如,与此同时,我们执行一个批处理作业脚本与Batch_job集团资源。作为一个结果,我们需要减少优先级和更少的CPU资源分配给我们的报道资源组。我们可以用以下方式:
|
1
2
3
|
改变
资源
集团
报告
个VCPU=6
THREAD_PRIORITY=19;
|
结论
MySQL 8.0RESOURCE_GROUP是一个伟大的和易于使用的功能,在某些情况下可以帮助很多。我有一个强烈的感觉,可管理资源的列表不会只局限于CPU的,还将扩展到其他方面的服务器。一旦它的生产准备,我认为许多数据库管理员会发现它非常有用的和有用的。
下一步,我将运行的测试资源利用率不同的资源组的使用场景和性能结果。





