[GCP]DNS 부터 하나씩 해보는 Google cloud 로 서비스 해보기 6탄 — Cloud SQL
안녕하세요 이정운 입니다.
지난 시간에는 기존까지 진행된 서비스 적인 측면의 접근에서 잠깐 쉬고 좀더 보안화된 접근을 위한 IAP for TCP forwarding 이라던지 대용량 환경에서 좀 더 쉬운 관리를 위한 Label 과 같이 GCE 에 대해서 관리적인 측면을 조금 다뤄보고 살펴보는 시간을 가졌었습니다. 이번 시간에서는 지금까지 이야기 해온 서비스 측면의 흐름을 이어가서 GCE 에서 수행되는 서비스의 데이터를 저장하고 관리할 수 있는 DB 이야기를 해보려고 합니다. 특히, 관리형 DB 로서 GCP 의 Cloud SQL 에 대해서 살펴보도록 하겠습니다.
Cloud SQL 은 Google cloud 에서 제공한 완전 관리형 데이터베이스 서비스로서 MySQL, PostgreSQL, MS SQL Server 데이터베이스를 손쉽게 설정, 유지보수, 관리할 수 있는 기능을 제공하며 고성능, 확장성, 편의성 등을 제공합니다.
그럼 지금부터 하나씩 하나씩 실제 테스트를 해보면서 살펴볼까요?
#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