본 문서에서는 Cloud Logging 및 Monitoring 을 사용하여 MySQL용 Cloud SQL 느린 쿼리를 기록하고 모니터링하는 방법을 설명합니다.

MySQL 의 느린 쿼리 로그 기능을 사용하면 미리 정의된 시간 제한을 초과하는 쿼리를 기록할 수 있습니다. 이는 비효율적이거나 시간 소모적인 쿼리를 찾는 작업을 크게 단순화합니다. 이러한 로그를 Cloud Logging 및 Monitoring과 통합하면 데이터베이스 성능을 주시하여 최적화가 필요한 쿼리를 식별하고 선택적으로 느린 쿼리가 너무 많은 경우 알림을 받을 수 있습니다.

이 가이드는 Compute Engine에서 실행되는 자체 관리형 MySQL 인스턴스에도 사용할 수 있습니다.

 

목표

  • Cloud SQL에서 느린 쿼리 로그를 사용 설정하는 방법을 알아보세요.
  • Cloud Logging에서 느린 쿼리 로그에 액세스하는 방법을 알아보세요.
  • 경고 및 문제 해결을 위한 로그 기반 측정항목을 만드는 방법을 알아보세요.

비용

본 문서에서는다음 Google Cloud 구성요소를 사용합니다. 비용이 발생합니다.

  • MySQL용 Cloud SQL(본 문서에스는 demo-mysql 인스턴스ID를 사용)
  • 클라우드 로깅
  • 클라우드 모니터링

MySQL용 Cloud SQL에 느린 쿼리 로그 사용 설정

MySQL용 Cloud SQL은 GCP에서 MySQL 데이터베이스를 쉽게 설정, 유지, 관리할 수 있는 완전 관리형 데이터베이스 서비스입니다. Cloud SQL에는 Cloud Logging 통합이 내장 되어 있으므로 로그 뷰어에서 MySQL 로그를 사용할 수 있습니다.

  1. Cloud Shell 을 열고 기본 영역 을 설정합니다 .
    gcloud config set compute/zone asia-northeast3-b
  2. SQL Admin API를 활성화합니다.
    gcloud services enable sqladmin.googleapis.com
    
  3. 느린 쿼리 로그 를 사용 설정 하려면 적절한 MySQL 구성 플래그 를 사용 하여 Cloud SQL의 테스트 인스턴스를 만듭니다.
    gcloud sql instances create demo-mysql --zone asia-northeast3-b --root-password=[PASSWORD] --database-flags=log_output='FILE',slow_query_log=on,long_query_time=2
    선택한 [PASSWORD]보안 암호로 바꾸십시오.
  4. 느린 쿼리 로그는 기본적으로 2초 이상 걸리는 SQL 문을 로깅합니다. long_query_time플래그 값을 조정하여 이 필터링을 제어할 수 있습니다 .기본적으로 느린 쿼리 로그는 MySQL에서 활성화되어 있지 않습니다. 느린 쿼리가 활성화되지 않은 기존 데이터베이스 인스턴스를 사용하는 경우 다음을 사용 gcloud sql instances patch하여 플래그를 설정할 수 있습니다.
gcloud sql instances patch demo-mysql --database-flags=log_output='FILE',slow_query_log=on,long_query_time=2

 

느린 쿼리 로그 보기

로깅 뷰어에서 느린 쿼리 로그를 보려면 다음을 수행합니다.

  1. 로그 뷰어 페이지 로 이동합니다.(검색창에 logging을 입력한 후 검색된 "로깅" 을 클릭합니다.)
  2. 리소스 드롭다운에서 Cloud SQL 를릭 및 본인이 생성한 Cloud SQL 인스턴스ID를 선택 후 [추가]를 클릭합니다.
  3. 로그이름 드롭다운에서 mysql-slow.log 를 선택한 후 [추가] 버튼을 클릭합니다.

부하 테스트로 샘플 데이터 생성

부하 테스트를 실행하여 모니터링할 느린 쿼리를 만듭니다.

로그 뷰어에 느린 쿼리가 이미 표시되어 있는 기존 데이터베이스를 사용하는 경우 이 섹션을 건너뛰고 다음 섹션으로 바로 진행할 수 있습니다.

MySQL에는 mysqlslap이라는 진단 도구가 함께 제공됩니다. 이 도구를 사용하여 데이터베이스 서버에 대한 동시 연결을 시뮬레이션하여 부하 테스트를 수행합니다.

  1. Cloud Shell에서 MySQL에서 제공 하는 샘플 데이터가 포함된 오픈소스 Git 저장소를 복제합니다.git이 없는 경우 sudo install git 명령어로 설치한 후 실행합니다.
    git clone https://github.com/datacharmer/test_db
    cd test_db
    
  2. employees 데이터베이스를 MySQL 인스턴스로 가져옵니다 .
    gcloud sql connect demo-mysql --user=root < employees.sql
    이전에 메시지가 표시되면 선택한 루트 암호를 입력합니다.
     
    Connecting to database with SQL user [root]. Enter password:
    INFO
    CREATING DATABASE STRUCTURE
    INFO
    storage engine: InnoDB
    INFO
    LOADING departments
    INFO
    LOADING employees
    INFO
    LOADING dept_emp
    INFO
    LOADING dept_manager
    INFO
    LOADING titles
    INFO
    LOADING salaries
    data_load_time_diff
    00:01:00
    
  3. 리소스를 많이 사용하는 SQL 쿼리 목록이 있는 파일을 만듭니다.
    cat << EOF >select_query.sql
    use employees;
    SELECT * FROM salaries WHERE salary > 0 LIMIT 100000;
    SELECT departments.dept_name,dept_emp.from_date,employees.* FROM departments LEFT JOIN dept_emp ON (departments.dept_no = dept_emp.dept_no) LEFT JOIN employees ON (dept_emp.emp_no = employees.emp_no) WHERE to_date = '9999-01-01' LIMIT 100000;
    SELECT employees.* FROM employees LEFT JOIN dept_emp ON ( dept_emp.emp_no = employees.emp_no ) LEFT JOIN salaries ON ( salaries.emp_no = salaries.emp_no ) WHERE employees.first_name LIKE '%Jo%' AND salaries.from_date > '1993-01-21' AND salaries.to_date < '1998-01-01' limit 1000000;
    EOF
    
  4. Cloud Shell 인스턴스의 공개 IP 주소에 Cloud SQL 인스턴스에 대한 액세스 권한을 부여합니다.
    gcloud sql instances patch demo-mysql --authorized-networks=$(dig +short myip.opendns.com @resolver1.opendns.com)
    이 명령은 이전에 승인된 모든 네트워크를 덮어쓰고 승인을 취소합니다. 기존 Cloud SQL 인스턴스를 사용하는 경우 액세스가 필요한 다른 네트워크 또는 IP 주소를 포함합니다.
  5. Cloud Shell 인스턴스가 시간 초과되고 다시 연결하면 새 공개 IP가 있을 수 있습니다. 액세스를 다시 활성화하려면 이 명령을 다시 실행하십시오.
  6. Cloud SQL 인스턴스의 공개 IP 주소를 환경 변수로 추출합니다.
    MYSQL_IP=$(gcloud sql instances list --filter="name:demo-mysql" --format="value(PRIMARY_ADDRESS)")
  7. 5개의 동시 연결(옵션)을 사용하여 위 mysqlslap의 쿼리(옵션)를 50회 실행 하여 부하 테스트를 시작합니다 . 데이터베이스 루트 암호로 바꾸십시오 .--number-of-queries--concurrency[PASSWORD]
    mysqlslap --no-defaults --user=root --password=[PASSWORD] --host=${MYSQL_IP} --concurrency=5 --number-of-queries=50 --create-schema=employees --query="./select_query.sql" --delimiter=";" --verbose --iterations=1
    샘플 출력:
    Benchmark
        Average number of seconds to run all queries: 103.712 seconds
        Minimum number of seconds to run all queries: 103.712 seconds
        Maximum number of seconds to run all queries: 103.712 seconds
        Number of clients running queries: 10
        Average number of queries per client: 50
    
    테스트에는 몇 분이 소요될 수 있습니다.
  8. 테스트가 완료되면 Cloud Logging 로그 뷰어 페이지 로 돌아갑니다.(검색창에 logging을 입력한 후 검색된 "로깅" 을 클릭합니다.)
  9. 리소스 드롭다운에서 Cloud SQL을 클릭한 후 및 본인이 생성한 Cloud SQL 인스턴스ID를 선택 후 [추가]를 클릭합니다.
  10. 로그이름 드롭다운에서 mysql-slow.log 를 선택한 후 [추가] 버튼을 클릭합니다.
  11.  

SELECT 로 시작하는 부하 테스트의 느린 쿼리를 볼 수 있습니다.

 

 
sudo service google-fluentd restart

MySQL 느린 쿼리 로그 켜기

기본적으로 MySQL은 느린 쿼리 를 기록하지 않습니다 . 이를 활성화하려면 루트로 MySQL에 연결하고 루트 암호를 입력하십시오.

 
mysql -u root -p

mysql>프롬프트 에서 다음 명령을 입력 합니다.

 
SET GLOBAL slow_query_log_file = '/var/log/mysql/mysql-slow.log';
SET GLOBAL long_query_time = 2;
SET GLOBAL slow_query_log = 'ON';

이제 MySQL은 2초 이상 걸리는 모든 쿼리를 기록합니다. 의 값을 조정하여 이 임계값을 변경할 수 있습니다 long_query_time.

이제 느린 쿼리 로그가 google-fluentd예상되는 위치에 기록되고 있는지 확인합니다.

 
sudo cat /var/log/mysql/mysql-slow.log

예상 출력:

 
/usr/sbin/mysqld, Version: 5.7.26-log (MySQL Community Server (GPL)). started with:
Tcp port: 0 Unix socket: /var/run/mysqld/mysqld.sock
Time         Id Command  Argument

이 설정은 일시적이며 MySQL을 다시 시작하면 손실됩니다. 이를 유지하려면 MySQL 옵션 파일 (일반적으로 /etc/mysql/mysql.conf.d/mysqld.cnf)을 찾아 루트로 파일을 편집하고 다음 행을 추가하거나 주석 처리를 제거하십시오.

 
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2

이제 느린 쿼리 로그에 대해 MySQL 및 Cloud Logging을 구성했습니다. 위의 "부하 테스트로 샘플 데이터 생성" 섹션으로 진행합니다.

'GCP > Cloud SQL' 카테고리의 다른 글

GCP-Cloud SQL 생성(MySQL)  (0) 2022.02.08

+ Recent posts