GCP Cloud SQL - SQL Server

DB 정보

데이터베이스버전 : SQL Server 2019 Standard

INSTANCE_NAME : gw-sql-test-dev-1

DATABASE_NAME : sample

CHARSET : UTF8

COLLATION : Korean_Wansung_CI_AS

SQL Server 만들기

MS-SQL 에디션별 scale liimit : 에디션별 cpu, memory 제한 등 설명 있음

Editions and supported features of SQL Server 2019 - SQL Server

https://cloud.google.com/sql/docs/sqlserver/quickstart?hl=ko

project 세팅

project="sample-dev" gcloud config set project $project

 

Cloud SQL Proxy 를 이용할 경우 Cloud SQL Admin API를 사용 설정 해야 함

gcloud services enable sqladmin.googleapis.com

 

https://cloud.google.com/sql/docs/sqlserver/create-instance?hl=ko

인스턴스 id : gw-sql-dev-1

비밀번호 : xxxxxxxx (기본 user는 sqlserver 임)

데이터베이스버전 :  SQL Server 2019 Standard
SQL Server 2019 Enterprise
리전 및 영역 가용성 선택 : dev는 asia-northeast3 (서울), prd는 여러 영역(고가용성)을 하면 될 듯.

--availability-type=regional

로 설정하면 인스턴스에 문제가 생긴 경우 자동으로 해당 region 의 다른 zone 영역으로 옮겨준다.

 

인스턴스 맞춤설정을 선택한다.

SQL Server 2019 Standard 를 선택하면 머신유형은 vCPU 1개, 4GB 로 선택

저장용량은 10 - 65,536GB 임 : 10GB. 인스턴스 만든 다음에 늘릴 수 있음.

https://cloud.google.com/sql/docs/sqlserver/instance-settings?hl=ko#automatic-storage-increase-2ndgen 스토리지 용량 자동 증가 이 설정을 사용 설정하면 Cloud SQL이 사용 가능한 저장용량을 30초 간격으로 확인합니다. 사용 가능한 저장용량이 기준 크기보다 작으면 Cloud SQL이 저장용량을 자동으로 추가합니다. 사용 가능한 스토리지가 기준 크기보다 작아지는 일이 반복되면 Cloud SQL이 최대 30TB까지 스토리지 용량을 계속 추가합니다.

연결은 기본 공개 IP임. 연결을 공개 IP로 하면 네트워크를 승인하거나 Cloud SQL 프록시를 사용하여 이 인스턴스에 연결함.

유지보수는 PRD의 경우 확인 필요할 듯. 일반적으로 유지보수 주기는 수개월당 한 번에 불과하며 업데이트되는 동안 인스턴스가 다시 시작되어야 하므로 서비스가 잠시 중단될 수 있습니다.

backup-start-time 은 UTC 기준임. https://cloud.google.com/sdk/gcloud/reference/beta/sql/instances/patch#--backup-location

(UTC 11:00은 KST 20:00)

 

DB_INSTANCE="gw-sql-test-dev-99" DB_PASSWORD="xxxx" DB_VERSION="SQLSERVER_2019_STANDARD" #DB_VERSION="SQLSERVER_2019_EXPRESS" gcloud beta sql instances create $DB_INSTANCE \ --database-version=$DB_VERSION \ --region=asia-northeast3 \ --backup \ --backup-start-time=11:00 \ --storage-size=10G \ --storage-auto-increase \ --cpu=1 \ --memory=4GB \ --root-password=$DB_PASSWORD

참고로 삭제한 instance 이름은 일주일이 지나야 사용을 할 수 있다.

MS-SQL 가격책정

https://cloud.google.com/sql/pricing?hl=ko#sql-server

HA 구성시 매월당 가격

CPU, Memory

HA vCPU

$78.38 per vCPU

$58.80

$37.63

HA 메모리

$13.28 per GB

$9.96

$6.38

스토리지

HA 스토리지

  • $0.442 per GB/month for SSD storage capacity

  • $0.104 per GB/month for backups (used)

네트워크 이그레스

Compute Engine 인스턴스

동일 리전 내: 무료
북미 내 리전 간: $0.12/GB
북미 외 리전 간: $0.12/GB

네트워크 이그레스

Cloud Interconnect

를 사용한 인터넷 이그레스

$0.05/GB

라이선스 : 코어 시간당 가격

Standard

$0.13

SQL client tool 설치

Ubuntu 서버에 SQL Server 접속을 테스팅 할 수 있는 sqlcmd 명령어를 설치해야 함.

https://docs.microsoft.com/en-us/sql/linux/quickstart-install-connect-ubuntu?view=sql-server-2017

sqlcmd로 접근하기

SQL Server 연결하기

결론 : 비공개 IP 설정만 사용함. 공개 IP는 설정하지 않음

 

비공개 IP로 설정해서 VM에서는 private ip로 접근하도록 설정. 비공개 IP로 설정을 하면 같은 VPC 에서 비공개ip로 접근이 가능하고 interconnect로 연결된 네트워크에서도 SQL server에 접근이 가능함.

외부 개발자는 IAM 계정이 있기 때문에 SQL server에 접근 가능한 Web or Was 서버에 접근해서 DBMS 관련한 작업을 하면 됨.

퍼블릭한 인터넷망의 PC에서 SQL server에 접근하려고 하는 경우에는 DB에 접근 가능한

외부 개발자는 공개 IP로 설정을 하되 IP로 접근제한을 하지 않고 Cloud SQL Proxy+서비스 계정 이용 조합을 한다.

 

Public IP on DBA 랩탑 ---> IAP --> Private IP on GCE(SQL Proxy, 베스천. Cloud SQL 과 같은 VPC ) ---> Private IP on Cloud SQL

 

  • 공개 IP로 하면 네트워크를 승인하거나 Cloud SQL 프록시를 사용하여 이 인스턴스에 연결

    • 서비스 계정을 이용하면 공개 IP에서 IP를 허용하지 않아도 접근이 가능함.

    • 서비스 계정 + Cloud SQL 프록시를 이용하면 IP 로 ACL을 관리할 필요가 없는 대신 서비스 계정에 대한 관리가 필요함. (서비스 계정도 IP제한 거는 것 가능)

  • 비공개 IP로 하면 비공개 서비스 액세스 구성 등이 사전에 필요함. 비공개 IP로만 구성을 하면 같은 네트워크에서만 접속이 가능함.

  • 처음 테스팅을 할 때는 기본값인 공개 IP로 설정을 하여 테스팅을 하고 나서 비공개 IP 설정을 하는 것이 편리함.

 

Compute Engine에서 비공개 IP, 공개IP, Cloud SQL 인증 프록시를 이용하여 접근하는 예제는 아래 참고.

https://cloud.google.com/sql/docs/sqlserver/connect-compute-engine?hl=ko#connect-gce-proxy

SQL Server 연결하기 - 공개 ip연결

https://cloud.google.com/sql/docs/sqlserver/configure-ip?hl=ko

SQL 서버에 공인 IP가 할당이 되며 접근할 수 있는 네트워크 대역을 설정하여 사용한다. SQL 서버 포트 1433으로 테스팅 가능함. sqlcmd 명령을 이용하여 새로 만든 인스턴스에 대한 접속을 확인할 수 있음.

SQL Server 연결하기 - Proxy 이용하기

https://cloud.google.com/sql/docs/sqlserver/connect-admin-proxy?hl=ko&_ga=2.173224679.-517151124.1624493998&_gac=1.47456853.1631584379.CjwKCAjw7fuJBhBdEiwA2lLMYZBNLnEemFPllpjNLifanLXfK22eELwaczphaDe7KgFgGYTjpFdZVRoC-CMQAvD_BwE

https://cloud.google.com/sql/docs/sqlserver/quickstart-proxy-test?hl=ko

Cloud SQL Admin API 사용 설정

Cloud SQL 연결을 위한 서비스 계정 생성

아래 문서 참고하여 Cloud SQL > Cloud SQL 클라이언트 역할을 가진 서비스 계정 생성하였음.

https://cloud.google.com/sql/docs/sqlserver/connect-compute-engine?hl=ko#connect-gce-proxy

서비스 계정 만들기 (Cloud SQL 클라이언트 역할) : https://cloud.google.com/iam/docs/creating-managing-service-accounts?hl=ko#creating_a_service_account

해당 서비스 계정에서 IAM 키를 만들면 자동으로 비공개 키 파일을 다운로드 받음. 생성된 비공개 키 파일은 외부에 노출이 되면 보안 문제가 생기므로 관리를 잘 해야 함.

https://cloud.google.com/iam/docs/creating-managing-service-account-keys?hl=ko

VM Instance를 생성할 때 서비스 계정을 지정하도록 되어있습니다. 키파일을 Instance에 직접 보관하는 것은 보안적으로 문제가 될 수 있기 때문에 VM Instance 생성 시 지정했던 서비스 계정에 SQL Client role을 추가해서 별도의 키 파일 보관없이 연결하는 방법을 선택할 수도 있습니다.

Cloud SQL 인증 프록시 설치

공개 IP에서 접근할 수 있도록 설정을 한 후 접근 가능한지 확인을 한다.

INSTANCE_CONNECTION_NAME 은 연결 이름에서 확인을 하면 된다.

TCP 연결의 경우 Cloud SQL 인증 프록시는 기본적으로 localhost(127.0.0.1)에서 리슨합니다. 따라서 인스턴스에 tcp:PORT_NUMBER를 지정하면 로컬 연결은 127.0.0.1:PORT_NUMBER에서 이루어집니다.

또는 로컬 연결에 다른 주소를 지정할 수 있습니다. 예를 들어 Cloud SQL 인증 프록시가 0.0.0.0:1234에서 로컬 연결을 리슨하도록 하는 방법은 다음과 같습니다.

  ./cloud_sql_proxy -instances=INSTANCE_CONNECTION_NAME=tcp:0.0.0.0:1234

인스턴스에 공개 및 비공개 IP가 모두 구성되어 있고 Cloud SQL 인증 프록시에서 비공개 IP 주소를 사용하도록 하려는 경우 Cloud SQL 인증 프록시를 시작할 때 다음 옵션을 제공해야 합니다.

-ip_address_types=PRIVATE

이제 해당 서버에서 다른 터미널을 띄우고 sqlcmd 명령을 이용하여 DBMS에 접근할 수 있음.

서비스 계정을 만든 경우 서비스 계정을 이용하여 접근할 수 있음. credential_file 이 서비스 계정의 비공개 키 파일임.

서비스 계정을 이용하면 공개 IP에서 IP를 허용하지 않아도 접근이 가능함. (비공개 IP로 구성을 한 경우에는 같은 네트워크에서만 접근을 해야 하므로 서비스 계정을 이용하더라도 접근 하지 못함.)

비공개 IP를 사용하여 Cloud SQL 인스턴스에 연결하려면 Cloud SQL 인증 프록시가 인스턴스와 동일한 VPC 네트워크에 액세스할 수 있는 리소스에 있어야 합니다.

https://cloud.google.com/sql/docs/sqlserver/connect-admin-proxy#private-ip

SQL Server 연결하기 - 비공개 IP

https://cloud.google.com/sql/docs/sqlserver/configure-private-ip?hl=ko

인스턴스를 만들 때 또는 기존 인스턴스에 비공개 IP를 사용하도록 Cloud SQL 인스턴스를 구성할 수 있습니다.

비공개 IP를 사용하도록 인스턴스를 구성한 후에는 이 인스턴스에서 비공개 IP 연결을 사용 중지할 수 없습니다.

API 및 IAM

  • 필요한 IAM 권한

    • compute.networks.list

    • compute.addresses.create

    • compute.addresses.list

    • servicenetworking.services.addPeering

  • 공유 VPC 네트워크를 사용하는 경우 사용자를 호스트 프로젝트에 추가하고 호스트 프로젝트에서 사용자에게 동일한 권한을 할당해야 합니다.

비공개 서비스 액세스 구성

https://cloud.google.com/sql/docs/sqlserver/configure-private-services-access?hl=ko

비공개 서비스 액세스는 VPC 네트워크와 Cloud SQL 인스턴스가 상주하는 기본 Google 서비스 VPC 네트워크 사이에서 VPC 피어링 연결로 구현됩니다. 비공개 연결을 통해 VPC 네트워크의 VM 인스턴스와 액세스하는 서비스가 내부 IP 주소를 사용하여 독점적으로 통신할 수 있습니다.

필요한 IAM 권한

  • compute.networks.list

  • compute.addresses.create

  • compute.addresses.list

  • servicenetworking.services.addPeering

공유 VPC 네트워크를 사용하는 경우 사용자를 호스트 프로젝트에 추가하고 호스트 프로젝트에서 사용자에게 동일한 권한을 할당해야 합니다.

 

IP 주소 범위 할당

sample-gw-db-ne3-dev-subnet 에 할당한 172.19.2.0/24 을 address에 지정하는 경우 다른 곳에 지정되어 있어서 충돌이 난다고 나옴. 주소 범위를 생략하면 Google Cloud가 VPC 네트워크에서 사용하지 않는 주소 범위를 자동으로 선택함.

비공개 연결 만들기

작업성공 확인

SQL 인스턴스 생성

region 옵션을 지정하지 않는 경우 다음과 같은 주의사항이 나온다.

WARNING: Starting with release 233.0.0, you will need to specify either a region or a zone to create an instance.

region을 지정하지 않았을 때 위치가 us-central1-f 으로 지정되었다. 아마도 이 부분은 구글이 임의로 할당을 하는 것 같다.

비공개 IP를 사용하여 인스턴스에 연결

같은 VPC 네트워크에 있는 VM에서 MS-SQL에 할당된 비공개 IP 주소를 이용하여 접근하면 됨.

 

Cloud SQL이 비공개 IP로 구성되어 있는 경우 외부의 PC에서 IAP로 Cloud SQL Proxy 를 거쳐서 Cloud SQL 에 접속하는 경우는 아래 문서에 따로 정리하였음.

https://vntg.atlassian.net/wiki/spaces/CLOUD/pages/354910209/GCP+-+Cloud+IAP+public+ip#Cloud-IAP---Cloud-SQL-Proxy-%ED%86%B5%ED%95%B4%EC%84%9C-MS-SQL-%EC%A0%91%EC%86%8D%ED%95%98%EA%B8%B0

고가용성 구성하기

https://cloud.google.com/sql/docs/sqlserver/high-availability

https://cloud.google.com/sql/docs/sqlserver/configure-ha#ha-existing

구성을 변경한 후 gcloud sql instances describe 명령어로 변경사항을 확인하면 failoverReplica, secondaryGceZone 이 추가되었고 availabilityType 이 ZONAL에서 REGIONAL로 변경된것 볼 수 있음.

 

처음부터 고가용성 설정을 하면서 인스턴스 만들기. --availability-type=REGIONAL 옵션을 추가하면 region 인스턴스가 됨.

인스턴스 추가 후 루트 사용자를 구성. 여기서 root 사용자는 뭐지??

no-host 옵션이 있지만 실행시 없는 옵션이라고 나온다. 아래 문서에도 no-host 옵션은 없다.

https://cloud.google.com/sdk/gcloud/reference/sql/users/set-password

이렇게 고가용성 구성을 하고 장애조치를 테스팅 해 볼 수 있다. 웹콘솔에서 “장애조치”를 클릭하면 인스턴스가 장애 조치되며 몇 분 동안 데이터를 제공할 수 없게 된다. data 가 전혀 없는 상태에서 테스팅을 해보면 1분-2분 이내에 장애처리가 되고 정상적으로 SQL 쿼리를 날릴 수 있었다.

User, DB 정보 등

SQL 서버 생성시 기본 사용자는 sqlserver

https://cloud.google.com/sql/docs/sqlserver/create-manage-users?hl=ko#user-root

DB 만들기

https://cloud.google.com/sql/docs/sqlserver/create-manage-databases?hl=ko#gcloud

DB 를 만들 때 charset , collation 지정하는 부분이 있다. 개발사에 확인해서 정보를 받았음.

Cloud SQL 만들 때 --collation=Korean_Wansung_CI_AS 옵션을 지정할 수 있음.

https://docs.microsoft.com/ko-kr/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-ver15

DB 삭제

유지보수

유지보수 시간을 정해야 하고 예정된 유지보수 알림을 받도록 각자 개인 메일에서 설정을 해 놓아야 함.

유지보수 예정 최소 1주일 전 예정된 유지보수에 대한 알림이 이메일로 전송이 됨.

그러면 dev 환경에서 먼저 문제가 없는지 확인을 한다.

그러고 나서 prod 환경에서 유지보수 시간에 자동으로 진행하도록 할 수도 있고 수동으로 업데이트를 할 수도 있다. prod 환경의 경우 HA 구성이기 때문에 약간의 다운타임은 발생할 수 있지만 일정 시간이 지나면 서비스는 정상으로 돌아갈 수 있다.

https://cloud.google.com/sql/docs/sqlserver/maintenance#post-maintenance

유지보수 이벤트가 수행되는 동안 SQL Server용 Cloud SQL 인스턴스는 평균적으로 120초 미만의 시간 정도 연결이 해제됩니다.

유지보수가 시작할 때 활동량이 많거나 데이터베이스가 큰 인스턴스의 경우에는 다운타임이 더 길 수 있습니다. Cloud SQL은 일반적으로 몇 개월 간격으로 유지보수를 예약합니다.

유지보수 설정

  • 유지보수 기간. Cloud SQL에서 유지보수를 예약하는 요일과 시간입니다. 유지보수 기간은 1시간 동안 지속됩니다. 유지보수 기간 구성 방법을 알아보세요.

  • 업데이트 순서. 동일 리전의 다른 인스턴스를 기준으로 Cloud SQL 인스턴스가 업데이트되는 순서를 설정합니다. 업데이트 순서는 AnyEarlierLater로 설정할 수 있습니다. Later 인스턴스는 같은 리전에서 동일한 유지보수 기간이 포함된 Earlier 인스턴스 이후 1주일 후에 업데이트됩니다. 유지보수 기간을 구성할 때 업데이트 순서를 설정합니다. → 내용이 이해가 잘 안 됨.

  • 유지보수 거부 기간. Cloud SQL이 유지보수를 예약하지 않는 기간(일 수)입니다. 유지보수 거부 기간은 최대 90일까지 설정할 수 있습니다. 유지보수 거부 기간을 구성하는 방법을 알아보세요.

 

https://cloud.google.com/sql/docs/mysql/set-maintenance-window#set-maintenance

시간은 UTC 기준임.

예정된 유지보수 알림

유지보수 예정 최소 1주일 전 예정된 유지보수에 대한 알림이 이메일로 전송되도록 설정할 수 있습니다. 알림에 대한 이메일 필터를 설정하기 위해 이메일 제목은 Upcoming maintenance for your Cloud SQL instance instancename(Cloud SQL 인스턴스 instancename의 예정된 유지보수)이 됩니다.

기본적으로 유지보수 알림은 전송되지 않습니다. 유지보수 알림을 수신 동의해야 합니다. 알림을 수신하려면 유지보수 기간도 선택해야 합니다.

알림은 Google 계정과 연결된 이메일 주소로 전송됩니다. 커스텀 이메일 별칭(예: 팀 이메일 별칭)은 구성할 수 없습니다.

유지보수 재예약

인스턴스에 대해 유지보수 기간이 있으면 현재 유지보수가 예약되기 전에 언제든지 유지보수를 재예약할 수 있습니다. 

예약된 유지보수 기간을 취소할 수는 없지만 재예약할 수 있습니다.

재예약에는 여러가지 제한사항이 있습니다.