본 문서에서는 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 로그를 사용할 수 있습니다.
- Cloud Shell 을 열고 기본 영역 을 설정합니다 .
gcloud config set compute/zone asia-northeast3-b
- SQL Admin API를 활성화합니다.
gcloud services enable sqladmin.googleapis.com
- 느린 쿼리 로그 를 사용 설정 하려면 적절한 MySQL 구성 플래그 를 사용 하여 Cloud SQL의 테스트 인스턴스를 만듭니다.
선택한 [PASSWORD]보안 암호로 바꾸십시오.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
- 느린 쿼리 로그는 기본적으로 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
느린 쿼리 로그 보기
로깅 뷰어에서 느린 쿼리 로그를 보려면 다음을 수행합니다.
- 로그 뷰어 페이지 로 이동합니다.(검색창에 logging을 입력한 후 검색된 "로깅" 을 클릭합니다.)
- 리소스 드롭다운에서 Cloud SQL 를릭 및 본인이 생성한 Cloud SQL 인스턴스ID를 선택 후 [추가]를 클릭합니다.
- 로그이름 드롭다운에서 mysql-slow.log 를 선택한 후 [추가] 버튼을 클릭합니다.
부하 테스트로 샘플 데이터 생성
부하 테스트를 실행하여 모니터링할 느린 쿼리를 만듭니다.
로그 뷰어에 느린 쿼리가 이미 표시되어 있는 기존 데이터베이스를 사용하는 경우 이 섹션을 건너뛰고 다음 섹션으로 바로 진행할 수 있습니다.
MySQL에는 mysqlslap이라는 진단 도구가 함께 제공됩니다. 이 도구를 사용하여 데이터베이스 서버에 대한 동시 연결을 시뮬레이션하여 부하 테스트를 수행합니다.
- Cloud Shell에서 MySQL에서 제공 하는 샘플 데이터가 포함된 오픈소스 Git 저장소를 복제합니다.git이 없는 경우 sudo install git 명령어로 설치한 후 실행합니다.
git clone https://github.com/datacharmer/test_db cd test_db
- 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
- 리소스를 많이 사용하는 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
- Cloud Shell 인스턴스의 공개 IP 주소에 Cloud SQL 인스턴스에 대한 액세스 권한을 부여합니다.
이 명령은 이전에 승인된 모든 네트워크를 덮어쓰고 승인을 취소합니다. 기존 Cloud SQL 인스턴스를 사용하는 경우 액세스가 필요한 다른 네트워크 또는 IP 주소를 포함합니다.gcloud sql instances patch demo-mysql --authorized-networks=$(dig +short myip.opendns.com @resolver1.opendns.com)
- Cloud Shell 인스턴스가 시간 초과되고 다시 연결하면 새 공개 IP가 있을 수 있습니다. 액세스를 다시 활성화하려면 이 명령을 다시 실행하십시오.
- Cloud SQL 인스턴스의 공개 IP 주소를 환경 변수로 추출합니다.
MYSQL_IP=$(gcloud sql instances list --filter="name:demo-mysql" --format="value(PRIMARY_ADDRESS)")
- 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
- 테스트가 완료되면 Cloud Logging 로그 뷰어 페이지 로 돌아갑니다.(검색창에 logging을 입력한 후 검색된 "로깅" 을 클릭합니다.)
- 리소스 드롭다운에서 Cloud SQL을 클릭한 후 및 본인이 생성한 Cloud SQL 인스턴스ID를 선택 후 [추가]를 클릭합니다.
- 로그이름 드롭다운에서 mysql-slow.log 를 선택한 후 [추가] 버튼을 클릭합니다.
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 |
---|