Managed Relational Databases (RDS / Cloud SQL)
Managed Relational Databases (RDS / Cloud SQL)¶
1. Managed DB Overview¶
1.1 Managed vs Self-Managed¶
| Task | Self-Managed (EC2) | Managed (RDS/Cloud SQL) |
|---|---|---|
| Hardware Provisioning | User | Provider |
| OS Patching | User | Provider |
| DB Installation/Setup | User | Provider |
| Backup | User | Automatic |
| High Availability | User | Option provided |
| Scaling | Manual | Button click |
| Monitoring | Setup required | Built-in |
1.2 Service Comparison¶
| Category | AWS | GCP |
|---|---|---|
| Managed RDB | RDS | Cloud SQL |
| High-Performance DB | Aurora | Cloud Spanner, AlloyDB |
| Supported Engines | MySQL, PostgreSQL, MariaDB, Oracle, SQL Server | MySQL, PostgreSQL, SQL Server |
2. AWS RDS¶
2.1 Creating an RDS Instance¶
# DB μλΈλ· κ·Έλ£Ή μμ±
aws rds create-db-subnet-group \
--db-subnet-group-name my-subnet-group \
--db-subnet-group-description "My DB subnets" \
--subnet-ids subnet-1 subnet-2
# νλΌλ―Έν° κ·Έλ£Ή μμ± (μ ν)
aws rds create-db-parameter-group \
--db-parameter-group-name my-params \
--db-parameter-group-family mysql8.0 \
--description "Custom parameters"
# RDS μΈμ€ν΄μ€ μμ±
aws rds create-db-instance \
--db-instance-identifier my-database \
--db-instance-class db.t3.micro \
--engine mysql \
--engine-version 8.0 \
--master-username admin \
--master-user-password MyPassword123! \
--allocated-storage 20 \
--storage-type gp3 \
--db-subnet-group-name my-subnet-group \
--vpc-security-group-ids sg-12345678 \
--backup-retention-period 7 \
--multi-az \
--publicly-accessible false
# μμ± μν νμΈ
aws rds describe-db-instances \
--db-instance-identifier my-database \
--query 'DBInstances[0].DBInstanceStatus'
2.2 Multi-AZ Deployment¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β VPC β
β βββββββββββββββββββββββ βββββββββββββββββββββββ β
β β AZ-a β β AZ-b β β
β β βββββββββββββββββ β β βββββββββββββββββ β β
β β β Primary DB ββββΌβββΌβββ Standby DB β β β
β β β (Read/Write) β β β β (Sync repl) β β β
β β βββββββββββββββββ β β βββββββββββββββββ β β
β βββββββββββββββββββββββ βββββββββββββββββββββββ β
β β Automatic failover β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# κΈ°μ‘΄ μΈμ€ν΄μ€λ₯Ό Multi-AZλ‘ λ³κ²½
aws rds modify-db-instance \
--db-instance-identifier my-database \
--multi-az \
--apply-immediately
2.3 Read Replicas¶
# μ½κΈ° 볡μ λ³Έ μμ± (κ°μ 리μ )
aws rds create-db-instance-read-replica \
--db-instance-identifier my-read-replica \
--source-db-instance-identifier my-database
# λ€λ₯Έ 리μ μ μ½κΈ° 볡μ λ³Έ (ν¬λ‘μ€ λ¦¬μ )
aws rds create-db-instance-read-replica \
--db-instance-identifier my-replica-us \
--source-db-instance-identifier arn:aws:rds:ap-northeast-2:123456789012:db:my-database \
--region us-east-1
# 볡μ λ³Έ μΉκ²© (λ§μ€ν°λ‘ λ³ν)
aws rds promote-read-replica \
--db-instance-identifier my-read-replica
2.4 Backup and Restore¶
# μλ μ€λ
μ· μμ±
aws rds create-db-snapshot \
--db-instance-identifier my-database \
--db-snapshot-identifier my-snapshot-2024
# μ€λ
μ·μμ 볡μ
aws rds restore-db-instance-from-db-snapshot \
--db-instance-identifier my-restored-db \
--db-snapshot-identifier my-snapshot-2024
# νΉμ μμ 볡μ (Point-in-Time Recovery)
aws rds restore-db-instance-to-point-in-time \
--source-db-instance-identifier my-database \
--target-db-instance-identifier my-pitr-db \
--restore-time 2024-01-15T10:00:00Z
# μλ λ°±μ
μ€μ νμΈ/λ³κ²½
aws rds modify-db-instance \
--db-instance-identifier my-database \
--backup-retention-period 14 \
--preferred-backup-window "03:00-04:00"
3. GCP Cloud SQL¶
3.1 Creating a Cloud SQL Instance¶
# Cloud SQL API νμ±ν
gcloud services enable sqladmin.googleapis.com
# MySQL μΈμ€ν΄μ€ μμ±
gcloud sql instances create my-database \
--database-version=MYSQL_8_0 \
--tier=db-f1-micro \
--region=asia-northeast3 \
--root-password=MyPassword123! \
--storage-size=10GB \
--storage-type=SSD \
--backup-start-time=03:00 \
--availability-type=REGIONAL
# PostgreSQL μΈμ€ν΄μ€ μμ±
gcloud sql instances create my-postgres \
--database-version=POSTGRES_15 \
--tier=db-g1-small \
--region=asia-northeast3
# μΈμ€ν΄μ€ μ 보 νμΈ
gcloud sql instances describe my-database
3.2 High Availability (HA)¶
# κ³ κ°μ©μ± μΈμ€ν΄μ€ μμ±
gcloud sql instances create my-ha-db \
--database-version=MYSQL_8_0 \
--tier=db-n1-standard-2 \
--region=asia-northeast3 \
--availability-type=REGIONAL \
--root-password=MyPassword123!
# κΈ°μ‘΄ μΈμ€ν΄μ€λ₯Ό HAλ‘ λ³κ²½
gcloud sql instances patch my-database \
--availability-type=REGIONAL
3.3 Read Replicas¶
# μ½κΈ° 볡μ λ³Έ μμ±
gcloud sql instances create my-read-replica \
--master-instance-name=my-database \
--region=asia-northeast3
# 볡μ λ³Έ μΉκ²©
gcloud sql instances promote-replica my-read-replica
# 볡μ λ³Έ λͺ©λ‘ νμΈ
gcloud sql instances list --filter="masterInstanceName:my-database"
3.4 Backup and Restore¶
# μ¨λ맨λ λ°±μ
μμ±
gcloud sql backups create \
--instance=my-database \
--description="Manual backup"
# λ°±μ
λͺ©λ‘ νμΈ
gcloud sql backups list --instance=my-database
# λ°±μ
μμ 볡μ (μ μΈμ€ν΄μ€)
gcloud sql instances restore-backup my-restored-db \
--backup-instance=my-database \
--backup-id=1234567890
# Point-in-Time Recovery
gcloud sql instances clone my-database my-pitr-db \
--point-in-time="2024-01-15T10:00:00Z"
4. Connection Setup¶
4.1 AWS RDS Connection¶
Security Group Setup:
# RDS 보μ κ·Έλ£Ήμ μ ν리μΌμ΄μ
μ κ·Ό νμ©
aws ec2 authorize-security-group-ingress \
--group-id sg-rds \
--protocol tcp \
--port 3306 \
--source-group sg-app
# μλν¬μΈνΈ νμΈ
aws rds describe-db-instances \
--db-instance-identifier my-database \
--query 'DBInstances[0].Endpoint'
Application Connection:
import pymysql
connection = pymysql.connect(
host='my-database.xxxx.ap-northeast-2.rds.amazonaws.com',
user='admin',
password='MyPassword123!',
database='mydb',
port=3306
)
4.2 GCP Cloud SQL Connection¶
Connection Methods:
- Public IP (Not Recommended)
# νΌλΈλ¦ IP νμ©
gcloud sql instances patch my-database \
--authorized-networks=203.0.113.0/24
# μ°κ²°
mysql -h <PUBLIC_IP> -u root -p
- Cloud SQL Proxy (Recommended)
# Cloud SQL Proxy λ€μ΄λ‘λ
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.8.0/cloud-sql-proxy.linux.amd64
chmod +x cloud-sql-proxy
# Proxy μ€ν
./cloud-sql-proxy PROJECT_ID:asia-northeast3:my-database
# λ€λ₯Έ ν°λ―Έλμμ μ°κ²°
mysql -h 127.0.0.1 -u root -p
- Private IP (Within VPC)
# Private IP νμ±ν
gcloud sql instances patch my-database \
--network=projects/PROJECT_ID/global/networks/my-vpc
# VPC λ΄ μΈμ€ν΄μ€μμ μ°κ²°
mysql -h <PRIVATE_IP> -u root -p
Python Connection (Cloud SQL Connector):
from google.cloud.sql.connector import Connector
import pymysql
connector = Connector()
def get_conn():
return connector.connect(
"project:region:instance",
"pymysql",
user="root",
password="password",
db="mydb"
)
connection = get_conn()
5. Performance Optimization¶
5.1 Instance Resizing¶
AWS RDS:
# μΈμ€ν΄μ€ ν΄λμ€ λ³κ²½
aws rds modify-db-instance \
--db-instance-identifier my-database \
--db-instance-class db.m5.large \
--apply-immediately
# μ€ν λ¦¬μ§ νμ₯ (μΆμ λΆκ°)
aws rds modify-db-instance \
--db-instance-identifier my-database \
--allocated-storage 100
GCP Cloud SQL:
# λ¨Έμ νμ
λ³κ²½
gcloud sql instances patch my-database \
--tier=db-n1-standard-4
# μ€ν λ¦¬μ§ νμ₯
gcloud sql instances patch my-database \
--storage-size=100GB
5.2 Parameter Tuning¶
AWS RDS Parameter Group:
# νλΌλ―Έν° λ³κ²½
aws rds modify-db-parameter-group \
--db-parameter-group-name my-params \
--parameters "ParameterName=max_connections,ParameterValue=500,ApplyMethod=pending-reboot"
aws rds modify-db-parameter-group \
--db-parameter-group-name my-params \
--parameters "ParameterName=innodb_buffer_pool_size,ParameterValue={DBInstanceClassMemory*3/4},ApplyMethod=pending-reboot"
GCP Cloud SQL Flags:
# νλκ·Έ μ€μ
gcloud sql instances patch my-database \
--database-flags=max_connections=500,innodb_buffer_pool_size=1073741824
6. Aurora / AlloyDB / Spanner¶
6.1 AWS Aurora¶
Aurora is a cloud-native relational database.
Features: - MySQL/PostgreSQL compatible - Auto-scaling up to 128TB - 6 replicas (3 AZs) - Up to 15 read replicas - Serverless option (Aurora Serverless)
# Aurora ν΄λ¬μ€ν° μμ±
aws rds create-db-cluster \
--db-cluster-identifier my-aurora \
--engine aurora-mysql \
--engine-version 8.0.mysql_aurora.3.04.0 \
--master-username admin \
--master-user-password MyPassword123! \
--db-subnet-group-name my-subnet-group \
--vpc-security-group-ids sg-12345678
# Aurora μΈμ€ν΄μ€ μΆκ°
aws rds create-db-instance \
--db-instance-identifier my-aurora-instance-1 \
--db-cluster-identifier my-aurora \
--db-instance-class db.r5.large \
--engine aurora-mysql
6.2 GCP Cloud Spanner¶
Spanner is a globally distributed relational database.
Features: - Global transactions - Unlimited scaling - 99.999% SLA - PostgreSQL-compatible interface
# Spanner μΈμ€ν΄μ€ μμ±
gcloud spanner instances create my-spanner \
--config=regional-asia-northeast3 \
--nodes=1 \
--description="My Spanner instance"
# λ°μ΄ν°λ² μ΄μ€ μμ±
gcloud spanner databases create mydb \
--instance=my-spanner
6.3 GCP AlloyDB¶
AlloyDB is a PostgreSQL-compatible high-performance database.
# AlloyDB ν΄λ¬μ€ν° μμ±
gcloud alloydb clusters create my-cluster \
--region=asia-northeast3 \
--password=MyPassword123!
# κΈ°λ³Έ μΈμ€ν΄μ€ μμ±
gcloud alloydb instances create primary \
--cluster=my-cluster \
--region=asia-northeast3 \
--instance-type=PRIMARY \
--cpu-count=2
7. Cost Comparison¶
7.1 AWS RDS Cost (Seoul)¶
| Instance | vCPU | Memory | Hourly Cost |
|---|---|---|---|
| db.t3.micro | 2 | 1 GB | ~$0.02 |
| db.t3.small | 2 | 2 GB | ~$0.04 |
| db.m5.large | 2 | 8 GB | ~$0.18 |
| db.r5.large | 2 | 16 GB | ~$0.26 |
Additional Costs: - Storage: gp3 $0.114/GB/month - Backup: retention Γ $0.095/GB/month - Multi-AZ: Instance cost Γ 2
7.2 GCP Cloud SQL Cost (Seoul)¶
| Tier | vCPU | Memory | Hourly Cost |
|---|---|---|---|
| db-f1-micro | Shared | 0.6 GB | ~$0.01 |
| db-g1-small | Shared | 1.7 GB | ~$0.03 |
| db-n1-standard-2 | 2 | 7.5 GB | ~$0.13 |
| db-n1-highmem-2 | 2 | 13 GB | ~$0.16 |
Additional Costs: - Storage: SSD $0.180/GB/month - High Availability: Instance cost Γ 2 - Backup: $0.08/GB/month
8. Security¶
8.1 Encryption¶
AWS RDS:
# μ μ₯ μ μνΈν (μμ± μ)
aws rds create-db-instance \
--storage-encrypted \
--kms-key-id arn:aws:kms:...:key/xxx \
...
# SSL κ°μ
aws rds modify-db-parameter-group \
--db-parameter-group-name my-params \
--parameters "ParameterName=require_secure_transport,ParameterValue=1"
GCP Cloud SQL:
# SSL μΈμ¦μ μμ±
gcloud sql ssl client-certs create my-client \
--instance=my-database \
--common-name=my-client
# SSL νμ μ€μ
gcloud sql instances patch my-database \
--require-ssl
8.2 IAM Authentication¶
AWS RDS IAM Authentication:
# IAM μΈμ¦ νμ±ν
aws rds modify-db-instance \
--db-instance-identifier my-database \
--enable-iam-database-authentication
# μμ ν ν° μμ±
aws rds generate-db-auth-token \
--hostname my-database.xxxx.rds.amazonaws.com \
--port 3306 \
--username iam_user
GCP Cloud SQL IAM:
# IAM μΈμ¦ νμ±ν
gcloud sql instances patch my-database \
--enable-database-flags \
--database-flags=cloudsql_iam_authentication=on
# IAM μ¬μ©μ μΆκ°
gcloud sql users create user@example.com \
--instance=my-database \
--type=CLOUD_IAM_USER
9. Next Steps¶
- 12_NoSQL_Databases.md - NoSQL Databases
- PostgreSQL/ - PostgreSQL Details