资源组介绍
简介
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早日成为一个成熟稳定的版本。
- MySQL-08 MySQL8.0新特性
性能 MySQL 8.0 在一定的用户访问条件下,速度要比 MySQL 5.7 快 2 倍.MySQL 8.0 在以下方面带来了更好的性能:读/写工作负载.IO 密集型工作负载.以及高竞争(" ...
- Hadoop 2.0 中的资源管理框架 - YARN(Yet Another Resource Negotiator)
1. Hadoop 2.0 中的资源管理 http://dongxicheng.org/mapreduce-nextgen/hadoop-1-and-2-resource-manage/ Hadoop ...
- MySQL8.0.16新特性:The Communication Protocol In Group Replication
MGR优雅升级到MySQL8.0.16 传统的升级手段之一,5.7 MGR集群与8.0 MGR集群进行数据传输,程序切换新集群后测试是否正常. 如果不正常,要么将新集群的新增数据同步回旧集群,要么就舍 ...
- 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 ...
- Centos7安装MySQL8.0 - 操作手册
MySQL 8 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 一. Mysql8.0版本相比之前版本的一些特性 1) ...
- mysql8.0的新特性
https://www.cnblogs.com/kevingrace/p/10482469.html MySQL 8 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 ...
- 跨时代的MySQL8.0新特性解读
目录 MySQL发展历程 MySQL8.0新特性 秒级加列 性能提升 文档数据库 SQL增强 共用表表达式(CTEs) 不可见索引(Invisible Indexes) 降序索引(Descending ...
- 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 ...
- 部署AlwaysOn第三步:集群资源组的健康检测和故障转移
资源组是由一个或多个资源组成的组,WSFC的故障转移是以资源组为单位的,资源组中的资源是相互依赖的.一个资源所依赖的其他资源必须和该资源处于同一个资源组,跨资源组的依赖关系是不存在的.在任何时刻,每个 ...
随机推荐
- Kaggle项目实战一:Titanic: Machine Learning from Disaster
项目地址 https://www.kaggle.com/c/titanic 项目介绍: 除了乘客的编号以外,还包括下表中10个字段,构成了数据的所有特征 Variable Definition Key ...
- mysql 开发进阶篇系列 39 mysql日志之二进制日志(binlog)
一.概述 二进制日志(binlog)记录了所有的DDL(数据定义语言)语句和DML(数据操纵语言)语句,但是不包括数据查询语句, 语句以"事件"的形式保存,它描述了数据的更改过程, ...
- Vue + Element UI 实现权限管理系统 前端篇(十四):菜单功能实现
菜单功能实现 菜单接口封装 菜单管理是一个对菜单树结构的增删改查操作. 提供一个菜单查询接口,查询整颗菜单树形结构. http/modules/menu.js 添加 findMenuTree 接口. ...
- 目标检测模型的性能评估--MAP(Mean Average Precision)
目标检测模型中性能评估的几个重要参数有精确度,精确度和召回率.本文中我们将讨论一个常用的度量指标:均值平均精度,即MAP. 在二元分类中,精确度和召回率是一个简单直观的统计量,但是在目标检测中有所不同 ...
- php中 ord() 和 chr() 处理 utf8 字符串
ord() : 将字符转为 ascii 码 (0-256),准确定义官方文档:http://php.net/manual/en/function.ord.php chr() : 将 ascii 码转 ...
- CS231n官方笔记授权翻译总集篇发布
CS231n简介 CS231n的全称是CS231n: Convolutional Neural Networks for Visual Recognition,即面向视觉识别的卷积神经网络.该课程是斯 ...
- 第4章 Selenium2-java WebDriver API (三)
4.12 上传文件 4.12.1 sendKeys实现上传 html <html> <head> </head> <body> <div ...
- 三、TortoiseGit之配置密钥
TortoiseGit使用扩展名为ppk的密钥,而不是ssh-keygen生成的rsa密钥. 也就是说使用 ssh-keygen -t rsa -C "username@email.co ...
- 如何做自己的服务监控?spring boot 1.x服务监控揭秘
1.准备 下载可运行程序:http://www.mkyong.com/spring-boot/spring-boot-hello-world-example-jsp/ 2.添加服务监控依赖 <d ...
- PHP常用的正则表达式(有些需要调整)
平时做网站经常要用正则表达式,下面是一些讲解和例子,仅供大家参考和修改使用: "^\d+$" //非负整数(正整数 + 0) 顺平注: 验证输入id数值,不能为0 $reg1='/ ...