도커 기반 데이터베이스 자율 운영: PostgreSQL/MySQL을 $5 VPS로 안정적으로 운영하는 방법
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
DevOps
대상자
- 대상: 중소규모 애플리케이션 개발자, 학습용 프로젝트 운영자, 내부 툴 개발자
- 난이도: 중급 (Docker 및 Linux 기초 지식 필요)
핵심 요약
- 도커 + $5 VPS를 활용해 PostgreSQL/MySQL을 안정적으로 운영할 수 있음.
- 보안 강화(SSH 설정, 방화벽), 자동 백업(cron + S3), 모니터링(Prometheus + Grafana) 구현 필수.
- 비용 절감($5/month VPS + $0.023/GB S3 백업)과 자율성(환경 설정, 성능 최적화)의 균형 달성.
섹션별 세부 요약
1. 문제 상황: 관리형 DB의 한계
- 비용: $500/month 이상의 관리형 DB 요금 부담.
- 제어권 부족:
shared_buffers
등 설정 변경 불가. - 성능: 앱과 DB 간 지연 발생 가능성.
2. 자율 운영의 핵심 조건
- VPS 선택:
- DigitalOcean: $6/month (1GB RAM, 25GB SSD).
- Linode: $5/month (1GB RAM, NVMe 저장소).
- Hetzner: €4.49/month (2GB RAM, 독일 기반).
- 운영체제: Ubuntu 22.04 LTS (Docker 호환성 보장).
3. 도커 설정 예시
- PostgreSQL:
```yaml
services:
db:
image: postgres:15
volumes: - pg_data:/var/lib/postgresql/data
environment: POSTGRES_PASSWORD: your_strong_password
```
- MySQL:
```yaml
services:
db:
image: mysql:8.0
volumes: - mysql_data:/var/lib/mysql
environment: MYSQL_ROOT_PASSWORD: your_strong_password
```
4. 보안 및 운영 최적화
- SSH 보안 강화:
```bash
PermitRootLogin no
PasswordAuthentication no
AllowUsers your_username
```
- 방화벽 설정:
```bash
ufw allow 22/tcp
ufw allow 5432/tcp # PostgreSQL
ufw enable
```
5. 백업 및 모니터링
- 자동 백업 스크립트:
```bash
DATE=$(date +%Y-%m-%d)
docker exec postgres_db pg_dump -U postgres mydb > /backups/mydb_$DATE.sql
```
- 크론 작업:
```bash
- 2 * /bin/bash /scripts/backup_db.sh
```
- 모니터링 도구:
- Prometheus + Grafana 설치 예시:
```yaml
services:
prometheus:
image: prom/prometheus
volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml
grafana:
image: grafana/grafana
ports: - "3000:3000"
```
6. 운영 리스크 및 대응 방안
- 장애 대응:
- VPS 제공업체 중단 시 장애 복구 절차 필요.
- pg_hba.conf
설정 누락 시 보안 취약점 발생 가능성.
- 확장성 한계: 100+ writes/sec 시 성능 최적화 어려움.
7. 관리형 DB로 전환 시점
- 비용 vs 편의성: $200/month 이상 절약이 필요할 때.
- 수익성: 실질 수익을 창출하는 애플리케이션의 경우.
- 전문성: DBA 역할을 싫어할 때.
결론
- 도커 + 저비용 VPS를 활용한 자율 운영은 $10/month 미만의 비용으로 고성능, 고보안의 데이터베이스를 구축할 수 있음.
- 핵심 팁:
- 도커 컴포즈로 빠른 배포.
- S3/Backblaze로 백업 자동화.
- Prometheus + Grafana로 실시간 모니터링.
- SSH/방화벽 설정으로 보안 강화.
- DB 사용자 권한 최소화(예: app_user
생성).