phonebill/develop/database/plan/db-plan-bill-inquiry-prod.md
2025-09-09 01:12:14 +09:00

603 lines
19 KiB
Markdown

# Bill-Inquiry 서비스 운영환경 데이터베이스 설치 계획서
## 1. 개요
### 1.1 설치 목적
- Bill-Inquiry 서비스의 운영환경 데이터베이스 구성
- Azure Database for PostgreSQL Flexible Server 활용한 관리형 데이터베이스 구축
- 고가용성, 고성능, 엔터프라이즈급 보안을 제공하는 운영환경 데이터베이스 시스템 구축
### 1.2 대상 서비스
- **서비스명**: Bill-Inquiry Service (요금 조회 서비스)
- **데이터베이스**: `bill_inquiry_db`
- **운영환경**: Azure 운영환경 (99.9% 가용성 목표)
- **예상 사용량**: Peak 1,000 동시 사용자 지원
### 1.3 참조 문서
- 물리 아키텍처 설계서: `design/backend/physical/physical-architecture-prod.md`
- 데이터 설계서: `design/backend/database/bill-inquiry.md`
- 데이터 설계 종합: `design/backend/database/data-design-summary.md`
- 스키마 스크립트: `design/backend/database/bill-inquiry-schema.psql`
## 2. Azure Database for PostgreSQL Flexible Server 구성
### 2.1 기본 설정
| 구성 항목 | 설정 값 | 설명 |
|----------|---------|------|
| 서버 이름 | phonebill-bill-inquiry-prod-pg | Bill-Inquiry 운영환경 PostgreSQL |
| 리전 | Korea Central | 주 리전 |
| PostgreSQL 버전 | 14 | 안정적인 LTS 버전 |
| 서비스 티어 | General Purpose | 범용 용도 (운영환경) |
| 컴퓨팅 크기 | Standard_D4s_v3 | 4 vCPU, 16GB RAM |
| 스토리지 | 256GB Premium SSD | 고성능 SSD, 자동 확장 활성화 |
### 2.2 고가용성 구성
| 구성 항목 | 설정 값 | 설명 |
|----------|---------|------|
| 고가용성 모드 | Zone Redundant HA | 영역 간 중복화 |
| 주 가용 영역 | 1 | Korea Central 가용 영역 1 |
| 대기 가용 영역 | 2 | Korea Central 가용 영역 2 |
| 자동 장애조치 | 활성화 | 60초 이내 자동 장애조치 |
| SLA | 99.99% | 고가용성 보장 |
### 2.3 백업 및 복구
| 구성 항목 | 설정 값 | 설명 |
|----------|---------|------|
| 백업 보존 기간 | 35일 | 최대 보존 기간 |
| 지리적 중복 백업 | 활성화 | Korea South 리전에 복제 |
| Point-in-Time 복구 | 활성화 | 5분 단위 복구 가능 |
| 자동 백업 시간 | 02:00 KST | 트래픽이 적은 시간대 |
## 3. 네트워크 및 보안 구성
### 3.1 네트워크 설정
| 구성 항목 | 설정 값 | 설명 |
|----------|---------|------|
| 연결 방법 | Private Access (VNet 통합) | VNet 내부 전용 접근 |
| 가상 네트워크 | phonebill-vnet | 기존 VNet 활용 |
| 서브넷 | Database Subnet (10.0.2.0/24) | 데이터베이스 전용 서브넷 |
| Private Endpoint | 활성화 | 보안 강화된 연결 |
| DNS 영역 | privatelink.postgres.database.azure.com | Private DNS 영역 |
### 3.2 보안 설정
| 구성 항목 | 설정 값 | 설명 |
|----------|---------|------|
| TLS 버전 | 1.2 이상 | 암호화 통신 강제 |
| SSL 강제 | 활성화 | 비암호화 연결 차단 |
| 방화벽 규칙 | VNet 내부만 허용 | AKS 서브넷만 접근 허용 |
| 인증 방법 | PostgreSQL Authentication | 기본 인증 + Azure AD 통합 |
| 암호화 | AES-256 | 저장 데이터 암호화 (TDE) |
### 3.3 Azure AD 통합
| 구성 항목 | 설정 값 | 설명 |
|----------|---------|------|
| Azure AD 인증 | 활성화 | 관리형 ID 지원 |
| AD 관리자 | phonebill-admin | Azure AD 기반 관리자 |
| 서비스 주체 | bill-inquiry-service-identity | 애플리케이션용 관리형 ID |
## 4. 데이터베이스 및 사용자 구성
### 4.1 데이터베이스 생성
```sql
-- 메인 데이터베이스 생성
CREATE DATABASE bill_inquiry_db
WITH ENCODING = 'UTF8'
LC_COLLATE = 'en_US.UTF-8'
LC_CTYPE = 'en_US.UTF-8'
TEMPLATE = template0;
-- 타임존 설정
ALTER DATABASE bill_inquiry_db SET timezone TO 'Asia/Seoul';
-- 확장 모듈 설치
\c bill_inquiry_db
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "pg_stat_statements";
CREATE EXTENSION IF NOT EXISTS "pg_trgm";
```
### 4.2 사용자 및 권한 설정
```sql
-- 애플리케이션 사용자 생성
CREATE USER bill_app_user WITH PASSWORD 'Complex#Password#2025!';
-- 읽기 전용 사용자 생성 (모니터링/분석용)
CREATE USER bill_readonly_user WITH PASSWORD 'ReadOnly#Password#2025!';
-- 백업 전용 사용자 생성
CREATE USER bill_backup_user WITH PASSWORD 'Backup#Password#2025!';
-- 애플리케이션 사용자 권한
GRANT CONNECT ON DATABASE bill_inquiry_db TO bill_app_user;
GRANT USAGE ON SCHEMA public TO bill_app_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO bill_app_user;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO bill_app_user;
-- 읽기 전용 사용자 권한
GRANT CONNECT ON DATABASE bill_inquiry_db TO bill_readonly_user;
GRANT USAGE ON SCHEMA public TO bill_readonly_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO bill_readonly_user;
-- 기본 권한 설정 (신규 테이블에 자동 적용)
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO bill_app_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO bill_readonly_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT USAGE, SELECT ON SEQUENCES TO bill_app_user;
```
## 5. 성능 최적화 설정
### 5.1 PostgreSQL 파라미터 튜닝
```sql
-- 연결 풀링 설정
ALTER SYSTEM SET max_connections = 200;
ALTER SYSTEM SET shared_preload_libraries = 'pg_stat_statements';
-- 메모리 설정 (16GB RAM 기준)
ALTER SYSTEM SET shared_buffers = '4GB';
ALTER SYSTEM SET effective_cache_size = '12GB';
ALTER SYSTEM SET work_mem = '64MB';
ALTER SYSTEM SET maintenance_work_mem = '1GB';
-- 체크포인트 설정
ALTER SYSTEM SET checkpoint_completion_target = 0.9;
ALTER SYSTEM SET max_wal_size = '4GB';
ALTER SYSTEM SET min_wal_size = '1GB';
-- 로깅 설정
ALTER SYSTEM SET log_min_duration_statement = 1000;
ALTER SYSTEM SET log_checkpoints = on;
ALTER SYSTEM SET log_connections = on;
ALTER SYSTEM SET log_disconnections = on;
-- 통계 수집 설정
ALTER SYSTEM SET track_activities = on;
ALTER SYSTEM SET track_counts = on;
ALTER SYSTEM SET track_io_timing = on;
-- 설정 적용
SELECT pg_reload_conf();
```
### 5.2 연결 풀링 구성
| 구성 항목 | 설정 값 | 설명 |
|----------|---------|------|
| 최대 연결 수 | 200 | 동시 연결 제한 |
| HikariCP Pool Size | 15 | 애플리케이션 연결 풀 크기 |
| 연결 타임아웃 | 30초 | 연결 획득 타임아웃 |
| 유휴 타임아웃 | 10분 | 유휴 연결 해제 시간 |
| 최대 라이프타임 | 30분 | 연결 최대 생존 시간 |
## 6. 스키마 및 데이터 초기화
### 6.1 스키마 적용
```bash
# 스키마 파일 적용
psql -h phonebill-bill-inquiry-prod-pg.postgres.database.azure.com \
-U bill_app_user \
-d bill_inquiry_db \
-f design/backend/database/bill-inquiry-schema.psql
```
### 6.2 초기 데이터 확인
```sql
-- 테이블 생성 확인
SELECT table_name, table_type
FROM information_schema.tables
WHERE table_schema = 'public'
ORDER BY table_name;
-- 인덱스 생성 확인
SELECT schemaname, tablename, indexname
FROM pg_indexes
WHERE schemaname = 'public'
ORDER BY tablename, indexname;
-- 시스템 설정 확인
SELECT config_key, config_value, description
FROM system_config
WHERE is_active = true
ORDER BY config_key;
```
## 7. 읽기 전용 복제본 구성
### 7.1 읽기 복제본 생성
| 구성 항목 | 설정 값 | 설명 |
|----------|---------|------|
| 복제본 이름 | phonebill-bill-inquiry-prod-pg-replica | 읽기 전용 복제본 |
| 리전 | Korea South | 재해복구용 다른 리전 |
| 컴퓨팅 크기 | Standard_D2s_v3 | 2 vCPU, 8GB RAM (읽기용) |
| 스토리지 | 256GB Premium SSD | 마스터와 동일 |
| 용도 | 읽기 부하 분산 및 재해복구 | - |
### 7.2 읽기 복제본 활용
```yaml
application_config:
# Spring Boot DataSource 설정 예시
datasource:
master:
url: jdbc:postgresql://phonebill-bill-inquiry-prod-pg.postgres.database.azure.com:5432/bill_inquiry_db
username: bill_app_user
readonly:
url: jdbc:postgresql://phonebill-bill-inquiry-prod-pg-replica.postgres.database.azure.com:5432/bill_inquiry_db
username: bill_readonly_user
# 읽기/쓰기 분리 라우팅
routing:
write_operations: master
read_operations: readonly
analytics_queries: readonly
```
## 8. 모니터링 및 알림 설정
### 8.1 Azure Monitor 통합
| 모니터링 항목 | 알림 임계값 | 대응 방안 |
|--------------|-------------|----------|
| CPU 사용률 | 85% 이상 | Auto-scaling 또는 수동 스케일업 |
| 메모리 사용률 | 90% 이상 | 연결 최적화 또는 스케일업 |
| 디스크 사용률 | 80% 이상 | 스토리지 자동 확장 |
| 연결 수 | 180개 이상 (90%) | 연결 풀 튜닝 |
| 응답 시간 | 500ms 이상 | 쿼리 최적화 검토 |
| 실패한 연결 | 10회/분 이상 | 네트워크 및 보안 설정 점검 |
### 8.2 로그 분석 설정
```sql
-- 슬로우 쿼리 모니터링
SELECT query, calls, total_time, rows, 100.0 * shared_blks_hit /
nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent
FROM pg_stat_statements
WHERE total_time > 60000 -- 1분 이상 쿼리
ORDER BY total_time DESC
LIMIT 10;
-- 데이터베이스 통계
SELECT datname, numbackends, xact_commit, xact_rollback,
blks_read, blks_hit,
100.0 * blks_hit / (blks_hit + blks_read) as cache_hit_ratio
FROM pg_stat_database
WHERE datname = 'bill_inquiry_db';
```
## 9. 백업 및 재해복구 계획
### 9.1 백업 전략
| 백업 유형 | 주기 | 보존 기간 | 위치 |
|----------|------|-----------|------|
| 자동 백업 | 일 1회 (02:00 KST) | 35일 | Azure 백업 스토리지 |
| 지리적 백업 | 자동 복제 | 35일 | Korea South 리전 |
| Point-in-Time | 연속 | 35일 내 5분 단위 | WAL 로그 기반 |
| 논리적 백업 | 주 1회 (일요일) | 3개월 | Azure Blob Storage |
### 9.2 재해복구 절차
#### RTO/RPO 목표
- **RTO (복구 시간 목표)**: 30분 이내
- **RPO (복구 지점 목표)**: 5분 이내
#### 장애 시나리오별 대응
1. **주 서버 장애**
- Azure 자동 장애조치 (60초 이내)
- DNS 업데이트 (자동)
- 애플리케이션 재연결 (자동)
2. **리전 전체 장애**
- 읽기 복제본을 마스터로 승격
- 애플리케이션 설정 변경
- 트래픽 라우팅 변경
3. **데이터 손상**
- Point-in-Time 복구 수행
- 별도 서버에서 복구 후 전환
- 데이터 무결성 검증
## 10. 보안 강화 방안
### 10.1 접근 제어
```sql
-- 특권 사용자 역할 생성
CREATE ROLE bill_admin;
GRANT ALL PRIVILEGES ON DATABASE bill_inquiry_db TO bill_admin;
-- 개발자 역할 생성 (제한적 권한)
CREATE ROLE bill_developer;
GRANT CONNECT ON DATABASE bill_inquiry_db TO bill_developer;
GRANT USAGE ON SCHEMA public TO bill_developer;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO bill_developer;
-- 감사 역할 생성
CREATE ROLE bill_auditor;
GRANT CONNECT ON DATABASE bill_inquiry_db TO bill_auditor;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO bill_auditor;
```
### 10.2 데이터 암호화
| 암호화 유형 | 구현 방법 | 대상 데이터 |
|------------|-----------|-------------|
| 저장 데이터 암호화 | TDE (투명한 데이터 암호화) | 모든 테이블 데이터 |
| 전송 데이터 암호화 | TLS 1.2+ | 클라이언트-서버 간 통신 |
| 컬럼 수준 암호화 | AES-256 | 고객명, 요금정보 등 민감정보 |
| 백업 암호화 | AES-256 | 모든 백업 파일 |
### 10.3 감사 설정
```sql
-- 감사 로그 활성화
ALTER SYSTEM SET log_statement = 'all';
ALTER SYSTEM SET log_line_prefix = '%t [%p]: user=%u,db=%d,app=%a,client=%h ';
ALTER SYSTEM SET log_lock_waits = on;
ALTER SYSTEM SET log_temp_files = 10240; -- 10MB 이상 임시 파일 로그
-- pg_audit 확장 설치 (필요시)
-- CREATE EXTENSION pg_audit;
-- ALTER SYSTEM SET pg_audit.log = 'write,ddl';
```
## 11. 비용 최적화
### 11.1 예상 비용 (월간, USD)
| 구성 요소 | 사양 | 예상 비용 | 최적화 방안 |
|----------|------|-----------|-------------|
| 메인 서버 | Standard_D4s_v3 | $450 | Reserved Instance (1년 약정 20% 절약) |
| 읽기 복제본 | Standard_D2s_v3 | $225 | 필요시에만 활성화 |
| 스토리지 (256GB) | Premium SSD | $50 | 사용량 기반 자동 확장 |
| 백업 스토리지 | 지리적 중복 | $20 | 보존 기간 최적화 |
| 네트워킹 | 데이터 전송 | $10 | VNet 내부 통신 활용 |
| **총 예상 비용** | | **$755** | **Reserved Instance 시 $605** |
### 11.2 비용 모니터링
```sql
-- 리소스 사용량 모니터링 쿼리
SELECT
schemaname,
tablename,
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) as size,
pg_total_relation_size(schemaname||'.'||tablename) as size_bytes
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
-- 인덱스 사용률 확인
SELECT
t.tablename,
i.indexname,
i.idx_tup_read,
i.idx_tup_fetch,
pg_size_pretty(pg_relation_size(i.indexname::regclass)) as index_size
FROM pg_stat_user_indexes i
JOIN pg_stat_user_tables t ON i.relid = t.relid
WHERE i.idx_tup_read = 0
ORDER BY pg_relation_size(i.indexname::regclass) DESC;
```
## 12. 설치 실행 계획
### 12.1 설치 단계
| 단계 | 작업 내용 | 예상 시간 | 담당자 |
|------|-----------|----------|--------|
| 1 | Azure PostgreSQL Flexible Server 생성 | 30분 | 데옵스 |
| 2 | 네트워크 및 보안 설정 | 20분 | 데옵스 |
| 3 | 고가용성 및 백업 설정 | 15분 | 데옵스 |
| 4 | 데이터베이스 및 사용자 생성 | 10분 | 백엔더 |
| 5 | 스키마 적용 및 초기화 | 15분 | 백엔더 |
| 6 | 읽기 복제본 생성 | 20분 | 데옵스 |
| 7 | 모니터링 및 알림 설정 | 30분 | 데옵스 |
| 8 | 성능 테스트 및 튜닝 | 60분 | 백엔더/QA매니저 |
| **총 예상 시간** | | **3시간 20분** | |
### 12.2 사전 준비사항
```yaml
prerequisites:
azure_resources:
- Resource Group: phonebill-rg
- Virtual Network: phonebill-vnet
- Database Subnet: 10.0.2.0/24
- Private DNS Zone: privatelink.postgres.database.azure.com
azure_permissions:
- Contributor role on Resource Group
- Network Contributor role on VNet
- PostgreSQL Flexible Server Contributor
network_connectivity:
- AKS cluster network access
- Azure CLI access from deployment machine
- psql client tools installed
```
### 12.3 설치 스크립트
```bash
#!/bin/bash
# Bill-Inquiry 서비스 PostgreSQL 설치 스크립트
# 변수 설정
RESOURCE_GROUP="phonebill-rg"
SERVER_NAME="phonebill-bill-inquiry-prod-pg"
LOCATION="koreacentral"
ADMIN_USER="postgres"
ADMIN_PASSWORD="Complex#PostgreSQL#2025!"
DATABASE_NAME="bill_inquiry_db"
# PostgreSQL Flexible Server 생성
az postgres flexible-server create \
--resource-group $RESOURCE_GROUP \
--name $SERVER_NAME \
--location $LOCATION \
--admin-user $ADMIN_USER \
--admin-password "$ADMIN_PASSWORD" \
--sku-name Standard_D4s_v3 \
--tier GeneralPurpose \
--storage-size 256 \
--storage-auto-grow Enabled \
--version 14 \
--zone 1 \
--high-availability ZoneRedundant \
--standby-zone 2
# 데이터베이스 생성
az postgres flexible-server db create \
--resource-group $RESOURCE_GROUP \
--server-name $SERVER_NAME \
--database-name $DATABASE_NAME
# VNet 통합 설정
az postgres flexible-server vnet-rule create \
--resource-group $RESOURCE_GROUP \
--name allow-aks-subnet \
--server-name $SERVER_NAME \
--vnet-name phonebill-vnet \
--subnet database-subnet
# 백업 설정
az postgres flexible-server parameter set \
--resource-group $RESOURCE_GROUP \
--server-name $SERVER_NAME \
--name backup_retention_days \
--value 35
echo "PostgreSQL Flexible Server 설치 완료"
echo "Server: $SERVER_NAME.postgres.database.azure.com"
echo "Database: $DATABASE_NAME"
```
## 13. 테스트 계획
### 13.1 기능 테스트
```sql
-- 연결 테스트
\conninfo
-- 기본 성능 테스트
SELECT pg_size_pretty(pg_database_size('bill_inquiry_db')) as db_size;
-- 테이블 생성 및 CRUD 테스트
INSERT INTO system_config (config_key, config_value, description)
VALUES ('test.config', 'test_value', 'Test configuration');
SELECT * FROM system_config WHERE config_key = 'test.config';
DELETE FROM system_config WHERE config_key = 'test.config';
```
### 13.2 성능 테스트
```bash
# pgbench를 이용한 성능 테스트
pgbench -i -s 10 bill_inquiry_db -h $SERVER_NAME.postgres.database.azure.com -U bill_app_user
pgbench -c 50 -j 2 -T 300 bill_inquiry_db -h $SERVER_NAME.postgres.database.azure.com -U bill_app_user
```
### 13.3 장애복구 테스트
1. **계획된 장애조치 테스트**
- Azure Portal에서 수동 장애조치 수행
- 애플리케이션 연결 상태 확인
- 복구 시간 측정
2. **백업 복구 테스트**
- Point-in-Time 복구 수행
- 데이터 무결성 검증
- 복구 시간 측정
## 14. 운영 가이드
### 14.1 일상 운영 점검
```yaml
daily_checklist:
- [ ] 서버 상태 및 가용성 확인
- [ ] CPU/메모리/디스크 사용률 점검
- [ ] 백업 성공 여부 확인
- [ ] 슬로우 쿼리 로그 검토
- [ ] 오류 로그 검토
- [ ] 연결 수 및 성능 지표 확인
weekly_checklist:
- [ ] 장애조치 메커니즘 테스트
- [ ] 백업 복구 테스트 수행
- [ ] 성능 통계 분석 및 튜닝
- [ ] 보안 패치 적용 검토
- [ ] 용량 계획 검토
monthly_checklist:
- [ ] 전체 시스템 성능 검토
- [ ] 비용 최적화 기회 분석
- [ ] 재해복구 계획 업데이트
- [ ] 보안 감사 수행
```
### 14.2 긴급 대응 절차
```yaml
incident_response:
severity_1: # 서비스 중단
- immediate_action: 자동 장애조치 확인
- notification: 운영팀 즉시 알림
- escalation: 15분 내 관리자 호출
- recovery_target: 30분 내 서비스 복구
severity_2: # 성능 저하
- analysis: 성능 지표 분석
- optimization: 쿼리 튜닝 또는 리소스 증설
- timeline: 2시간 내 해결
severity_3: # 경미한 문제
- monitoring: 지속적 모니터링
- planning: 다음 정기 점검 시 해결
- timeline: 24시간 내 계획 수립
```
## 15. 결론
본 설치 계획서는 Bill-Inquiry 서비스의 운영환경에서 요구되는 고가용성, 고성능, 엔터프라이즈급 보안을 만족하는 Azure Database for PostgreSQL Flexible Server 구성을 제시합니다.
### 15.1 주요 특징
- **고가용성**: Zone Redundant HA로 99.99% 가용성 보장
- **성능 최적화**: Premium SSD, 읽기 복제본, 연결 풀링
- **보안 강화**: VNet 통합, TLS 암호화, Azure AD 인증
- **재해복구**: 35일 백업 보존, 지리적 중복, Point-in-Time 복구
- **비용 효율성**: Reserved Instance 활용으로 20% 비용 절약
### 15.2 다음 단계
1. 본 계획서 검토 및 승인 ✅
2. Azure 리소스 생성 및 구성 수행
3. 스키마 적용 및 초기화 실행
4. 성능 테스트 및 튜닝 수행
5. 모니터링 시스템 구축
6. 운영 문서 작성 및 교육
---
**작성일**: 2025-09-08
**작성자**: 데옵스 (최운영), 백엔더 (이개발)
**검토자**: 아키텍트 (김기획), QA매니저 (정테스트)
**승인자**: 기획자 (김기획)