Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

Aurora Serverless

Aurora RDS는 컴퓨팅 노드와 스토리지를 분리하는 것으로 확장성과 성능, 유연성을 확보했다. 그래도 여전히 컴퓨팅을 담당하는 EC2 인스턴스는 필요했다.

AWS는 2018년 서버노드가 전혀 필요 없는 말 그대로의 서버리스(Serverless) Aurora 서비스를 출시했다. Aurora 서버리스는 온디맨드 방식으로 제공되며, 자동으로 크기가 조정되는 서버리스 Aurora다. 인스턴스의 사양과 확장에 대해서 고민할 필요가 없이 사용량에 대해서만 지불하면 된다.

(2019년 3월 28일)현재 서버리스 Aurora는 Mysql만 지원한다. 지원하는 버전은 MySQL 5.6(MySQL 5.6-compatible)이다.

Aurora Serverless 클러스터 생성

Amazon Aurora를 선택했다. Aurora에 대한 설명을 요약해보자.
  • MySQL대비 5배의 성능, PostgreSQL대비 3배의 성능을 제공한다.
  • 최대 64T 까지 자동으로 확장가능한 SSD 스토리지를 제공한다.
  • 3개의 가용영역(Availability Zones)에 걸쳐서 6 way 리플리케이션을 구성할 수 있다. (서울 리전은 2개의 가용영역만 선택할 수 있다.)
  • 10ms 정도의 복제지연을 가지는 15개의 읽기전용 리플리카를 만들 수 있다.
  • 자동으로 모니터링 되며, 30초 이내에 장애조치(failover)된다.
지금은 MySQL 5.6-compatible 만 서버리스로 선택 할 수 있다.

Provisioned와 Serverless 타입중 하나를 선택 할 수 있다. Serverless를 선택하자.

DB cluster identifier에서 데이터베이스 클러스터의 이름을 설정 할 수 있다. 이 이름은 현재 리전에서 AWS 어카운트가 소유하고 있는 모든 클러스터에서 유일해야 한다. 나는 joinc-cluster로 이름을 만들었다.

Master usernameMaster password를 설정한다.

서버리스인 만큼 EC2 인스턴스를 선택하는 대신, ACU(Aurora Computing Unit - 오로라 컴퓨팅 단위)를 이용한다. 그리고 용량산정이라는 개념이 없다. 최소 ACU와 최대 ACU를 설정하면, 이 범위 안에서 자동으로 스케일링 된다.
  • Minimum Aurora capacity unit : 최소 오로라 컴퓨팅 단위. 데이터베이스 클러스터의 최소 시작 단위다.
  • Maximum Aurora capacity unit : 최대 오라라 컴퓨팅 단위. 스케일링 되는 최대 단위다.
ACU는 프로세싱과 메모리 용량의 조합이다. 데이터베이스의 저장소는 10GiB에서 64TiB까지 자동으로 확장된다. ACU는 최소 5분부터 초 단위로 비용이 청구되며, 최소 ACU에서 최대 ACU 사이에서 자동으로 크기가 조정된다. 클러스터에 추가용량이 필요하다는 것을 Auroa가 감지하면 활성 리소스 풀에서 용량을 가져와서 수요를 충족한다. Aurora는 컴퓨팅 계층과 스토리지 계층이 분리되어 있기 때문에, 빠르게 용량을 증설 할 수 있다.

Aurora 서버리스는 데이터베이스 사용이 없을 경우, 일정 시간이 지나면 휴면상태에 진입한다. 이 경우 데이터베이스에 대한 비용이 청구되지 않는다. Pause compute capacity after consecutive minutes of inactivity로 휴면상태로 전환하는데 걸리는 시간을 설정할 수 있다. 최대 24시간까지 가능하다.

Network & Security에서 VPC와 Subnet 그리고 Security Group를 선택한다.

데이터베이스 파라메터 그룹과 백업주기를 설정한다. 백업은 특정 시간에 자동으로 이루어지며, 백업 보존 기간(backup retention period)기간 동안 보존된다. 백업이 진행되는 중에도 성능영향이나 서비스 중단이 발생하지 않는다. 백업 보존 기간은 1일에서 35일까지 지정할 수 있다. 기본 백업 보존 기간은 1일이다.

AWS Key Management Service(KMS)를 이용해서 암호화 기능을 사용 할 수 있다. 데이터베이스, 로그, 백업, 스냅샷 및 읽기 복제본 내 데이터에 암호 알고리즘을 적용 할 수 있다.

Delete protection기능을 켜서, 실수로 데이터베이스를 삭제하는 것을 막을 수 있다. Delete protection을 켜 놓은 경우, 삭제 보호 기능을 비활성화 하기 전에는 삭제할 수 없다.

데이터베이스 연결 확인

데이터베이스 클러스터 정보를 확인해보자.
# aws rds describe-db-clusters
{
    "DBClusters": [
        {
            "Capacity": 0, 
            "MasterUsername": "yundream", 
            "HttpEndpointEnabled": false, 
            "ReadReplicaIdentifiers": [], 
            "VpcSecurityGroups": [
                {
                    "Status": "active", 
                    "VpcSecurityGroupId": "sg-0f42012a784275f33"
                }, 
                {
                    "Status": "active", 
                    "VpcSecurityGroupId": "sg-0337a80bb0854e483"
                }
            ], 
            "CopyTagsToSnapshot": false, 
            "HostedZoneId": "ZLA2NUCOLGUUR", 
            "EngineMode": "serverless", 
            "Status": "available", 
            "MultiAZ": false, 
            "LatestRestorableTime": "2019-03-31T09:03:31.211Z", 
            "PreferredBackupWindow": "13:33-14:03", 
            "DBSubnetGroup": "awsstudy-subnet", 
            "AllocatedStorage": 1, 
            "BackupRetentionPeriod": 1, 
            "PreferredMaintenanceWindow": "tue:16:21-tue:16:51", 
            "Engine": "aurora", 
            "Endpoint": "joinc-test.cluster-c985nvk9gmsh.ap-northeast-2.rds.amazonaws.com", 
            "EarliestRestorableTime": "2019-03-31T08:57:39.453Z", 
            "IAMDatabaseAuthenticationEnabled": false, 
            "ClusterCreateTime": "2019-03-31T08:56:53.397Z", 
            "EngineVersion": "5.6.10a", 
            "DeletionProtection": false, 
            "ScalingConfigurationInfo": {
                "MinCapacity": 2, 
                "AutoPause": true, 
                "MaxCapacity": 4, 
                "SecondsUntilAutoPause": 300
            }, 
            "DBClusterIdentifier": "joinc-test", 
            "DbClusterResourceId": "cluster-SJWXLIMI6YGGTY2ATB7I5NJ3YM", 
            "DBClusterMembers": [], 
            "DBClusterArn": "arn:aws:rds:ap-northeast-2:522373083963:cluster:joinc-test", 
            "KmsKeyId": "arn:aws:kms:ap-northeast-2:522373083963:key/37f608e7-81e3-4a92-8759-b619b303a9bb", 
            "StorageEncrypted": true, 
            "AssociatedRoles": [], 
            "DBClusterParameterGroup": "default.aurora5.6", 
            "AvailabilityZones": [
                "ap-northeast-2a", 
                "ap-northeast-2c"
            ], 
            "Port": 3306
        }
    ]
}
중요한 정보만 간추려 보자.

  • EngineMode : serverless. 서버리스 엔진이라는 걸 확인 할 수 있다.
  • ScalingConfigurationInfo.MinCapacity : 최소 ACU
  • ScalingConfigurationInfo.MaxCapacity : 최대 ACU
  • Endpoint : joinc-test.cluster-c985nvk9gmsh.ap-northeast-2.rds.amazonaws.com
  • KmsKeyId : 데이터베이스를 암호화하기 위한 KMS Key ID. AWS가 관리해준다. 유저는 신경쓸 필요가 없다.
  • StorageEncrypted : 암호화 했다.
  • LatestRestorableTime : Aurora RDS는 5분 단위로 모든 트랜젹션을 S3에 저장한다. 데이터베이스 관리자는 LatestRestoreableTime 이전의 데이터베이스를 복원 할 수 있다. 백업 및 복원에 대한 내용은 다른 문서를 통해서 살펴보도록 하겠다.
클러스터 엔드포인트로 연결해보자. Public 하게 접근 할 수 없으므로 EC2 인스턴스를 만들어서 접근했다.
[root@ip-10-10-0-208 ~]# mysql -u yundream -p -h joinc-test.cluster-c985nvk9gmsh.ap-northeast-2.rds.amazonaws.com
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.6.10 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

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

MySQL [(none)]> 

Aurora serverless 작동방식

 Aurora serverless 작동방식

  1. 여러 AZ에 복제되는 Aurora 스토리지 볼륨을 만든다.
  2. VPC Endpoint를 만들어서 애플리케이션이 연결할 수 있도록 한다. Aurora 서버리스 데이터베이스를 만들면 VPC Endpoint도 생성된다.
  3. 이 VPN Endpoint 뒤에는 Netowrk Load Balancer이 있다. 자세한 내용은 PrivateLink문서를 참고하자. SaaS형 데이터베이스라고 보면 된다.
  4. 데이터베이스로의 트래픽을 인스턴스로 라우팅한다.
  5. 초기 최소 인스턴스용량을 프로비저닝한다.
앞서 만든 데이터베이스의 endpoint dns 를 확인해 보자.
[ec2-user@ip-10-10-0-208 ~]$ dig joinc-test.cluster-c985nvk9gmsh.ap-northeast-2.rds.amazonaws.com

;; ANSWER SECTION:
joinc-test.cluster-c985nvk9gmsh.ap-northeast-2.rds.amazonaws.com. 5 IN CNAME vpce-0c6704541b11af063-turruh7t.vpce-svc-09e985a9f6db76c88.ap-northeast-2.vpce.amazonaws.com.
vpce-0c6704541b11af063-turruh7t.vpce-svc-09e985a9f6db76c88.ap-northeast-2.vpce.amazonaws.com. 34 IN A 10.10.1.34
vpce-0c6704541b11af063-turruh7t.vpce-svc-09e985a9f6db76c88.ap-northeast-2.vpce.amazonaws.com. 34 IN A 10.10.3.150

;; Query time: 65 msec
;; SERVER: 10.10.0.2#53(10.10.0.2)
;; WHEN: 일  3월 31 15:46:03 UTC 2019
;; MSG SIZE  rcvd: 218
CNAME으로 vpce-0c6704541b11af063-turruh7t.vpce-svc-09e985a9f6db76c88.ap-northeast-2.vpce.amazonaws.com. 이 등록된 것을 알 수 있다. aws cli로 위 CNAME이 endpoint로 등록된 인터페이스에 대한 도메인 이름이라는 걸 확인 할 수 있다.
# aws ec2 describe-vpc-endpoints
{
    "VpcEndpoints": [
        {
            "VpcId": "vpc-0700d43bd5ba9b0a4", 
            "NetworkInterfaceIds": [
                "eni-013079991086bf0df", 
                "eni-070873e5a305f28ed"
            ], 
            "SubnetIds": [
                "subnet-0fab469e1578c9375", 
                "subnet-0513f520bbb948091"
            ], 
            "PrivateDnsEnabled": false, 
            "State": "available", 
            "ServiceName": "com.amazonaws.vpce.ap-northeast-2.vpce-svc-09e985a9f6db76c88", 
            "RouteTableIds": [], 
            "Groups": [
                {
                    "GroupName": "default", 
                    "GroupId": "sg-0f42012a784275f33"
                }, 
                {
                    "GroupName": "rds-launch-wizard", 
                    "GroupId": "sg-0337a80bb0854e483"
                }
            ], 
            "VpcEndpointId": "vpce-0c6704541b11af063", 
            "VpcEndpointType": "Interface", 
            "CreationTimestamp": "2019-03-31T08:57:11.000Z", 
            "DnsEntries": [
                {
                    "HostedZoneId": "Z27UANNT0PRK1T", 
                    "DnsName": "vpce-0c6704541b11af063-turruh7t.vpce-svc-09e985a9f6db76c88.ap-northeast-2.vpce.amazonaws.com"
                }, 
                {
                    "HostedZoneId": "Z27UANNT0PRK1T", 
                    "DnsName": "vpce-0c6704541b11af063-turruh7t-ap-northeast-2a.vpce-svc-09e985a9f6db76c88.ap-northeast-2.vpce.amazonaws.com"
                }, 
                {
                    "HostedZoneId": "Z27UANNT0PRK1T", 
                    "DnsName": "vpce-0c6704541b11af063-turruh7t-ap-northeast-2c.vpce-svc-09e985a9f6db76c88.ap-northeast-2.vpce.amazonaws.com"
                }
            ]
        }
    ]
}
DnsEntries에서 DnsName vpce-0c6704541b11af063-turruh7t.vpce-svc-09e985a9f6db76c88.ap-northeast-2.vpce.amazonaws.com 를 확인 할 수 있다.

웹 콘솔에서 보면 Aurora RDS와는 달리 클러스터 정보가 보이지 않는 걸 알 수 있다. Aurora 서버리스는 HA와 Read Replica를 지원하지 않는 것인가 ? 이 질문에 답하기 위해서는 복제본이 필요한 이유를 살펴봐야 한다. Aurora 서버리스 데이터베이스 아키텍처를 보자.

 Aurora 서버리스 데이터베이스 아키텍처

Aurora RDS는 컴퓨팅 클러스터와 분리된 백앤드 클러스터 스토리지를 사용하고 있다는 것은 알려진 사실이다. 이 스토리지 클러서터는 가용영역에 걸쳐있다. Aurora 서버리스도 동일한 구조를 가지고 있다. Aurora 서버리스의 다른 점은 CPU와 메모리 구조에 있다. 우리는 원하는 ACU 용량으로 서버를 시작 할 수 있다.

애플리케이션 밑에는 Proxy fleet계층이 있다. Proxy fleet는 애플리케이션에 endpoint를 제공하는 역할을 한다. Proxy fleet는 데이터베이스 용량이 늘어나거나 줄어들 경우 자동으로 새로운 리소스로 라우팅을 한다. 자동으로 경로를 조정하는 동안에 연결이 끊이지 않는다. 일종의 로드밸런서라고 보면된다. 그리고 용량이 변경될 때, 새로 리소스를 할당하지 않고 Warm pool에 준비되어 있는 리소스를 가져와서 쓰기 때문에 신속하게 자원을 전개할 수 있다.

HA는 마스터가 다운될 경우, 미리 준비중인 다른 인스턴스(슬레이브라고 하는)를 실행하는 방식으로 작동한다. Aurora 서버리스는 자동으로 요청의 증감을 처리하고, Proxy fleet가 요청을 라우팅하기 때문에 HA가 필요가 없다.

Auto Pause 와 Resume

Aurora 데이터베이스에 설정한 시간동안 사용이 없으면 컴퓨팅과 메모리가 중지 상태에 들어가며, 이 기간 동안은 과금되지 않는다. 멋진 기능 같지만, 클러스터가 중지된 상태에서 최초연결이 들어올 경우 최대 25초 정도의 시간이 걸린다는 문제가 있다. 따라서 일반 유저가 사용하는 인터넷 서비스에 Aurora 서버리스는 적당하지 않다. 내부 테스트, 배치작업, 어드민페이지(업무시간에만 접속하는) 등에 사용하면 비용을 크게 절약 할 수 있을 것이다.

Autoscaling은 언제, 어떤 조건으로 일어나는가

Scale Up은 아래 조건이 3분 이상 연속해서 발생 할 때 수행한다.
  • CPU > 70%
  • Connections > 90%
Scale Down은 아래 조건이 15분 이상 연속해서 발생할 때 수행한다.
  • CPU < 30%
  • Connections < 40%

Autoscaling은 언제 실패하는가

  1. 롱쿼리가 실행 중일 때
  2. Temp 테이블이나 테이블이 락(lock)상태일 때

참고