본 문서에서는 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

Cloud SQL

비공개 서비스 액세스 연결:

  • VPC 네트워크당 연결이며 MemorystoreTensorFlowSQL과 같은 모든 관리형 서비스에서 사용할 수 있습니다.
  • VPC 네트워크 및 Google에서 소유한 네트워크 간에 VPC 피어링을 사용한 연결로서, 인스턴스 및 서비스가 내부 IP 주소를 사용하여 전용 통신을 할 수 있습니다.
  • 서비스 프로듀서 측에서 격리된 프로젝트가 생성되므로 다른 고객에게 공유되지 않습니다. 프로비저닝한 리소스 요금만 청구됩니다.

[ Cloud SQL Architecture ]

 

사전 결정사항

Cloud SQL 은 구글에서 완전 관리형 데이터베이스로 제공하는 DB이므로 패치, 보안, 백업, 스토리지 용량관리 등이 구글에 의해 자동 관리되는 편리성이 있습니다. 반대로 DB 서버 직접 접근이나 DB root 계정의 제약, 파라미터 제약 등이 있습니다.

Cloud SQL 을 사용할지 아니면 VM에 Mysql을 설치해서 사용할지 에 대한 충분한 검토가 선행되어야 합니다.

아래 내용은 DB 설치 전 결정해야 할 사항입니다.

  • Database version : 5.6, 5.7, 8.0 중 선택
  • character_set_server : Database 의 character 설정(5.7 이하 default는 latin1, 8.0 이상은 default는 utf8mb4)
  • lower_case_table_names : 테이블명 대.소문자 구분 여부(0 : 구분, 1 : 미구분)
  • default_time_zone : default는 UTC 이므로 KST로 설정하려면 default_time_zone 플래그값을 +09:00으로 변경
  • Cloud SQL 제약사항 : Cloud SQL과 표준 mysql과의 기능 차이 확인

 

Cloud SQL 생성 절차(MySQL)

1. GCP 계정으로 GCP 접속

2. 좌측 상단의 햄버거 메뉴를 클릭한 후 SQL 메뉴를 클릭한다.

 3. [인스턴스 만들기] 버튼을 클릭한다.

4. 데이터베이스 엔진선택 항목에서 [MySQL 선택] 버튼을 클릭한다.

 

 

5. 데이터베이스 생성을 위한 API사용 설정을 클릭합니다. Cloud SQL을 처음 생성할 경우에만 나타나고, 이미 사용 설정을 했다면 아래 화면은 나타나지 않습니다.

 

6. 데이터베이스 생성을 위한 인스턴스 정보, 리전 및 가용성, 인스턴스 설정(머신 유형, 용량, 백업, 플래그) 등의 정보를 입력합니다.

  • 인스턴스ID : 임의의 ID를 입력
  • 비밀번호 : MySQL root 패스워드로 사용됨
  • 데이터베이스 버전 : 현재 8.0, 5.7, 5.6 중 선택
  • 리전 : Cloud SQL을 설치하고자 하는 region 선택
  • 영역 가용성 : 단일 서비스를 할지 multi-region 서비스를 할지 선택(개발은 단일, 운영은 멀티영역)

인스턴스 맞춤설정

인스턴스 맞춤설정 영역에서 "구성 옵션 표시"를 클릭한다.

 

- 머신 유형 : 사용하고자 하는 머신 타입 선택(cpu, 메모리)

- 저장용량 : 필요 공간 선택 또는 입력

- 연결

인스턴스 IP 할당 : private IP를 설정할지 public IP를 설정할지 선택한 후 설정합니다. 본 문서에서는 비공개 IP를 선택합니다.

비공개 IP 선택 및 네트워크에서 vpc를 선택한 후 "비공개 서비스 액세스 연결 필요" 항목에서 [연결 설정] 버튼을 클릭한다.

새로운 화면에서 "IP 범위 할당"에 이름과 할당된 IP 주소범위를 입력한 후 [계속] 버튼과 [연결만들기] 버튼을 클릭한다.

여기에서 생성한 서비스 네트워크는 VPC 네트워크 세부정보의 "PRIVATE SERVICE CONNECT"에서 확인할 수 있으며, 반대로 VPC "PRIVATE SERVICE CONNECT"에서 생성한 네트워크를 Cloud SQL 생성 시 연결할 수도 있다.

본 문서에서는 이름은 sbn-aicallbot-sql-prd-10으로 IP주소범위는 10.0.8.0/24로 설정했다.

 

-- 아래 오류발생 시

'servicenetworking-googleapis-com' 비공개 연결 만들기

Cannot modify allocated ranges in CreateConnection. Please use UpdateConnection

--> 오류 조치

클라우드 쉘에서 아래 내용을 수행합니다.

gcloud beta services vpc-peerings update \
    --service=servicenetworking.googleapis.com \
    --ranges=sbn-aicallbot-sql-prd-03 \
    --network=vpc-aicallbot-prd \
    --project=pjt-aicallbot-prd \
    --force

 

"승인된 네트워크" 항목에서는 Cloud SQL에 접속할 수 있는 네트워크 대역을 설정합니다. 본 문서에서는 외부에서 접속을 가정하여 0.0.0.0/0 으로 설정했습니다.  공개 IP에 연결하려면 승인된 네트워크 또는 Cloud SQL 프록시를 사용해야 합니다.

 

유지보수 :

- 유지보수를 위한 업데이트되는 동안 인스턴스가 다시 시작되므로 서비스 중단이 발생할 수 있다. 이를 방지하기 위해서 유지보수 거부기간을 설정한다. 단 최대 90일 까지만 적용되므로 운영 단계에서는 주기적으로 설정해야 한다.

 

 

플래그 : MySQL DB 파라미터. 변경을 원하는 파라미터가 있을 경우 플래그 항목에서 설정

플래그 중 lower_case_table_names, default_time_zone, character_set_server 는 반드시 자신의 시스템에 맞도록 설정해야 합니다. character_set_server 는 utf8과 utf8mb4가 있는데 emoji 등 4byte 문자를 사용할 경우에는 utf8mb4를 지정하고 그렇지  않을 경우 공간의 효율을 위해 utf8로 설정합니다. 

 

설정을 완료했으면 [인스턴스 만들기] 버튼을 클릭하여 Cloud SQL 을 생성합니다.

 

오류

Invalid request: Private authorized network (10.0.0.0/22)..

추적 번호: c3848179179780577

--> 승인된 네트워크 설정 시 subnet인 10.0.0.0/22 입력값이 오류가 발생. 0.0.0.0/0 을 입력하니 오류는 발생하지 않음.

 

 

7. 아래와 같이 GCP 에서 제공하는 Cloud SQL인 mysql 서버가 생성된 것을 확인할 수 있습니다.

 

 

Cloud SQL (MySQL) 접속 방법

Cloud SQL DB에 접속하는 방법으로 DB관리 툴, GCP Cloud shell, Data Studio로 연결하는 방법을 설명합니다. DB 접속 도구는 MySQL Workbench, Toad for MySQL, SQuirrel, DBeaver 등이 있습니다. 본 문서에서는 HeidiSQL 툴로 접속하는 방법을 설명합니다.

 

1. DB 관리 툴(HeidiSQL)로 연결

GCP 콘솔에 로그인한 다음 좌측 상단의 햄버거 메뉴를 클릭한 후 SQL 메뉴를 클릭한다.

위에서 생성한 Cloud SQL 인스턴스에 대한 정보가 아래와 같이 표시됩니다. 공개IP주소는 외부에서 DB로 연결 시 필요한 정보입니다. 추가로, 외부에서 접속하기 위한 네트워크 설정(inbound 설정)이 필요합니다. 

네트워크 설정을 위해 인스턴스를 클릭한 후 좌측의 [연결] 메뉴를 클릭합니다. 우측에 나타나는 화면에서 [네트워크 추가]를 클릭합니다.

[네트워크 추가] 클릭 후 이름 항목에 원하는 이름을 입력하고(본 문서에서는 ALL 입력) 네트워크 항목에는 0.0.0.0/0 을 입력하고 [완료]를 클릭합니다. 최종 저장을 위해 하단의 [저장] 버튼을 클릭하여 변경된 사항을 저장합니다.

 
 
GCP Cloud SQL 에 접속하기 위해 DB 관리 툴인 HeidiSQL을 실행합니다.

설치가 되어 있지 않은 경우에는 https://www.heidisql.com/download.php 에서 HeidiSQL 을 다운로드 후 설치합니다.

설치 완료 후 heidisql 을 실행합니다. install 버전과 portable 버전에 따라 아래 화면은 다를 수 있습니다. 좌측 하단의 [신규] 버튼을 클릭하고 세션 이름은 원하는 이름으로 설정합니다. 

  • 네트워크 유형 : maraiDB or MySQL(TCP/IP) 선택
  • Library : libmysql.dll 선택
  • 호스트명 / IP : Cloud SQL 인스턴스의 공개 IP 입력
  • 사용자 : root 입력
  • 암호 : Cloud SQL 생성 시 입력했던 암호
  • 포트 : 3306
  • 데이터베이스 : 생략 가능
 [열기] 버튼을 클릭하여 DB 에 접속합니다.

2. Cloud Shell에서 연결

참고: Cloud Shell은 비공개 IP 주소에서 작동하지 않습니다.PUBLIC IP 주소가 있는 인스턴스에만 적용됩니다.

  1. Google Cloud Console의 오른쪽 상단 모서리에 있는 Cloud Shell 아이콘()을 클릭합니다. Cloud Shell 초기화가 완료되면 다음이 표시됩니다.
    Welcome to Cloud Shell! Type "help" to get started.
    username@cloudshell:~$
  2.  Cloud Shell 프롬프트에서 Cloud SQL 인스턴스에 연결합니다."CloudShell승인" 메시지창이 뜰 수 있습니다.
    gcloud sql connect demo-mysql --user=root
  3. 루트 비밀번호를 입력하고 엔터키를 입력하면 mysql 프롬프트가 표시됩니다.

 

 

3. 데이터 스튜디오로 연결

구글 데이터 스튜디오는 구글에서 만든 데이터 시각화 플랫폼입니다.

데이터 스튜디오 데이터 소스는 MySQL용 Cloud SQL 데이터베이스 커스텀 쿼리에 연결할 수 있습니다. 

스프레드시트, 애널리틱스, Google Ads, Google BigQuery 등의 데이터를 쉽게 연결할 수 있습니다.

원시 데이터를 보고서와 대시보드를 만드는 데 필요한 측정항목과 측정기준으로 변환합니다.

 

연결 방법

  1. 데이터 스튜디오에 접속합니다.(https://datastudio.google.com/)
  2. 왼쪽 상단에서 [만들기] 아이콘 버튼을 클릭 한 다음 
    데이터 소스를 선택합니다.
  3. 아래 화면이 나타나면 검색창에 mysql 을 입력하면 Mysql용 Cloud SQL 서비스 목록을 확인할 수 있습니다. MySQL용 Cloud SQL 커넥터를 선택합니다.
  4. 아래처럼 메시지가 표시되면 데이터 스튜디오에서 Cloud SQL에 액세스할 수 있도록 [승인]합니다.
  5. 데이터베이스 연결을 설정하는 방법은 다음과 같습니다. 
  6. 인스턴스연결이름, 데이터베이스, 사용자 이름, 비밀번호를 입력한 후 [인증] 버튼을 클릭합니다. 인스턴스 연결이름은 [SQL] 메뉴를 클릭하면 조회되는 SQL 인스턴스 정보 중 "인스턴스 연결 이름" 에서 확인할 수 있습니다. [인증] 버튼을 클릭합니다.
     
  7. 인증 버튼을 클릭하면 접속한 데이터베이스의 테이블 목록이 나열됩니다.

 

 

4. Cloud 프록시를 통한 연결

아래의 다이어그램은 Cloud SQL 인증 프록시가 Cloud SQL에 연결되는 방식을 보여준다. Proxy 방식으로 연결하는 방법을 설명을 생략합니다.

Cloud SQL 프록시를 사용해서 Cloud SQL 인스턴스에 엑세스할 수 있습니다.

2.1 Cloud SQL Admin API 사용 설정

GCP 콘솔의 검색창에 "cloud sql admin api"를 입력하여 cloud sql admin api 를 검색 후 클릭합니다.

2.2 Cloud SQL Admin API 가 사용 설정으로 되어 있지 않은 경우, [사용 설정] 버튼을 클릭합니다. 이미 사용설정이 되어 있는 경우에는 "API 사용 설정됨"이 보여집니다.

2.3 프록시 설치

5. 비공개 IP 로 연결

비공개 IP를 이용한 Cloud SQL 연결을 사용할 경우 “할당된 IP 주소 범위”를 정의하고 비공개 서비스 연결을 만들어야 합니다.

(AWS 와 비교하면 VPC와 subnet으로 생각하면 될 것 같습니다.)

 

Cloud SQL 생성하기

SQL - 인스턴스 만들기 -> MySQL 선택

영역지정 하위의 [연결 ] 클릭한 다음 비공개IP 항목 선택 후 네트워크에서 관련 VPC 를 선택

할당된 IP 범위사용 항목에 VPC에 생성한 Private Service Connection(subnet) 선택

[인스턴스 만들기] 클릭하여 Cloud SQL 인스턴스 생성.

Cloud SQL 생성이 완료되면 SQL 목록에서 인스턴스의 IP 주소를 확인할 수 있습니다.

 

접속 테스트

접속 테스트를 위한 같은 VPC 내에 VM 인스턴스를 생성합니다.

클라우드 쉘이나 SSH 등을 통해 VM 인스턴스에 접속합니다. 클라우드 쉘에서는 private IP로 Cloud SQL 에 접속할 수 없습니다.

MySQL DB에 접속하기 위해 Mysql client 설치 후 mysql 접속 명령어를 수행합니다.

# MySQL 클라이언트를 설치합니다.
# debian 인 경우에는 sudo apt-get install default-mysql-client 실행
$ sudo apt-get install mysql-client

# 생성한 Cloud SQL에 원격으로 접속합니다.
$ mysql -h 10.10.0.3 -u root -p
Enter password:

Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 5.7.25-google-log (Google)
Copyright © 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

MySQL [(none)] > create database firstdb;

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| firstdb            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.035 sec)

 

6. gcloud cli로 연결

GCP 콘솔에서 CLOUD SHELL 을 클릭하여 터미널창을 엽니다.

터미널창에 아래 명령어를 입력합니다.  <인스턴스 연결이름> 부분은 각자가 생성한 Cloud SQL 의 이름으로 수정하면 됩니다.

gcloud sql connect <인스턴스 연결이름> --user=root --quiet

$ gcloud sql connect demo-mysql --user=root --quiet

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>

 

8. ssh 터널링으로 연결

ssh 터널링으로 Cloud SQL 에 접속하는 방법입니다.

 

ssh -L <Local Port>:<Cloud SQL IP>:<Cloud SQL Port>    <username>@<SSH Server IP>

  • Local Port : 로컬 서버의 Port(사용자고자 하는 임의의 Port)
  • Cloud SQL IP : Cloud SQL 서버의 IP
  • Cloud SQL Port : Cloud SQL의 Port( default Port :  mysql 은 3306, MS SQL은 1433, PostgreSQL은 5432)
  • username : SSH Server의 접속계정
  • SSH Server IP : SSH Server IP Address 

 

예)   ssh -L 3309:10.122.225.100:3306 user1@34.64.227.33 처럼 명령어를 수행하면 SSH Server에 접속하면서 user1에 대한 패스워드를 묻게 되는데, 패스워드를 입력한 후 접속하면 SSH 터널링이 맺어진 상태가 됩니다. 

터널링이 맺어진 상태에서 로컬 서버에서 Cloud SQL에 접속하려면 mysql 툴에 Hostname/IP 란에 localhost 또는 127.0.0.1 을 입력하고 Port에는 2209를 입력한 후 접속하면 접속이 정상적으로 이루어집니다.

 

SSH 터널링 설정 명령어

ssh -L <Local Port>:<Cloud SQL IP>:<Cloud SQL Port> <username>@<SSH Server IP>

 

 

9. Cloud SQL 인증 프록시 시작

Cloud SQL 인증 프록시를 사용하여 로컬 테스트 환경에서 Cloud SQL에 연결하는 방법을 보여줍니다. Cloud SQL 인증 프록시를 사용하면 승인된 네트워크나 SSL 구성 없이도 Cloud SQL 인스턴스에 액세스할 수 있습니다. 

 

Cloud SQL Admin API를 사용 설정합니다.API 사용 설정

Cloud SQL 인스턴스 만들기

Google Cloud Console에서 인스턴스를 생성합니다.

  1. Google Cloud Console에서 Cloud SQL 인스턴스 페이지로 이동합니다. 좌측 햄버거 메뉴에서 "SQL" 을 클릭하던지 클라우드 콘솔 검색창에 sql을 입력하여 [제품 및 페이지]에서 SQL을 선택합니다.
  2. 인스턴스 만들기를 클릭합니다.
  3. MySQL을 클릭합니다.
  4. Compute API를 사용 설정하라는 메시지가 표시되면 API 사용 설정 버튼을 클릭합니다.
  5. 인스턴스 ID에 myinstance를 입력합니다.
  6. 루트 사용자의 비밀번호를 입력합니다.
  7. 다른 필드에는 기본값을 사용합니다.
  8. 만들기를 클릭합니다.참고: 이 예시에서는 공개 IP 주소를 포함한 기본 설정을 사용하여 인스턴스가 생성됩니다.

mysql 클라이언트 설치

본 문서에서는 Google VM instance OS인 Debian linux 에 설치합니다.

$ sudo apt-get install default-mysql-client

 

Cloud SQL 인증 프록시 클라이언트 설치

사용 중인 운영체제 및 운영체제가 사용하는 커널(32비트 또는 64비트)에 따라 다른 Cloud SQL 인증 프록시 바이너리를 다운로드합니다. 대부분의 최신 하드웨어는 64비트 커널을 사용합니다. 머신에서 32비트 커널을 실행 중인지 또는 64비트 커널을 실행 중인지 확실하지 않은 경우 Linux 또는 macOS에서 uname -a 명령어를 사용합니다. Windows의 경우 Windows 문서를 참조하세요.

 

본 문서에서는 GCP에 생성한  VM 인스턴스에 설치합니다.

sql proxy 서버로 사용할 새로운 VM instance를 생성하고 접속하여 아래 명령어를 수행합니다.

## wget 이 설치되어 있지 않을 경우 wget 설치
$ sudo apt install wget

$ wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
$ chmod +x cloud_sql_proxy

 

인스턴스 연결 이름 확인

Cloud SQL 인증 프록시에 접속할 인스턴스명을 확인하기 위해 Cloud SQL의 인스턴스 연결이름을 확인합니다.

본 문서에서는 advance-casing-340704:asia-northeast3:demo-mysql 이름을 사용합니다.

  1. Google Cloud Console에서 Cloud SQL 인스턴스 페이지로 이동합니다.
  2. 인스턴스 이름을 클릭하여 개요 페이지를 엽니다.
  3. 인스턴스에 연결 섹션에서 연결 이름을 복사합니다. 연결 이름은 projectID:region:instanceID 형식입니다.

 

Cloud SQL 인증 프록시 시작

Cloud SQL 인증 프록시를 시작하기 위해 아래와 같은 명령어 형식을 사용합니다.

./cloud_sql_proxy -instances=INSTANCE_CONNECTION_NAME=tcp:3306

INSTANCE_CONNECTION_NAME은 이전 단계에서 확인한 인스턴스 연결 이름으로 바꿉니다.

 

Linux 환경의 경우 다음 명령어를 사용하여 Cloud SQL 인증 프록시를 시작합니다.

./cloud_sql_proxy -instances=advance-casing-340704:asia-northeast3:demo-mysql=tcp:3306
$ ./cloud_sql_proxy -instances=advance-casing-340704:asia-northeast3:demo-mysql=tcp:3306
2022/02/16 08:31:16 Rlimits for file descriptors set to {Current = 8500, Max = 1048576}
2022/02/16 08:31:17 errors parsing config:
        googleapi: Error 403: Request had insufficient authentication scopes.
Details:
[
  {
    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
    "domain": "googleapis.com",
    "metadata": {
      "method": "google.cloud.sql.v1beta4.SqlConnectService.GetConnectSettings",
      "service": "sqladmin.googleapis.com"
    },
    "reason": "ACCESS_TOKEN_SCOPE_INSUFFICIENT"
  }
]

More details:
Reason: insufficientPermissions, Message: Insufficient Permission

위와 같이 Insufficient Permission 이 발생할 경우, VM 인스턴스를 중지한 후

Compute Engine > VM instance details > Identity and API access(api 및 ID 관리) 항목에서 서비스 계정의 액세스 범위를 

"모든 Cloud API에 대한 전체 액세스 허용"으로 변경 후 인스턴스를 기동합니다.

또는  Identity and API access(api 및 ID 관리) 항목에서 "각 API에 액세스 설정" 선택 후 Cloud SQL 항목을 "사용 설정됨"으로 선택합니다.

 
다시 접속을 시도해 보니 아래와 같은 에러가 발생했습니다. 
googleapi: Error 403: The client is not authorized to make this request., notAuthorized
 
 
두 번째 오류 처리를 위해 아래 명령어를 수행하고 다시 접속시도를 했으나, 동일한 오류가 발생했습니다.
아래 명령어를 수행하면 url 접속 정보가 뜨는데 브라우저로 접속하면 구글 접속계정이 화면에 표시되고 계정을 클릭하면 인증코드가 발행됩니다. 이 인증코드를 아래 화면에 입력하면 인증파일이 생성됩니다.
$ gcloud auth application-default login

You are running on a Google Compute Engine virtual machine.
The service credentials associated with this virtual machine
will automatically be used by Application Default
Credentials, so it is not necessary to use this command.
... ...
Do you want to continue (Y/n)? Y

Go to the following link in your browser:

    https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=764086051850-6qr4p6gpi6hn506pt8ejuq83di341hur.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&scope=openid+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Faccounts.reauth&state=jyPBenHBlKW9ZGmL090wTmjX5w63fI&prompt=consent&access_type=offline&code_challenge=VCXpHUS9G_Y0yEWPDuHZpgFhQsNV3UKBOoOSfuG5Qdc&code_challenge_method=S256
    
    Enter verification code:
 
 
프록시를 사용하여 연결할 때는 프록시가 구글 클라우드 플랫폼으로 인증해야 합니다. Cloud SDK 사용자 인증 정보를 사용하거나, 생성한 서비스 계정의 로컬 키 파일 경로를 프록시에 제공할 수 있습니다.
 
추가로, SQL 클라이언트의 모든 송신 port가 deny 되어 있는 경우, SQL proxy를 사용하려면 3307 port가 오픈되어 있어야 합니다.
참고: Cloud SQL Auth 프록시는 3307을 사용하여 Cloud SQL Auth 프록시 서버에 연결합니다. 포트 3306은 직접 TCP 연결의 MySQL 프로토콜에 대한 기본 포트입니다(Cloud SQL 인증 프록시 사용 안 함)
참고문서 : https://cloud.google.com/sql/docs/mysql/connect-admin-proxy?hl=ko
 
 
1) Cloud SDK 사용자 인증 
위에서 생성한 인증파일을 아래처럼 -credential_file의 PATH_TO_KEY_FILE​ 경로에 추가하고 다시접속을 하니 접속이 성공적으로 이루어졌습니다.
./cloud_sql_proxy \
-instances=advance-casing-340704:asia-northeast3:demo-mysql=tcp:3306 \
-credential_file=.config/gcloud/application_default_credentials.json
  • advance-casing-340704:asia-northeast3:demo-mysql : Cloud SQL 인스턴스 connection 이름
  • tcp:3306 : SQL Proxy 서버 Port
  • credential_file : Cloud SQL 서버접속에 필요한 인증파일
 
2) 서비스 계정 인증 
"IAM 및 관리자" -> "서비스 계정" -> "서비스 계정 만들기" 를 클릭합니다.
  • 서비스 계정 이름 : 원하는 서비스 계정 이름을 입력
  • 서비스 게정 ID : 서비스 계정 이름에 따라 생성되므로 특별한 경우가 아니면 수정하지 않는다.

[만들고 계속하기] 버튼을 클릭합니다.

아래 화면이 나타나면 "역할 선택"을 클릭하고 "편집자"를 선택합니다. [계속] 버튼을 클릭합니다.

 아래 화면이 나타나면 "서비스 계정 관리자 역할" 텍스트 박스에 GCP 계정을 입력합니다. 선택사항이므로 입력을 하지 않아도 됩니다. [완료] 버튼을 클릭합니다.

 생성된 서비스 계정을 클릭한 후 "키" 탭을 클릭합니다. "키 추가" drop-down 리스트 박스를 클릭한 후 "새 키 만들기"를 클릭합니다.

 아래 화면이 나오면 원하는 방식의 키 유형을 선택한 후 [만들기]를 클릭합니다.

비 공개 키가 PC로 다운로드 됩니다. 이 키를 Cloud SQL Proxy 를 설정할 VM 인스턴스에 전송합니다.
 
 
아래 내용부터는 사용자 인증 방식과 서비스 계정 인증 방식이 동일합니다.
./cloud_sql_proxy -instances=advance-casing-340704:asia-northeast3:demo-mysql=tcp:10.178.0.2:3306 -credential_file=/home/ypjeong/.config/gcloud/application_default_credentials.json
 
 
 

다음과 유사한 메시지가 나타납니다.

Listening on 127.0.0.1:3306 for INSTANCE_CONNECTION_NAME
Ready for new connections
 

만일, 프록시 서버의 IP 또는 프록시 서버의 local IP로 Cloud SQL DB 접속이 가능하게 하려면, 아래처럼 instances에 나열해 주면 됩니다. 마지막의 '&' 문자는 백그라운드로 실행하라는 명령문입니다. foreground로 실행하려면 '&' 문자를 없애고 실행하면 됩니다.

./cloud_sql_proxy \
-instances=advance-casing-340704:asia-northeast3:demo-mysql=tcp:3306,advance-casing-340704:asia-northeast3:demo-mysql=tcp:10.178.0.2:3306 \
-credential_file=.config/gcloud/application_default_credentials.json &

 

** 참고 ** 

위와 같이 실행한 경우 sql proxy 를 수행한 화면에 접속 log 등이 출력됩니다. 이를 최소화 하려면 아래 방법을 사용합니다.

cloud_sql_proxy --quiet
cloud_sql_proxy -verbose=false
cloud_sql_proxy -log_debug_stdout > /dev/null

quiet : 로그 메시지를 비활성화합니다(예: 새 연결이 설정된 경우). 경고: 이 옵션은 모든 로깅 출력(연결 오류 포함)을 비활성화하여 디버깅을 어렵게 만들 수 있습니다. -quiet 플래그는 -verbose 플래그보다 우선합니다.

verbose : 명시적으로 false로 설정하면 오류나 최초 시작 메시지가 아닌 로그 메시지를 비활성화합니다(예: 새 연결이 설정된 경우).
또는 오류 없이 닫힙니다).

log_debug_stdout : 이것은 표준 오류 대신 표준 출력에 오류가 아닌 출력을 기록하기 위한 것입니다. 예를 들어 연결 관련 메시지가 오류로 기록되지 않도록 하려면 이 플래그를 true로 설정하십시오. 기본값은 false입니다.

 

 

아래 명령어로 프록시 프로세스가 Listen하고 있는지 확인합니다.

위에서 수행한 instances 목록에 기술된대로 로컬 loopback IP와 Private IP에 포트가 할당되어 LISTEN 하고 있는 것을 확인할 수 있습니다.

$ netstat -ntlp | grep 3306

tcp        0      0 10.178.0.2:3306         0.0.0.0:*               LISTEN      1166/./cloud_sql_pr
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      1166/./cloud_sql_pr

 

SQL proxy server에서 아래 명령어를 수행하면 Cloud SQL DB로 접속할 수 있습니다.

$ mysql -u root -p --host 127.0.0.1 --port 3306
또는
$ mysql -u root -p --host 10.178.0.2 --port 3306

Enter password: 프롬프트에서 MySQL 루트 사용자 계정의 비밀번호를 입력합니다.

MySQL 프롬프트가 표시되는지 확인합니다. mysql 클라이언트를 사용하여 데이터베이스에 연결했습니다.

Cloud SQL 인증 프록시를 시작한 터미널 창으로 돌아갑니다.

추가로, On-prem과 구글 클라우드가 전용선 또는 VPN을 이용하여 연결되어있고, On-prem 장비에서 클라우드의 데이터베이스로 연결을 할 경우는 다음과 같이 클라우드 라우터를 이용하여 직접 라우팅이 되거나, 프록시를 통하여 연결하는 구성 또한 가능합니다.
 
 
 

 

 

 

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

Monitoring slow queries in MySQL with Cloud Logging and Monitoring  (0) 2022.02.18

+ Recent posts