Loading...
MySQL 9.5 Reference Manual 9.5의 7.1.16 Resource Groups의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
MySQL은 리소스 그룹의 생성 및 관리를 지원하며, 서버 내에서 실행 중인 스레드를 특정 그룹에 할당하여 그 그룹에 사용 가능한 리소스에 따라 스레드가 실행되도록 허용합니다. 그룹 속성을 통해 그룹의 리소스를 제어하여, 그룹의 스레드에 대한 리소스 사용을 허용하거나 제한할 수 있습니다. DBA는 서로 다른 워크로드에 적합하도록 이러한 속성을 수정할 수 있습니다.
현재 관리 가능한 리소스는 CPU 시간이며, 이는 CPU 코어, 하이퍼스레드, 하드웨어 스레드 등을 포함하는 용어인 “가상 CPU” 개념으로 표현됩니다. 서버는 시작 시점에 사용 가능한 가상 CPU의 수를 결정하고, 적절한 권한을 가진 데이터베이스 관리자는 이들 CPU를 리소스 그룹에 연결하고 스레드를 그룹에 할당할 수 있습니다.
예를 들어, 높은 우선순위로 실행될 필요가 없는 배치 작업의
실행을 관리하기 위해, DBA는 Batch
리소스 그룹을 생성하고, 서버가 얼마나 바쁜지에 따라
그 우선순위를 올리거나 내릴 수 있습니다. (예를 들어,
그룹에 할당된 배치 작업은 낮 동안에는 낮은 우선순위로,
밤에는 높은 우선순위로 실행되게 할 수 있습니다.)
DBA는 그룹에 사용 가능한 CPU 집합도 조정할 수 있습니다.
스레드가 그룹에 할당 가능한지 제어하기 위해 그룹을
활성 또는 비활성 상태로 설정할 수 있습니다.
다음 섹션에서는 MySQL에서 리소스 그룹 사용과 관련된 측면을 설명합니다:
주의
일부 플랫폼 또는 MySQL 서버 설정에서는 리소스 그룹을 사용할 수 없거나 제한이 있을 수 있습니다. 특히, Linux 시스템에서는 일부 설치 방법의 경우 수동 단계가 필요할 수 있습니다. 자세한 내용은 Resource Group Restrictions을 참조하십시오.
다음 기능들은 MySQL에서 리소스 그룹 관리를 위한 SQL 인터페이스를 제공합니다:
SQL 문을 사용하면 리소스 그룹을 생성, 변경, 삭제할 수 있으며, 스레드를 리소스 그룹에 할당할 수 있습니다. 옵티마이저 힌트를 사용하면 개별 문을 리소스 그룹에 할당할 수 있습니다.
리소스 그룹 권한을 사용하면 어떤 사용자가 리소스 그룹 작업을 수행할 수 있는지 제어할 수 있습니다.
Information Schema
RESOURCE_GROUPS 테이블은
리소스 그룹 정의에 대한 정보를 제공하며,
Performance Schema threads
테이블은 각 스레드의 리소스 그룹 할당을 보여줍니다.
상태 변수는 각 관리용 SQL 문에 대한 실행 횟수를 제공합니다.
리소스 그룹에는 그룹을 정의하는 속성이 있습니다. 모든 속성은 그룹 생성 시 설정할 수 있습니다. 일부 속성은 생성 시에 고정되며, 나머지는 그 이후 언제든지 수정할 수 있습니다.
다음 속성은 리소스 그룹 생성 시 정의되며 수정할 수 없습니다:
각 그룹에는 이름이 있습니다. 리소스 그룹 이름은 테이블 및 컬럼 이름과 같은 식별자이며, 특수 문자나 예약어를 포함하지 않는 한 SQL 문에서 따옴표로 감쌀 필요가 없습니다. 그룹 이름은 대소문자를 구분하지 않으며 최대 64자까지 허용됩니다.
각 그룹에는 SYSTEM 또는
USER 타입이 있습니다. 리소스 그룹 타입은
나중에 설명하는 것처럼 그룹에 할당 가능한 우선순위 값의
범위에 영향을 줍니다. 이 속성과 허용되는 우선순위
차이를 통해 시스템 스레드를 식별할 수 있으며,
사용자 스레드와의 CPU 리소스 경쟁으로부터 시스템 스레드를
보호할 수 있습니다.
시스템 스레드와 사용자 스레드는 Performance Schema
threads 테이블에 나열된 백그라운드 스레드와
포그라운드 스레드에 각각 대응합니다.
다음 속성은 리소스 그룹 생성 시 정의되며, 이후 언제든지 수정할 수 있습니다:
CPU 어피니티는 리소스 그룹이 사용할 수 있는 가상 CPU 집합입니다. 어피니티는 사용 가능한 CPU의 임의의 공집합이 아닌 부분집합이 될 수 있습니다. 그룹에 어피니티가 없으면, 사용 가능한 모든 CPU를 사용할 수 있습니다.
스레드 우선순위는 리소스 그룹에 할당된 스레드의 실행 우선순위입니다. 우선순위 값은 -20 (가장 높은 우선순위)부터 19 (가장 낮은 우선순위)까지 범위를 가지며, 기본 우선순위는 시스템 그룹과 사용자 그룹 모두에 대해 0입니다.
시스템 그룹은 사용자 그룹보다 더 높은 우선순위가 허용되며, 이를 통해 사용자 스레드가 시스템 스레드보다 높은 우선순위를 갖지 못하도록 보장합니다:
시스템 리소스 그룹의 경우 허용되는 우선순위 범위는 -20에서 0까지입니다.
사용자 리소스 그룹의 경우 허용되는 우선순위 범위는 0에서 19까지입니다.
각 그룹은 활성 또는 비활성 상태일 수 있으며, 이를 통해 관리자가 스레드 할당을 제어할 수 있습니다. 스레드는 활성화된 그룹에만 할당될 수 있습니다.
기본적으로 하나의 시스템 그룹과 하나의 사용자 그룹이 있으며,
각각 SYS_default 및
USR_default라는 이름을 가집니다. 이들 기본
그룹은 drop할 수 없으며, 그 속성을 수정할 수 없습니다.
각 기본 그룹은 CPU 어피니티가 없으며 우선순위는 0입니다.
새로 생성되는 시스템 스레드와 사용자 스레드는 각각
SYS_default 및
USR_default 그룹에 할당됩니다.
사용자 정의 리소스 그룹의 경우, 모든 속성은 그룹 생성 시에 할당됩니다. 그룹이 생성된 후에는 이름과 타입 속성을 제외한 속성을 수정할 수 있습니다.
사용자 정의 리소스 그룹을 생성 및 관리하려면 다음 SQL 문을 사용하십시오:
CREATE RESOURCE GROUP는
새 그룹을 생성합니다. 자세한 내용은
Section 15.7.2.2, “CREATE RESOURCE GROUP Statement”를 참조하십시오.
ALTER RESOURCE GROUP는
기존 그룹을 수정합니다. 자세한 내용은
Section 15.7.2.1, “ALTER RESOURCE GROUP Statement”를 참조하십시오.
DROP RESOURCE GROUP는
기존 그룹을 drop합니다. 자세한 내용은
Section 15.7.2.3, “DROP RESOURCE GROUP Statement”를 참조하십시오.
이들 문에는
RESOURCE_GROUP_ADMIN 권한이 필요합니다.
리소스 그룹 할당을 관리하려면 다음 기능을 사용하십시오:
SET RESOURCE GROUP은
스레드를 그룹에 할당합니다. 자세한 내용은
Section 15.7.2.4, “SET RESOURCE GROUP Statement”를 참조하십시오.
RESOURCE_GROUP
옵티마이저 힌트는 개별 문을 그룹에 할당합니다.
자세한 내용은
Section 10.9.3, “Optimizer Hints”를 참조하십시오.
이러한 작업에는
RESOURCE_GROUP_ADMIN 또는
RESOURCE_GROUP_USER 권한이 필요합니다.
리소스 그룹 정의는 resource_groups
데이터 사전 테이블에 저장되므로, 서버 재시작 후에도
그룹이 유지됩니다. resource_groups는
데이터 사전의 일부이므로, 사용자가 직접적으로 접근할 수
없습니다. 리소스 그룹 정보는 Information Schema
RESOURCE_GROUPS 테이블을 통해 사용할 수 있으며,
이 테이블은 데이터 사전 테이블에 대한 뷰로
구현되어 있습니다. 자세한 내용은
Section 28.3.31, “The INFORMATION_SCHEMA RESOURCE_GROUPS Table”을 참조하십시오.
초기에는 RESOURCE_GROUPS
테이블에 기본 그룹을 설명하는 다음 row가 있습니다:
1mysql> SELECT * FROM INFORMATION_SCHEMA.RESOURCE_GROUPS\G 2*************************** 1. row *************************** 3 RESOURCE_GROUP_NAME: USR_default 4 RESOURCE_GROUP_TYPE: USER 5RESOURCE_GROUP_ENABLED: 1 6 VCPU_IDS: 0-3 7 THREAD_PRIORITY: 0 8*************************** 2. row *************************** 9 RESOURCE_GROUP_NAME: SYS_default 10 RESOURCE_GROUP_TYPE: SYSTEM 11RESOURCE_GROUP_ENABLED: 1 12 VCPU_IDS: 0-3 13 THREAD_PRIORITY: 0
THREAD_PRIORITY 값은 0으로, 기본 우선순위를
나타냅니다. VCPU_IDS 값은 사용 가능한 모든 CPU를
포함하는 범위를 보여줍니다. 기본 그룹의 경우,
표시되는 값은 MySQL 서버가 실행되는 시스템에 따라
달라집니다.
앞서 언급한 논의에서는 높은 우선순위로 실행될 필요가 없는
배치 작업 실행을 관리하기 위한 Batch라는
리소스 그룹을 사용하는 시나리오를 언급했습니다.
이러한 그룹을 생성하려면 다음과 유사한 문을
사용하십시오:
1CREATE RESOURCE GROUP Batch 2 TYPE = USER 3 VCPU = 2-3 -- assumes a system with at least 4 CPUs 4 THREAD_PRIORITY = 10;
리소스 그룹이 예상대로 생성되었는지 확인하려면
RESOURCE_GROUPS 테이블을 확인하십시오:
1mysql> SELECT * FROM INFORMATION_SCHEMA.RESOURCE_GROUPS 2 WHERE RESOURCE_GROUP_NAME = 'Batch'\G 3*************************** 1. row *************************** 4 RESOURCE_GROUP_NAME: Batch 5 RESOURCE_GROUP_TYPE: USER 6RESOURCE_GROUP_ENABLED: 1 7 VCPU_IDS: 2-3 8 THREAD_PRIORITY: 10
THREAD_PRIORITY 값이 10이 아니라 0이라면,
플랫폼 또는 시스템 설정이 리소스 그룹 기능을
제한하는지 확인하십시오. 자세한 내용은
Resource Group Restrictions을
참조하십시오.
스레드를 Batch 그룹에 할당하려면
다음과 같이 하십시오:
1SET RESOURCE GROUP Batch FOR thread_id;
그 이후에는 해당 이름의 스레드에서 실행되는 문은
Batch 그룹 리소스로 실행됩니다.
세션의 현재 스레드 자체를 Batch
그룹에 두려면, 해당 세션 내에서 다음 문을
실행하십시오:
1SET RESOURCE GROUP Batch;
그 이후에는 해당 세션에서 실행되는 문은
Batch 그룹 리소스로 실행됩니다.
단일 문을 Batch 그룹을 사용하여
실행하려면, RESOURCE_GROUP
옵티마이저 힌트를 사용하십시오:
1INSERT /*+ RESOURCE_GROUP(Batch) */ INTO t2 VALUES(2);
Batch 그룹에 할당된 스레드는 그 리소스로
실행되며, 필요에 따라 이를 수정할 수 있습니다:
1ALTER RESOURCE GROUP Batch 2 VCPU = 3 3 THREAD_PRIORITY = 19;
1ALTER RESOURCE GROUP Batch 2 VCPU = 0-3 3 THREAD_PRIORITY = 0;
리소스 그룹 관리는 그것이 수행되는 서버에
로컬입니다. 리소스 그룹 SQL 문과
resource_groups 데이터 사전 테이블에 대한
변경 사항은 바이너리 로그에 기록되지 않으며,
복제되지 않습니다.
일부 플랫폼 또는 MySQL 서버 설정에서는 리소스 그룹을 사용할 수 없거나 제한이 있습니다:
스레드 풀 플러그인이 설치된 경우 리소스 그룹을 사용할 수 없습니다.
macOS에서는 스레드에 CPU를 바인딩하기 위한 API가 제공되지 않으므로 리소스 그룹을 사용할 수 없습니다.
FreeBSD와 Solaris에서는 리소스 그룹 스레드 우선순위가 무시됩니다. (실질적으로 모든 스레드는 우선순위 0으로 실행됩니다.) 우선순위 변경 시도는 경고를 발생시킵니다:
1mysql> ALTER RESOURCE GROUP abc THREAD_PRIORITY = 10; 2Query OK, 0 rows affected, 1 warning (0.18 sec) 3 4mysql> SHOW WARNINGS; 5+---------+------+-------------------------------------------------------------+ 6| Level | Code | Message | 7+---------+------+-------------------------------------------------------------+ 8| Warning | 4560 | Attribute thread_priority is ignored (using default value). | 9+---------+------+-------------------------------------------------------------+
CAP_SYS_NICE capability가
설정되지 않으면 리소스 그룹 스레드 우선순위가
무시됩니다. 프로세스에 CAP_SYS_NICE
capability를 부여하면 여러 권한이 활성화되므로,
전체 목록은
http://man7.org/linux/man-pages/man7/capabilities.7.html을
참조하십시오. 이 capability를 활성화할 때는 주의가
필요합니다.Linux 플랫폼에서 systemd 및 Ambient Capabilities
(Linux 4.3 이상)에 대한 커널 지원을 사용하는 경우,
CAP_SYS_NICE capability를 활성화하는 권장
방법은 MySQL 서비스 파일을 수정하고
mysqld 바이너리는 수정하지 않는 것입니다.
MySQL용 서비스 파일을 조정하려면 다음 절차를
사용하십시오:
플랫폼에 맞는 명령을 실행합니다:
Oracle Linux, Red Hat, Fedora 시스템:
1$> sudo systemctl edit mysqld
SUSE, Ubuntu, Debian 시스템:
1```terminal 2$> sudo systemctl edit mysql
에디터를 사용하여 서비스 파일에 다음 내용을 추가합니다:
1[Service] 2AmbientCapabilities=CAP_SYS_NICE
MySQL 서비스를 재시작합니다.
위에서 설명한 대로 CAP_SYS_NICE
capability를 활성화할 수 없는 경우,
setcap 명령을 사용하여 수동으로 설정할 수 있으며,
이때 mysqld 실행 파일의 경로 이름을 지정해야 합니다
(이는 sudo 권한이 필요합니다). getcap을
사용하여 capability를 확인할 수 있습니다. 예:
1$> sudo setcap cap_sys_nice+ep /path/to/mysqld 2$> getcap /path/to/mysqld 3/path/to/mysqld = cap_sys_nice+ep
안전 조치로, mysqld 바이너리 실행을
root 사용자와
mysql 그룹 멤버십을 가진 사용자로
제한하십시오:
1$> sudo chown root:mysql /path/to/mysqld 2$> sudo chmod 0750 /path/to/mysqld
주의
수동으로 setcap을 사용해야 하는 경우, 재설치할 때마다 이를 다시 수행해야 합니다.
Table 7.6 Resource Group Thread Priority on Windows
| Priority Range | Windows Priority Level |
|---|---|
| -20 to -10 | THREAD_PRIORITY_HIGHEST |
| -9 to -1 | THREAD_PRIORITY_ABOVE_NORMAL |
| 0 | THREAD_PRIORITY_NORMAL |
| 1 to 10 | THREAD_PRIORITY_BELOW_NORMAL |
| 11 to 19 | THREAD_PRIORITY_LOWEST |
7.1.15 MySQL Server Time Zone Support
7.1.17 Server-Side Help Support