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

19 KiB

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 데이터베이스 생성

-- 메인 데이터베이스 생성
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 사용자 및 권한 설정

-- 애플리케이션 사용자 생성
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 파라미터 튜닝

-- 연결 풀링 설정
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 스키마 적용

# 스키마 파일 적용
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 초기 데이터 확인

-- 테이블 생성 확인
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 읽기 복제본 활용

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 로그 분석 설정

-- 슬로우 쿼리 모니터링
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 접근 제어

-- 특권 사용자 역할 생성
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 감사 설정

-- 감사 로그 활성화
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 비용 모니터링

-- 리소스 사용량 모니터링 쿼리
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 사전 준비사항

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 설치 스크립트

#!/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 기능 테스트

-- 연결 테스트
\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 성능 테스트

# 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 일상 운영 점검

daily_checklist:
  - [ ] 서버 상태 및 가용성 확인
  - [ ] CPU/메모리/디스크 사용률 점검
  - [ ] 백업 성공 여부 확인
  - [ ] 슬로우 쿼리 로그 검토
  - [ ] 오류 로그 검토
  - [ ] 연결 수 및 성능 지표 확인

weekly_checklist:
  - [ ] 장애조치 메커니즘 테스트
  - [ ] 백업 복구 테스트 수행
  - [ ] 성능 통계 분석 및 튜닝
  - [ ] 보안 패치 적용 검토
  - [ ] 용량 계획 검토

monthly_checklist:
  - [ ] 전체 시스템 성능 검토
  - [ ] 비용 최적화 기회 분석
  - [ ] 재해복구 계획 업데이트
  - [ ] 보안 감사 수행

14.2 긴급 대응 절차

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매니저 (정테스트)
승인자: 기획자 (김기획)