资源组介绍

简介

MySQL是单进程多线程的程序,MySQL线程包括后台线程(Master Thread、IO Thread、Purge Thread等),以及用户线程。在8.0之前,所有线程的优先级都是一样的,并且所有的线程的资源都是共享的。但是在MySQL8.0之后,由于Resource Group特性的引入,我们可以来通过资源组的方式修改线程的优先级以及所能使用的资源,可以指定不同的线程使用特定的资源。
在目前版本中DBA只能操控CPU资源,并且控制的最小力度为vCPU,即操作系统逻辑CPU核数(可以通过lscpu命令查看可控制CPU总数)。
DBA经常会遇到需要执行跑批任务的需求,这种跑批的SQL一般都是很复杂、运行时间长、消耗资源多的SQL。所以很多跑批任务都是在业务低峰期的时候执行,并且在从库上执行,尽可能降低对业务产生影响。但是对于一些数据一致性比较高的跑批任务,需要在主库上执行,在跑批任务运行的过程中很容易影响到其他线程的运行。那么现在Resource Group就是DBA的福音了,我们可以对跑批任务指定运行的资源组,限制任务使用的资源,减少对其他线程的影响。

资源组信息查看

  • INFORMATION_SCHEMA.RESOURCE_GROUPS

INFORMATION_SCHEMA库下的RESOURCE_GROUPS表中记录了所有定义的资源组的情况:

1
2
3
4
5
6
7
8
mysql> select * from information_schema.resource_groups;
+---------------------+---------------------+------------------------+----------+-----------------+
| RESOURCE_GROUP_NAME | RESOURCE_GROUP_TYPE | RESOURCE_GROUP_ENABLED | VCPU_IDS | THREAD_PRIORITY |
+---------------------+---------------------+------------------------+----------+-----------------+
| USR_default | USER | 1 | 0-23 | 0 |
| SYS_default | SYSTEM | 1 | 0-23 | 0 |
+---------------------+---------------------+------------------------+----------+-----------------+
2 rows in set (0.00 sec)

MySQL8.0默认会创建两个资源组,一个是USR_default另一个是SYS_default

  • PERFORMANCE_SCHEMA.THREADS

PERFORMANCE_SCHEMA库下的THREADS表中,可以查看当前线程使用资源组的情况:

1
2
3
4
5
6
7
8
9
10
11
mysql> mysql> select * from performance_schema.threads limit 5;
+-----------+------------------------------+------------+----------------+------------------+------------------+----------------+---------------------+------------------+-------------------+------------------+------------------+------+--------------+---------+-----------------+--------------+----------------+
| THREAD_ID | NAME | TYPE | PROCESSLIST_ID | PROCESSLIST_USER | PROCESSLIST_HOST | PROCESSLIST_DB | PROCESSLIST_COMMAND | PROCESSLIST_TIME | PROCESSLIST_STATE | PROCESSLIST_INFO | PARENT_THREAD_ID | ROLE | INSTRUMENTED | HISTORY | CONNECTION_TYPE | THREAD_OS_ID | RESOURCE_GROUP |
+-----------+------------------------------+------------+----------------+------------------+------------------+----------------+---------------------+------------------+-------------------+------------------+------------------+------+--------------+---------+-----------------+--------------+----------------+
| 1 | thread/sql/main | BACKGROUND | NULL | NULL | NULL | mysql | NULL | 96053 | NULL | NULL | NULL | NULL | YES | YES | NULL | 9130 | SYS_default |
| 3 | thread/innodb/io_ibuf_thread | BACKGROUND | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | YES | YES | NULL | 9135 | SYS_default |
| 4 | thread/innodb/io_log_thread | BACKGROUND | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | YES | YES | NULL | 9136 | SYS_default |
| 5 | thread/innodb/io_read_thread | BACKGROUND | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | YES | YES | NULL | 9138 | SYS_default |
| 6 | thread/innodb/io_read_thread | BACKGROUND | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | YES | YES | NULL | 9137 | SYS_default |
+-----------+------------------------------+------------+----------------+------------------+------------------+----------------+---------------------+------------------+-------------------+------------------+------------------+------+--------------+---------+-----------------+--------------+----------------+
5 rows in set (0.00 sec)

其中RESOURCE_GROUP字段显示线程使用的是哪个资源组。

如何使用资源组

假设我们现在需要对跑批任务创建一个资源组。

创建一个资源组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> CREATE RESOURCE GROUP Batch
-> TYPE = USER
-> VCPU = 2-3
-> THREAD_PRIORITY = 10;
Query OK, 0 rows affected (0.03 sec) mysql> select * from information_schema.resource_groups;
+---------------------+---------------------+------------------------+----------+-----------------+
| RESOURCE_GROUP_NAME | RESOURCE_GROUP_TYPE | RESOURCE_GROUP_ENABLED | VCPU_IDS | THREAD_PRIORITY |
+---------------------+---------------------+------------------------+----------+-----------------+
| USR_default | USER | 1 | 0-23 | 0 |
| SYS_default | SYSTEM | 1 | 0-23 | 0 |
| Batch | USER | 1 | 2-3 | 10 |
+---------------------+---------------------+------------------------+----------+-----------------+
3 rows in set (0.00 sec)

指定使用资源组

将创建的Batch资源组绑定到执行的线程上,有两种方式:

  • 方式一
    从PERFORMANCE_SCHEMA.THREADS表中查找需要绑定执行的线程ID(注意:THREADS表中的THREAD_ID和SHOW PROCESSLIST的ID不等同):

查看需要绑定需要的线程的THREAD_ID:

1
2
3
4
5
6
7
8
mysql> select * from performance_schema.threads where TYPE='FOREGROUND';
+-----------+--------------------------------+------------+----------------+------------------+------------------+----------------+---------------------+------------------+-------------------+------------------------------------------------------------------+------------------+------+--------------+---------+-----------------+--------------+----------------+
| THREAD_ID | NAME | TYPE | PROCESSLIST_ID | PROCESSLIST_USER | PROCESSLIST_HOST | PROCESSLIST_DB | PROCESSLIST_COMMAND | PROCESSLIST_TIME | PROCESSLIST_STATE | PROCESSLIST_INFO | PARENT_THREAD_ID | ROLE | INSTRUMENTED | HISTORY | CONNECTION_TYPE | THREAD_OS_ID | RESOURCE_GROUP |
+-----------+--------------------------------+------------+----------------+------------------+------------------+----------------+---------------------+------------------+-------------------+------------------------------------------------------------------+------------------+------+--------------+---------+-----------------+--------------+----------------+
| 61 | thread/sql/compress_gtid_table | FOREGROUND | 5 | NULL | NULL | NULL | Daemon | 96613 | Suspending | NULL | 1 | NULL | YES | YES | NULL | 9211 | SYS_default |
| 65 | thread/sql/one_connection | FOREGROUND | 10 | root | localhost | NULL | Query | 0 | Sending data | select * from performance_schema.threads where TYPE='FOREGROUND' | NULL | NULL | YES | YES | Socket | 9741 | USR_default |
+-----------+--------------------------------+------------+----------------+------------------+------------------+----------------+---------------------+------------------+-------------------+------------------------------------------------------------------+------------------+------+--------------+---------+-----------------+--------------+----------------+
2 rows in set (0.00 sec)

绑定将线程与Batch资源组绑定:

1
SET RESOURCE GROUP Batch FOR 65;

查看绑定结果:

1
2
3
4
5
6
7
8
mysql> select THREAD_ID,NAME,TYPE,PROCESSLIST_ID,RESOURCE_GROUP from performance_schema.threads where TYPE='FOREGROUND';
+-----------+--------------------------------+------------+----------------+----------------+
| THREAD_ID | NAME | TYPE | PROCESSLIST_ID | RESOURCE_GROUP |
+-----------+--------------------------------+------------+----------------+----------------+
| 61 | thread/sql/compress_gtid_table | FOREGROUND | 5 | SYS_default |
| 65 | thread/sql/one_connection | FOREGROUND | 10 | Batch |
+-----------+--------------------------------+------------+----------------+----------------+
2 rows in set (0.00 sec)
  • 方式二

采用Optimizer Hints的方式指定SQL使用的资源组:

1
SELECT /*+ RESOURCE_GROUP(Batch) */ * FROM t2 ;

修改资源组配置

可能跑批任务使用CPU资源不够,那就需要修改资源组的配置。

1
ALTER RESOURCE GROUP Batch VCPU = 10-20;

修改资源组优先级:

1
ALTER RESOURCE GROUP Batch THREAD_PRIORITY = 5;

禁止使用资源组:

1
ALTER RESOURCE GROUP Batch DISABLE FORCE;

删除资源组

对于不用的资源组可以删除

1
DROP RESOURCE GROUP Batch;

使用注意点

  • CREATE RESOURCE GROUP、ALTER RESOURCE GROUP、DROP RESOURCE GROUP等SQL语句并不会被记录到binlog中,不会被复制到从库。
  • 如果MySQL安装了thread pool插件,无法使用RESOURCE GROUP特性
  • macOS 平台上不支持RESOURCE GROUP特性
  • FreeBSD 和 Solaris 平台上无法指定资源组优先级(priorities),所有线程运行在0状态。
  • Linux 平台上需要开启 CAP_SYS_NICE 特性才能使用RESOURCE GROUP
1
2
3
4
5
6
7
8
9
10
11
12
检查mysqld进程是否开启CAP_SYS_NICE特性
[root@qdata-sto3 /root]
#getcap /home/mysql/program/mysql8.0/bin/mysqld 给mysqld进程开启CAP_SYS_NICE特性
[root@qdata-sto3 /root]
#setcap cap_sys_nice+ep /home/mysql/program/mysql8.0/bin/mysqld 检查是否开启成功
[root@qdata-sto3 /root]
#getcap /home/mysql/program/mysql8.0/bin/mysqld
/home/mysql/program/mysql8.0/bin/mysqld = cap_sys_nice+ep
  • Windows平台上线程优先级只有5个等级,分别为THREAD_PRIORITY_HIGHEST、THREAD_PRIORITY_ABOVE_NORMAL、THREAD_PRIORITY_NORMAL、THREAD_PRIORITY_BELOW_NORMAL、THREAD_PRIORITY_LOWEST

总结

Resource Group是MySQL在8.0中增加的资源管理的特性,从一个DBA的角度,可以更加灵活、便捷的管理数据库使用的资源,这是一个令人眼前一亮的特性。Oracle在10g的时候已经推出了Resource Manager的特性,MySQL的Resource Group目前还很简单只能控制CPU的资源,但是相信后续Resource Group能操控的资源类型会越来越多。期待MySQL8.0早日成为一个成熟稳定的版本。

MySQL8.0——Resource Group(资源组)的更多相关文章

  1. MySQL-08 MySQL8.0新特性

    性能 MySQL 8.0 在一定的用户访问条件下,速度要比 MySQL 5.7 快 2 倍.MySQL 8.0 在以下方面带来了更好的性能:读/写工作负载.IO 密集型工作负载.以及高竞争(" ...

  2. Hadoop 2.0 中的资源管理框架 - YARN(Yet Another Resource Negotiator)

    1. Hadoop 2.0 中的资源管理 http://dongxicheng.org/mapreduce-nextgen/hadoop-1-and-2-resource-manage/ Hadoop ...

  3. MySQL8.0.16新特性:The Communication Protocol In Group Replication

    MGR优雅升级到MySQL8.0.16 传统的升级手段之一,5.7 MGR集群与8.0 MGR集群进行数据传输,程序切换新集群后测试是否正常. 如果不正常,要么将新集群的新增数据同步回旧集群,要么就舍 ...

  4. Jmeter:运行报:Error occurred starting thread group :线程组, error message:Invalid duration 0 set in Thread Group:线程组, see log file for more details

    最近在用jmeter做压测,上周五压测的脚本,今天早晨结束后. 点击同样的脚本,运行就报Error occurred starting thread group :线程组, error message ...

  5. Centos7安装MySQL8.0 - 操作手册

    MySQL 8 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 一.  Mysql8.0版本相比之前版本的一些特性 1) ...

  6. mysql8.0的新特性

    https://www.cnblogs.com/kevingrace/p/10482469.html MySQL 8 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 ...

  7. 跨时代的MySQL8.0新特性解读

    目录 MySQL发展历程 MySQL8.0新特性 秒级加列 性能提升 文档数据库 SQL增强 共用表表达式(CTEs) 不可见索引(Invisible Indexes) 降序索引(Descending ...

  8. mysql8.0发布新特性

    2018年4月21日 14:36:42 https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-11.html#mysqld-8-0-11-b ...

  9. 部署AlwaysOn第三步:集群资源组的健康检测和故障转移

    资源组是由一个或多个资源组成的组,WSFC的故障转移是以资源组为单位的,资源组中的资源是相互依赖的.一个资源所依赖的其他资源必须和该资源处于同一个资源组,跨资源组的依赖关系是不存在的.在任何时刻,每个 ...

随机推荐

  1. 个人总结的一个中高级Java开发工程师或架构师需要掌握哪几点!

    今天,我来唠叨几句~~ 知识改变命运,对于Java程序员来说,技术不断更新,只有及时充电,才能不被市场淘汰.今天为大家分享Java程序员学习的6个小技巧. 1.一定要看书 现在学习Java变得比以前容 ...

  2. c++11并行、并发与多线程编程

    首先,我们先理解并发和并行的区别. 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行. 你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并 ...

  3. [java初探09]__关于java的包装类

    前言 在Java语言的学习过程中,我们逐渐的理解了Java面向对象的思想,与类和对象的应用.但是在基本数据类型的使用上,我们无法将其定义为一个对象,通过使用对象的方法来使用它们,但是Java语言的思想 ...

  4. winhex十六进制常用快捷键

    Winhex的常用快捷键 摘要: Winhex 是一个专门用来对付各种日常紧急情况的工具.它可以用来检查和修复各种文件.恢复删除文件.硬盘损坏造成的数据丢失等.同时它还可以让你看到其他程序隐藏起来的文 ...

  5. 《深入理解Java虚拟机》(一)Java虚拟机发展史

    Java虚拟机发展史 1.Sun Classic/Exact VM 1.Sun Classic:世界第一款商用Java虚拟机. 2.Exact VM:准确式GC:虚拟机可以知道内存中的某个位置的数据具 ...

  6. C# QuartZ使用实例写成服务

    官方学习文档:http://www.quartz-scheduler.net/documentation/index.html 官方的源代码下载:http://sourceforge.net/proj ...

  7. [PHP] 算法-请找出带环链表的环的入口结点的PHP实现

    给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null 1.找链表倒数第k个结点,输入一个链表,输出该链表中倒数第k个结点.第一个指针走(k-1)步,到达第k个节点,两个指针同时往后 ...

  8. 【Spring】12、Spring Security 四种使用方式

    spring security使用分类: 如何使用spring security,相信百度过的都知道,总共有四种用法,从简到深为:1.不用数据库,全部数据写在配置文件,这个也是官方文档里面的demo: ...

  9. WCF Service 转换为Web Service 中字段属性

    1.新建WCF服务,服务中包含对象 2.部署WCF服务,并将其转换为应用程序 3.通过添加服务引用,使用WCF服务 4.调用对应的对象时需要对应的值设置为True. 参考:https://cloud. ...

  10. music-api-next:一款支持网易、xiami和QQ音乐的JS爬虫库

    音乐,无界 让音乐无界 如果你苦于挑选一个全方位.多平台.简便易用的音乐爬虫库,music-api-next是不二选择. 特性: 支持网易.虾米和QQ三大主流音乐平台 支持音乐关键词搜索 支持音乐链接 ...