[GCP]DNS 부터 하나씩 해보는 Google cloud 로 서비스 해보기 6탄 — Cloud SQL

이정운 (Jungwoon Lee)
13 min readNov 2, 2019

--

안녕하세요 이정운 입니다.

지난 시간에는 기존까지 진행된 서비스 적인 측면의 접근에서 잠깐 쉬고 좀더 보안화된 접근을 위한 IAP for TCP forwarding 이라던지 대용량 환경에서 좀 더 쉬운 관리를 위한 Label 과 같이 GCE 에 대해서 관리적인 측면을 조금 다뤄보고 살펴보는 시간을 가졌었습니다. 이번 시간에서는 지금까지 이야기 해온 서비스 측면의 흐름을 이어가서 GCE 에서 수행되는 서비스의 데이터를 저장하고 관리할 수 있는 DB 이야기를 해보려고 합니다. 특히, 관리형 DB 로서 GCP 의 Cloud SQL 에 대해서 살펴보도록 하겠습니다.

Cloud SQL 은 Google cloud 에서 제공한 완전 관리형 데이터베이스 서비스로서 MySQL, PostgreSQL, MS SQL Server 데이터베이스를 손쉽게 설정, 유지보수, 관리할 수 있는 기능을 제공하며 고성능, 확장성, 편의성 등을 제공합니다.

https://cloud.google.com/sql/

그럼 지금부터 하나씩 하나씩 실제 테스트를 해보면서 살펴볼까요?

#1) Cloud SQL 생성

이전에 한번 Cloud SQL 설명을 다뤄서 중복될 수도 있지만 이전 아티클은 GKE 에 연동이 주 목적이라 해당 부분에 관심있는 분들은 사전에 하단의 링크를 참고하시기 바라겠습니다.

[GCP]GKE 차근 차근 알아보기 3탄 — GCP 서비스 연결 해보기
https://medium.com/@jwlee98/gcp-gke-%EC%B0%A8%EA%B7%BC-%EC%B0%A8%EA%B7%BC-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-3%ED%83%84-gcp-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%97%B0%EA%B2%B0-%ED%95%B4%EB%B3%B4%EA%B8%B0-ae608b1b4338

그럼 실제로 Cloud SQL 을 생성해보면서 Cloud SQL 이 제공할 수 있는 기능을 설명해보도록 하겠습니다. 먼저 Cloud SQL 을 생성하기 버튼을 누르면 하단과 같이 MySQL, PostgreSQL, SQL Server 를 선택하는 화면이 나옵니다. 여기서 본인 서비스에 적합한 데이터베이스 종류를 선택하면 됩니다.

이번 이야기 에서는 가장 보편적으로 사용하는 데이터베이스인 MySQL 을 선택하도록 하겠습니다. 그러면 하단과 같은 상세 설정에 대한 메뉴를 확인할 수 있습니다.

기본 정보를 입력하고 “구성 옵션 표시” 를 클릭하면 상세 설정을 지정 가능합니다.

연결은 데이터베이스 인스턴스에 연결할 방식을 선택하는 것이며 ‘공개 IP’ 나 ‘비공개 IP’ 를 원하시는 형태로 선택하실 수 있습니다. 추가적으로 연결된 네트워킹을 선택하여 어떤 네트워크로 통신이 가능한지 지정할 수 있습니다.

다음으로 “머신 유형 및 스토리지” 입니다. 원하는 vCPU 와 메모리 사양을 선택하면 되며 사양에 따라서 더 높은 네트워크 처리량과 디스크 처리량이 제공됩니다.

“자동 백업 및 고가용성” 은 이름 그대로 자동 백업과 장애시에 다른 zone 에서 failover 를 담당할 failover replica 를 두는 설정을 선택할 수 있습니다. (향후 테스트를 해볼 예정이므로 여기서는 고가용성을 설정 합니다.)

특히, 2019/10/18 일 부로 Cloud SQL for MySQL 의 엔진 구조가 변경되어 고가용성을 위한 failover replica 가 Google 의 Regional Disks 를 활용하는 하단의 구조로 변경되었습니다. 이를 통해서 기존에 발생될 수 있었던 replication lag 이슈를 아예 방지하는 구조로 진화되었기 때문에 참고하시기 바라겠습니다.

https://cloud.google.com/sql/docs/mysql/high-availability?hl=en

다음으로 “플래그” 는 MySQL 과 동일하게 설정 변경을 위한 데이터베이스 플래그를 추가할 수 있는 메뉴입니다.

다만, 아직은 MySQL 의 모든 플래그를 사용할 수 있지는 않으며 사용 가능한 플래그의 리스트에서 선택 및 사용하셔야 합니다.

Cloud SQL for MySQL 에서 사용 가능한 MySQL 의 데이터베이스의 플래그는 하단의 메뉴얼에 리스트가 오픈 되어 있으니 참고하시기 바라겠습니다.

Configuring database flags
https://cloud.google.com/sql/docs/mysql/flags

예를 들어 하단과 같이 MySQL 데이터베이스 플래그 등을 넣을 수 있습니다.

참고적으로 MySQL 데이터베이스 플래그가 어떤 기능을 변경/수정 하는지에 대한 부분은 MySQL 의 공식 문서를 참고하시기 바라겠습니다.

https://dev.mysql.com/doc/refman/5.7/en/replication-options-binary-log.html#sysvar_binlog_row_image

다음으로 “유지보수 일정” 과 “라벨” 설정등을 한 후에 Cloud SQL for MySQL 인스턴스를 생성할 수 있습니다.

Cloud SQL for MySQL 인스턴스가 정상적으로 생성 되었다면 하단과 같이 모니터링과 설정 화면을 확인 가능합니다.

추신 #1) Cloud SQL for MySQL 은 GCP 관리콘솔 화면에서 CPU 사용율만이 아니라 InnoDB 데이터 fsync 등의 다양한 모니터링을 바로 수행 가능합니다.

#2) Cloud SQL 테스트

이제 본격적인 테스트를 위해서 Cloud SQL for MySQL 의 사용자 메뉴에서 자동 생성된 root 의 비밀번호를 본인이 원하시는 형태로 변경합니다.

테스트를 위해서 샘플 애플리케이션을 구동할 수 있는 GCE 인스턴스를 하나 사용할 예정이며 샘플 애플리케이션은 github 에서 공개되어 있는 샘플을 사용할 것입니다. (이때 주의할 점 중의 하나는 Cloud SQL for MySQL 의 ‘비공개 IP’ 를 선택하신 경우에는 반드시 GCE 인스턴스를 같은 region 에 만드셔야만 private IP 를 통한 연결이 가능하다 라는것 입니다. 또한, 당연히 네크워크도 같아야 하겠죠.)

GCE 인스턴스를 Cloud SQL for MySQL 과 같은 region, 네트워크에 만들고 샘플 애플리케이션을 사용하기 위해 하단처럼 github 의 소스를 받아옵니다.

git clone https://github.com/callicoder/spring-boot-mysql-rest-api-tutorial.git

GCE 인스턴스에 mysql client 가 설치 되어있다면 mysql client 를 통해서 지금 생성된 Cloud SQL for MySQL 인스턴스에 접속 테스트를 해 봅니다. (이때 host 항목에 Cloud SQL for MySQL 관리콘솔에서 연결에 표시되는 IP 주소를 사용하시면 되며 mysql client 가 없다면 설치 해줍니다.)

mysql --host=172.16.3.8 --user=root --password

연결이 문제 없이 되면 샘플을 다운로드 받은 github 의 가이드대로 ‘notes_app’ 이라는 데이터베이스를 하나 생성합니다.

create database notes_app;

그리고 spring boot 의 application.properties 파일에서 연결 URL 의 주소를 Cloud SQL for MySQL 의 주소로 변경 및 저장 합니다.

vi src/main/resources/application.properties

DB 연결과 관련된 설정을 변경했으면 이제 spring boot 샘플 애플리케이션을 구동합니다.

./mvnw spring-boot:run&

정상적으로 샘플 애플리케이션이 구동되었다면 하단과 같은 REST API 호출에 200 정상이 나오는 것을 확인 가능합니다.

curl -v “http://localhost:8080/api/notes"

당연히 샘플 애플리케이션이 제공하는 다른 REST API 호출도 가능하며 결과를 확인할 수 있습니다.

curl  -d '{"title":"value1", "content":"value2"}' -H "Content-Type: application/json" -X POST "http://localhost:8080/api/notes"

#3) Cloud SQL 장애 조치 테스트

Cloud SQL for MySQL 인스턴스를 생성할 때 고가용성 설정을 이미 하였기 때문에 이번에는 간단한게 고가용성 구성이 잘 동작하는지 테스트 해보도록 하겠습니다.

GCP 의 경우에는 이런 ‘장애 조치’에 대한 테스트를 쉽게 해볼 수 있도록 GCP 관리콘솔에 하단과 같이 해당 메뉴가 있으며 이를 클릭하여 쉽게 ‘장애 조치’를 테스트 해볼 수 있습니다.

‘장애 조치’를 클릭하면 바로 테스트가 가능하며 하단과 같이 상태 변경사항을 확인 가능합니다.

그리고 이 상황에서 바로 Cloud SQL for MySQL 을 사용하는 애플리케이션을 호출하게 되면 장애 절체에 의해서 잠시 연결이 끊어진 상황이 순간 발생되기 때문에 connection 관련 에러를 확인할 수 있습니다.

그리고 조금 있다가 장애 절체가 완료되어 다시 호출해보면 정상적으로 결과가 나오는 것을 확인할 수 있습니다. 이 부분에서 걸리는 시간은 사양이나 환경에 따라 다를듯 한데 저는 테스트 해보니 몇 십초단위에서 바로 절체가 이루어지는 것을 확인했습니다.

다시 GCP 관리콘솔을 확인해보면 Cloud SQL for MySQL 인스턴스가 정상적인 상태라는 것을 확인 가능합니다.

추신 #2) 이러한 인스턴스에 대한 작업은 GCP 관리콘솔의 작업 메뉴에서 히스토리를 확인할 수 있습니다.

추신 #3) 당연히 기본 GCP 관리콘솔 말고도 Stackdriver Monitoring 화면에서 Cloud SQL 에 대한 모니터링이 가능하며 더 자세한 모니터링화면이 제공 가능하며 Stackdriver Logging 을 통해서 Cloud SQL 인스턴스에 대한 다양한 로그를 확인 가능합니다.

추신 #4) 예전에 GCP 환경에서 slow MySQL 쿼리를 보다 효율적으로 모니터링 할 수 있는 방안에 대해서 아티클을 쓴적이 있습니다. 관심있는 분들은 참고하시기 바라겠습니다.

Spot slow MySQL queries fast with Stackdriver Monitoring
https://cloud.google.com/blog/products/management-tools/spot-slow-mysql-queries-fast-with-stackdriver-monitoring

여기까지 잘 따라오셨다면 간단하긴 하지만 Google cloud 에서 제공하는 Cloud SQL for MySQL 에 대해서 간단하게 테스트를 완료 해보신 것입니다. 특히나, 중복될 수 있는 기본 이야기이지만 이번에 새로 변경된 사항과 업데이트를 최대한 보여준다는 생각으로 이야기를 풀어봤으니 참고하시기 바라겠습니다. 그럼 이번 이야기는 여기서 마무리하고 다음에 다른 이야기를 들고 다시 돌아오겠습니다. 휘리릭~~~

Disclaimer: 본 글의 작성자는 Google 직원이지만 Google cloud 를 공부하는 한 개인으로서 작성된 글입니다. 본 글의 내용, 입장은 Google 을 대변하지 않으며 Google 이 해당 콘텐츠를 보장하지 않습니다.

참고 자료 #1

Google SQL
https://cloud.google.com/sql/

[GCP]GKE 차근 차근 알아보기 3탄 — GCP 서비스 연결 해보기
https://medium.com/@jwlee98/gcp-gke-%EC%B0%A8%EA%B7%BC-%EC%B0%A8%EA%B7%BC-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-3%ED%83%84-gcp-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%97%B0%EA%B2%B0-%ED%95%B4%EB%B3%B4%EA%B8%B0-ae608b1b4338

Overview of the high availability configuration
https://cloud.google.com/sql/docs/mysql/high-availability?hl=en

16.1.6.4 Binary Logging Options and Variables
https://dev.mysql.com/doc/refman/5.7/en/replication-options-binary-log.html#sysvar_binlog_row_image

Spring Boot, MySQL, JPA, Hibernate Rest API Tutorial
https://github.com/callicoder/spring-boot-mysql-rest-api-tutorial.git

Spot slow MySQL queries fast with Stackdriver Monitoring
https://cloud.google.com/blog/products/management-tools/spot-slow-mysql-queries-fast-with-stackdriver-monitoring

--

--

이정운 (Jungwoon Lee)
이정운 (Jungwoon Lee)

Written by 이정운 (Jungwoon Lee)

Technical engineer who dreams better future. (These thoughts are my own personal opinions, and do not reflect or represent Google’s opinions or plans.)

Responses (1)