MySQL 리소스 그룹으로 CPU 할당 관리

이 문서에서는 MySQL용 Cloud SQL에서 MySQL 리소스 그룹을 구성하고 사용하여 다양한 데이터 처리 요구사항의 CPU 리소스 할당을 관리하고 우선순위를 지정하는 방법을 설명합니다.

개요

MySQL 8.0에 도입된 MySQL 리소스 그룹을 사용하면 단일 데이터베이스 인스턴스에서 실행되는 여러 스레드 간에 CPU 리소스 할당을 관리하고 우선순위를 지정할 수 있습니다. 이는 일일 분석 또는 일괄 보고서와 같은 우선순위가 낮은 작업이 CPU 사용량을 급증시키고 온라인 트랜잭션 처리 (OLTP)와 같은 중요한 우선순위가 높은 클라이언트 연결의 성능을 저하시킬 수 있는 '시끄러운 이웃' 문제를 완화하는 데 유용합니다.

리소스 그룹은 Cloud SQL Enterprise 버전과 Cloud SQL Enterprise Plus 버전 모두 모든 MySQL용 Cloud SQL 8.0 이상 인스턴스에서 지원됩니다.

커뮤니티 MySQL과 Cloud SQL 리소스 그룹의 차이점

MySQL용 Cloud SQL은 완전 관리형 서비스입니다. 인스턴스 안정성을 보장하고 Cloud SQL의 내부 프로세스를 보호하기 위해 커뮤니티 MySQL 동작과 비교하여 다음과 같은 차이점과 제한사항이 적용됩니다.

CPU 코어 선호도는 지원되지 않습니다.

코어 수준 CPU 고정은 지정할 수 없습니다. 예를 들어 MySQL용 Cloud SQL에서 리소스 그룹을 만들 때 VCPU = 2-3 또는 VCPU = 0을 지정할 수 없습니다. 기본 VM 코어 토폴로지가 추상화되므로 CREATE RESOURCE GROUP 또는 ALTER RESOURCE GROUP 문에서 VCPU 절을 사용하려고 하면 다음 액세스 거부 오류가 발생하면서 실패합니다.

ERROR 1227 (42000): Access denied; This operation (CPU clause) is not allowed on the Cloud SQL environment. Only THREAD_PRIORITY allowed;

금지된 시스템 리소스 그룹

Cloud SQL에서는 시스템 리소스 그룹을 만들 수 없습니다. 스레드 우선순위가 0 (가장 높은 사용자 우선순위)에서 19 (가장 낮은 사용자 우선순위)까지인 사용자 수준 리소스 그룹 (TYPE = USER)만 허용됩니다.

사용자 워크로드가 백업, 모니터링, 복제와 같은 중요한 Cloud SQL 백그라운드 작업을 방해하지 않도록 시스템 리소스 그룹은 금지됩니다.

TYPE = SYSTEM으로 CREATE RESOURCE GROUP 명령어를 실행하면 다음 오류가 발생하면서 실패합니다.

ERROR 1227 (42000): Access denied; This operation (TYPE=SYSTEM) is not allowed on the Cloud SQL environment. Only TYPE=USER is allowed;

리소스 그룹 DDL의 자동 바이너리 로깅 및 복제

커뮤니티 MySQL에서 CREATE, ALTER, DROP RESOURCE GROUP과 같은 리소스 그룹 작업은 바이너리 로그에 기록되지 않습니다. Cloud SQL은 모든 리소스 그룹 정의 명령어가 바이너리 로그에 기록되도록 이 기본 동작을 재정의합니다.

이렇게 하면 리소스 그룹이 읽기 복제본에 자동으로 복제되므로 복제본에서 쿼리 최적화 도구 힌트 (또는 RESOURCE_GROUP 힌트)를 사용하여 그룹 누락으로 인한 쿼리 실패를 방지할 수 있습니다. 그룹 정의는 point-in-time recovery (PITR)를 위해 바이너리 로그 스트림에도 캡처됩니다.

SET RESOURCE GROUP과 같은 스레드 세션 할당은 바이너리 로그에 기록되지 않습니다.

관리자 권한은 cloudsqlsuperuser에 부여됩니다.

리소스 그룹으로 작업하려면 다음과 같은 관리 데이터베이스 권한이 필요합니다.

  • RESOURCE_GROUP_ADMIN: 리소스 그룹 만들기, 변경, 삭제
  • RESOURCE_GROUP_USER: 스레드 할당 또는 쿼리에서 힌트 사용

Cloud SQL에서는 두 권한이 모두 기본적으로 cloudsqlsuperuser 역할에 부여됩니다.

MySQL 관리자는 다른 사용자에게 RESOURCE_GROUP_USER 또는 RESOURCE_GROUP_ADMIN 데이터베이스 권한을 부여할 수도 있습니다.

Cloud SQL에서 리소스 그룹 관리

Cloud SQL에서 사용자 수준 리소스 그룹을 구성하고 관리하여 데이터베이스의 리소스 할당을 최적화할 수 있습니다. 이렇게 하면 인스턴스의 다양한 데이터베이스 세션 워크로드 간에 CPU 리소스 할당을 제어하고 우선순위를 지정할 수 있습니다.

MySQL 리소스 그룹 구성 및 참조 동작에 대한 자세한 내용은 MySQL 문서의 리소스 그룹을 참조하세요.

Cloud SQL에서 리소스 그룹을 관리하려면 다음을 수행하면 됩니다.

시작하기 전에

리소스 그룹을 만들기 전에 다음을 확인하세요.

  • RESOURCE_GROUP_ADMIN 권한이 있는 사용자 계정으로 데이터베이스에 로그인했습니다. 기본 root 사용자 및 cloudsqlsuperuser 역할이 할당된 모든 데이터베이스 계정에는 기본적으로 이 권한이 있습니다.

  • Cloud SQL 인스턴스가 MySQL 8.0 이상을 실행하고 있습니다.

리소스 그룹 만들기

스레드 우선순위가 0(가장 높은 우선순위)에서 19 (가장 낮은 우선순위) 사이인 사용자 수준 리소스 그룹을 만듭니다. 표준 연결의 기본 스레드 우선순위는 0입니다.

리소스 그룹을 만들려면 다음 문을 실행합니다.

CREATE RESOURCE GROUP GROUP_NAME
  TYPE = USER
  THREAD_PRIORITY = PRIORITY_VALUE;

다음을 바꿉니다.

  • GROUP_NAME: 만들려는 리소스 그룹의 이름입니다.
  • PRIORITY_VALUE: 리소스 그룹의 CPU 일정 우선순위로, 0 (가장 높은 우선순위)에서 19 (가장 낮은 우선순위)까지입니다.

리소스 그룹의 우선순위 수정

기존 리소스 그룹의 CPU 일정 우선순위를 수정하려면 다음 문을 실행합니다.

ALTER RESOURCE GROUP GROUP_NAME
  THREAD_PRIORITY = PRIORITY_VALUE;

다음을 바꿉니다.

  • GROUP_NAME: 수정하려는 리소스 그룹의 이름입니다.
  • PRIORITY_VALUE: 새 CPU 일정 우선순위입니다.

리소스 그룹 삭제

리소스 그룹을 삭제하려면 다음 문을 실행합니다.

DROP RESOURCE GROUP GROUP_NAME;

다음을 바꿉니다.

  • GROUP_NAME: 삭제하려는 리소스 그룹의 이름입니다.

리소스 그룹에 연결 및 쿼리 할당

워크로드에 리소스 제약조건을 적용하려면 활성 연결 또는 특정 쿼리를 사용자 리소스 그룹에 할당합니다.

세션 연결을 그룹에 할당하려면 다음 단계를 따르세요.

  1. 워크로드 사용자에게 권한을 부여합니다.

    GRANT RESOURCE_GROUP_USER ON *.* TO 'USERNAME'@'%';

    다음을 바꿉니다.

    • USERNAME: 권한을 부여하려는 데이터베이스 사용자입니다.
  2. 사용자가 연결되면 다음을 실행합니다.

    SET RESOURCE GROUP GROUP_NAME;

    다음을 바꿉니다.

    • GROUP_NAME: 연결을 할당하려는 리소스 그룹의 이름입니다.

    또는 특정 스레드 ID를 지정합니다.

    SET RESOURCE GROUP GROUP_NAME FOR THREAD_ID;

    다음을 바꿉니다.

    • GROUP_NAME: 연결을 할당하려는 리소스 그룹의 이름입니다.
    • THREAD_ID: 할당하려는 특정 데이터베이스 스레드의 ID입니다.

최적화 도구 힌트를 통해 단일 쿼리를 그룹에 할당하려면 다음 단계를 따르세요.

DML 또는 SELECT 문 내에서 RESOURCE_GROUP 최적화 도구 주석 힌트를 사용합니다.

SELECT /*+ RESOURCE_GROUP(GROUP_NAME) */
  COLUMN_NAME_1,
  SUM(COLUMN_NAME_2)
FROM TABLE_NAME
GROUP BY COLUMN_NAME_1;

다음을 바꿉니다.

  • GROUP_NAME: 쿼리를 실행하려는 리소스 그룹의 이름입니다.
  • COLUMN_NAME_1: 결과를 그룹화하려는 열입니다.
  • COLUMN_NAME_2: 합산하려는 열 값입니다.
  • TABLE_NAME: 쿼리하려는 테이블입니다.

리소스 그룹 모니터링

구성된 리소스 그룹을 검사하려면 다음 단계를 따르세요.

SELECT * FROM INFORMATION_SCHEMA.RESOURCE_GROUPS;

활성 연결 스레드 및 할당된 리소스 그룹을 보려면 다음 쿼리를 실행합니다.

SELECT THREAD_ID, NAME, TYPE, RESOURCE_GROUP
  FROM performance_schema.threads;

다음 단계