MySQL8.0——Resource Group(資源組)

MySQL8.0——Resource Group(資源組)

資源組介紹

簡介

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的福音了,咱們能夠對跑批任務指定運行的資源組,限制任務使用的資源,減小對其餘線程的影響。mysql

資源組信息查看

  • INFORMATION_SCHEMA.RESOURCE_GROUPS

INFORMATION_SCHEMA庫下的RESOURCE_GROUPS表中記錄了全部定義的資源組的狀況:git

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_defaultgithub

  • PERFORMANCE_SCHEMA.THREADS

PERFORMANCE_SCHEMA庫下的THREADS表中,能夠查看當前線程使用資源組的狀況:sql

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字段顯示線程使用的是哪一個資源組。shell

如何使用資源組

假設咱們如今須要對跑批任務建立一個資源組。數據庫

建立一個資源組

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資源組綁定到執行的線程上,有兩種方式:bash

  • 方式一 從PERFORMANCE_SCHEMA.THREADS表中查找須要綁定執行的線程ID(注意:THREADS表中的THREAD_ID和SHOW PROCESSLIST的ID不等同):

查看須要綁定須要的線程的THREAD_ID:多線程

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資源組綁定:ui

SET RESOURCE GROUP Batch FOR 65;
複製代碼

查看綁定結果:spa

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使用的資源組:

SELECT /*+ RESOURCE_GROUP(Batch) */ * FROM t2 ;
複製代碼

修改資源組配置

可能跑批任務使用CPU資源不夠,那就須要修改資源組的配置。

ALTER RESOURCE GROUP Batch VCPU = 10-20;
複製代碼

修改資源組優先級:

ALTER RESOURCE GROUP Batch THREAD_PRIORITY = 5;
複製代碼

禁止使用資源組:

ALTER RESOURCE GROUP Batch DISABLE FORCE;
複製代碼

刪除資源組

對於不用的資源組能夠刪除

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
檢查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早日成爲一個成熟穩定的版本。

博客地址:win-man.github.io/
公衆號:歡迎關注

相關文章
相關標籤/搜索