GW LABS

Google Cloud StudyJam (9) - Cloud SQL 본문

Infrastructure/Cloud Computing

Google Cloud StudyJam (9) - Cloud SQL

GeonWoo Kim 2020. 12. 19. 19:06

Google Cloud StudyJam

이번 포스팅은 GCP의 Cloud SQL에 대해 알아본다. 데이터베이스는 IT 서비스에서 핵심이라고 볼 수 있다. 다양한 비즈니스 로직들은 유실되어도 데이터만 있다면 복구할 수 있다. 비즈니스 로직을 다시 개발자가 만들면 된다. 힘든 일이지만 가능하다. 그러나 데이터가 유실된다면 데이터는 복구할 수가 없다. 전체 서비스는 이전에 사용자들이 생성한 데이터를 제공할 수 없고, 사용자들의 불만사항은 법적인 이슈로까지 갈 수 있을 것이다. 이렇게 중요한 데이터베이스 서비스를 GCP에서는 어떻게 제공하는지 알아보자.

 

Cloud SQL

Cloud SQL은 GCP에서 제공하고 있는 완전 관리형 데이터베이스 서비스이다. GCP에서는 Cloud SQL용 데이터베이스 엔진으로 MySQL, PostgreSQL, SQL Server를 제공한다. 아쉽게도 Oracle은 지원하지 않는 것 같다. MySQL용 Cloud SQL을 기준으로 Cloud SQL의 주요 기능을 보면 다음과 같다.

  • Cloud SQL 프록시 또는 SSL/TLS 프로토콜을 사용한 보안 외부 연결 지원
  • 비공개 IP 지원
  • 자동 장애 조치로 여러 영역 간에 데이터 복제
  • 데이터 덤프롤 통해 데이터베이스 가져오기, 내보내기 기능
  • 주문형 자동 백업 및 특정 시점 복구

위와 같이 다양한 부가 기능들을 지원한다. VM 인스턴스로 직접 데이터베이스를 생성하고 운영한다면 개발자가 직접 운영상의 문제들을 모두 다뤄야할 것이다. 데이터베이스의 장애 대응 조치와 백업 등을 Cloud SQL의 기능을 사용해서 운영상의 비용들을 상당히 줄일 수 있다.

 

Cloud SQL 실습

이번 포스팅에서는 Cloud SQL 인스턴스를 생성하고 레플리케이션을 생성하여 Cloud SQL의 Scale-out 기능을 살펴보려고 한다. MySQL 쓰기 노드 1개와 읽기 노드 2개가 생성될 것이다. 하지만 이렇게 여러 Cloud SQL 인스턴스를 생성해도 Cloud SQL은 로드 밸런싱 기능을 지원하지 않는다. 그렇기 때문에 ProxySQL이라는 소프트웨어를 통해 쿼리 트래픽을 나누는 설정을 살펴볼 것이다. 

사실 이렇게 Cloud SQL의 scale-out 구조를 설정하는 데에 데이터베이스 자체에 대한 지식이 더 필요하다. MySQL을 scale-out을 편하게 해주는 ProxySQL에 대해서는 향후 다른 포스팅에서 다뤄야겠다. 데이터베이스의 다양한 확장 전략에 대해서도 마찬가지로 다른 포스팅에서 다루겠다.

 

Cloud SQL

Cloud SQL 화면으로 진입하여 CREATE INSTANCE 버튼을 통해 인스턴스를 만들어주자.

 

MySQL 인스턴스 생성1
MySQL 인스턴스 생성 2

위와 같이 MySQL 인스턴스를 생성했다. 만약 인스턴스에 입력할 데이터가 있다면 입력하는 것을 추천한다. 그러면 ProxySQL로 실제 쿼리 트래픽이 분산되는지 확인 할 수 있을 것이다. MySQL 인스턴스 생성 완료되는 데에 시간이 오래걸린다. 이 때 ProxySQL 서버로 사용할 VM 인스턴스를 하나 생성해주자.

 

ProxySQL 서버용 VM 인스턴스

위와 같이 ProxySQL용 서버도 생성해줬다. 여기에 SSH로 접속하여 필요한 소프트웨어들을 설치할 것이다. 아래의 명령어들을 통해서 필요한 소프트웨어들을 설치할 수 있다.

 

wget https://github.com/sysown/proxysql/releases/download/v1.4.4/proxysql_1.4.4-debian9_amd64.deb
dpkg -i proxysql_1.4.4-debian9_amd64.deb
sudo service proxysql start
sudo apt-get install default-mysql-client

 

ProxySQL 및 Mysql 클라이언트 설치

위와 같이 설치를 완료했다면 MySQL 인스턴스 설정이 완료되었을 것이다. MySQL 인스턴스에 ProxySQL 인스턴스가 접속할 수 있도록 아래 그림처럼 네트워크 설정을 해줘야한다. 

 

MySQL 인스턴스에서 ProxySQL 서버가 접근할 수 있도록 네트워크 설정
네트워크 설정이 완료되었다면 ProxySQL 서버에서 위와 같이 mysql 클라이언트로 접속이 가능하다.

 

네트워크 설정이 완료되었다면 다시 ProxySQL 서버에서 ProxySQL을 실행하여 설정을 진행해야한다. ProxySQL 대화창을 실행시키는 명령어는 아래와 같다.

 

mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='proxysql> '

 

ProxySQL 대화창이 실행된 화면

다음은 아래의 명령어로 MySQL 쓰기 노드 정보를 ProxySQL에 입력해주면 된다. 아래의 괄호부분을 쓰기노드의 IP 정보, 접속 계정정보로 바꾸어서 실행시킨다.

INSERT INTO mysql_servers (hostname) VALUES ('[IP_ADDRESS]');
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;

insert into mysql_users (username, password) values ('[USER_ID]', '[USER_PASS]');
SET mysql-monitor_username = '[USERNAME]';
SET mysql-monitor_password = '[PASSWORD]';

 

쓰기노드의 정보를 ProxySQL 서버에 입력했으면 읽기 노드를 만들어줄 차례이다. SQL > Replicas 란에서 만들 수 있으며, 아래의 그림처럼 두 개의 읽기 노드를 생성해서 테스트했다.

 

MySQL 읽기 노드 생성

읽기 노드 생성에도 시간이 많이 걸리는 데 위의 그림처럼 노드 생성이 완료되었으면 아래의 명령어들을 ProxySQL 서버에서 실행시켜 ProxySQL한테 읽기 노드 정보와 쿼리 트래픽 분산 정책을 입력해줘야 한다. 

 

INSERT INTO mysql_servers (hostgroup_id, hostname) VALUES ('1', '[IP_ADDRESS_#1]'), ('1', '[IP_ADDRESS_#2]')
LOAD MYSQL SERVERS TO RUNTIME
SAVE MYSQL SERVERS TO DISK

INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply) VALUES (1,1,'^SELECT.*FOR UPDATE',0,1), (2,1,'^SELECT',1,1);
LOAD MYSQL RULES TO RUNTIME;
SAVE MYSQL RULES TO DISK;

INSERT INTO mysql_servers (hostgroup_id, hostname) VALUES (1, '[IP_ADDRESS]');
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;

UPDATE mysql_servers SET weight = 40 WHERE hostname = '[IP_ADDRESS_1]';
UPDATE mysql_servers SET weight = 40 WHERE hostname = '[IP_ADDRESS_2]';
UPDATE mysql_servers SET weight = 20 WHERE hostname = '[IP_ADDRESS]';
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;

 

여기까지 ProxySQL 서버를 이용해서 Cloud SQL의 레플리케이션 기능을 활용하는 방법을 알아봤다. 위의 내용들은 좀 더 공부가 필요한 부분이고 ProxySQL을 스터디하여 로컬에서 기능을 구현해봐야겠다. 데이터베이스는 서비스에서 자주 병목지점이 되곤 한다. GCP를 사용하는 상황에서는 Cloud SQL을 적절히 이용하면 DB 관리를 좀 더 쉽게 할 수 있을 것이다.

Comments