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

19 KiB

Auth 서비스 데이터베이스 설치 계획서 - 운영환경

1. 계획 개요

1.1 설치 목적

  • 서비스: Auth 서비스 (사용자 인증/인가)
  • 데이터베이스: phonebill_auth
  • 환경: 운영환경 (Production)
  • 플랫폼: Azure Database for PostgreSQL Flexible Server

1.2 설치 범위

  • Azure Database for PostgreSQL Flexible Server 인스턴스 생성
  • Auth 서비스 전용 데이터베이스 및 스키마 구성
  • 고가용성 및 보안 설정 구성
  • 백업 및 모니터링 설정

1.3 참조 문서

  • 물리아키텍처: design/backend/physical/physical-architecture-prod.md
  • 데이터설계서: design/backend/database/auth.md
  • 스키마파일: design/backend/database/auth-schema.psql
  • 백킹서비스가이드: claude/backing-service-method.md

2. 인프라 요구사항

2.1 Azure Database for PostgreSQL Flexible Server 구성

2.1.1 기본 설정

구성 항목 설정 값 비고
리소스 그룹 rg-phonebill-prod 운영환경 전용
서버 이름 phonebill-auth-postgresql-prod DNS: {서버이름}.postgres.database.azure.com
지역 Korea Central 주 데이터센터
PostgreSQL 버전 15 최신 안정 버전
컴퓨팅 + 스토리지 GeneralPurpose 범용 워크로드

2.1.2 컴퓨팅 리소스

구성 항목 설정 값 설명
SKU Standard_D4s_v3 4 vCPU, 16GB RAM
스토리지 크기 256GB Premium SSD
스토리지 자동 증가 활성화 최대 2TB까지 자동 확장
IOPS 3000 Provisioned IOPS
처리량 125 MBps 스토리지 처리량

2.2 네트워크 구성

2.2.1 네트워크 설정

구성 항목 설정 값 설명
연결 방법 Private access (VNet Integration) VNet 통합
가상 네트워크 phonebill-vnet-prod 운영환경 VNet
서브넷 database-subnet (10.0.2.0/24) 데이터베이스 전용 서브넷
Private DNS Zone privatelink.postgres.database.azure.com 내부 DNS 해석

2.2.2 방화벽 및 보안

방화벽_규칙:
  - 규칙명: "AllowAKSSubnet"
    시작IP: "10.0.1.0"
    종료IP: "10.0.1.255"
    설명: "AKS Application Subnet 접근 허용"
    
  - 규칙명: "DenyAllOthers" 
    기본정책: "DENY"
    설명: "기본적으로 모든 외부 접근 차단"

Private_Endpoint:
  활성화: true
  서브넷: database-subnet
  보안: "VNet 내부 접근만 허용"

3. 고가용성 구성

3.1 Zone Redundant 고가용성

3.1.1 고가용성 설정

구성 항목 설정 값 설명
고가용성 모드 Zone Redundant 가용영역 간 중복화
Primary Zone Zone 1 기본 가용영역
Standby Zone Zone 2 대기 가용영역
자동 장애조치 활성화 60초 이내 자동 전환
Standby 서버 동일 사양 Primary와 동일한 리소스

3.1.2 고가용성 아키텍처

┌─────────────────────┐    ┌─────────────────────┐
│    Korea Central    │    │    Korea Central    │
│       Zone 1        │    │       Zone 2        │
├─────────────────────┤    ├─────────────────────┤
│  Primary Server     │◄──►│  Standby Server     │
│  - Active/Read      │    │  - Standby/Write    │
│  - Write Traffic    │    │  - Auto Failover    │
│  - Read Traffic     │    │  - Sync Replication │
└─────────────────────┘    └─────────────────────┘
           │                           │
           └─────────┬─────────────────┘
                     │
       ┌─────────────▼─────────────┐
       │    Application Layer     │
       │  - Automatic Failover    │
       │  - Connection Retry      │
       │  - Circuit Breaker       │
       └───────────────────────────┘

3.2 읽기 복제본

3.2.1 읽기 전용 복제본 구성

읽기_복제본_1:
  위치: "Korea South"  # 지역적 분산
  목적: "재해복구 + 읽기 부하 분산"
  사양: "Standard_D2s_v3"  # Primary보다 낮은 사양
  스토리지: "128GB"
  
읽기_복제본_2:
  위치: "Korea Central"  # 동일 리전
  목적: "읽기 부하 분산"
  사양: "Standard_D2s_v3"
  스토리지: "128GB"

복제_설정:
  복제_지연: "< 5초"
  복제_방식: "비동기 복제"
  사용_용도:
    - 조회_쿼리_부하_분산
    - 리포팅_및_분석
    - 백업_작업_오프로드

4. 보안 설계

4.1 인증 및 권한 관리

4.1.1 관리자 계정

계정 유형 계정명 권한 용도
서버 관리자 phonebill_admin SUPERUSER 서버 관리, 스키마 생성
애플리케이션 계정 phonebill_auth_user DB/TABLE 권한 Auth 서비스 연결
모니터링 계정 phonebill_monitor 읽기 전용 모니터링, 백업

4.1.2 보안 구성

보안_설정:
  암호_정책:
    최소_길이: 16자
    복잡성: "대소문자+숫자+특수문자"
    주기적_변경: "90일"
    
  연결_보안:
    SSL_필수: true
    TLS_버전: "1.2 이상"
    암호화_방식: "AES-256"
    
  접근_제어:
    Private_Endpoint: "필수"
    방화벽_규칙: "최소 권한 원칙"
    연결_제한: "최대 100개 동시 연결"

Azure_AD_통합:
  활성화: true
  관리자_계정: "phonebill-db-admins@company.com"
  MFA_필수: true
  조건부_접근: "회사 네트워크만"

4.2 데이터 보호

4.2.1 암호화

미사용_데이터_암호화:
  방식: "Microsoft 관리 키"
  알고리즘: "AES-256"
  범위: "전체 데이터베이스"
  
전송_중_암호화:
  SSL/TLS: "필수"
  인증서: "Azure 제공"
  프로토콜: "TLS 1.2+"
  
애플리케이션_레벨_암호화:
  비밀번호: "BCrypt + Salt"
  민감정보: "필요시 컬럼 레벨 암호화"
  토큰: "JWT with RSA-256"

5. 백업 및 복구

5.1 자동 백업 설정

5.1.1 백업 구성

구성 항목 설정 값 설명
백업 보존 기간 35일 법규 준수 + 운영 요구사항
백업 주기 매일 자동 시스템 자동 실행
백업 시간 02:00 KST 트래픽 최소 시간대
백업 압축 활성화 스토리지 비용 절약
지리적 중복 활성화 Korea South 지역 복제

5.1.2 Point-in-Time Recovery (PITR)

PITR_설정:
  활성화: true
  복구_범위: "35일 이내 5분 단위"
  로그_백업: "5분 간격"
  복구_시간: "일반적으로 15-30분"
  
백업_전략:
  전체_백업: "주간 (일요일)"
  차등_백업: "일간"
  로그_백업: "5분 간격"
  
복구_목표:
  RTO: "30분" # Recovery Time Objective
  RPO: "5분"  # Recovery Point Objective

5.2 재해복구 전략

5.2.1 재해복구 시나리오

장애_시나리오:
  Primary_Zone_장애:
    복구_방법: "자동 Standby Zone 전환"
    예상_시간: "60초 이내"
    데이터_손실: "없음 (동기 복제)"
    
  전체_리전_장애:
    복구_방법: "Korea South 읽기 복제본 승격"
    예상_시간: "15-30분"
    데이터_손실: "최대 5초 (비동기 복제)"
    
  데이터_손상:
    복구_방법: "PITR을 통한 특정 시점 복구"
    예상_시간: "15-60분"
    데이터_손실: "최대 5분"

복구_절차:
  1단계: "장애 감지 및 알림"
  2단계: "자동/수동 장애조치 실행"  
  3단계: "애플리케이션 연결 재설정"
  4단계: "서비스 정상화 확인"
  5단계: "사후 분석 및 개선"

6. 성능 최적화

6.1 Connection Pool 설정

6.1.1 연결 관리

연결_설정:
  최대_연결수: 100
  예약_연결수: 10  # 관리용
  애플리케이션_연결: 90
  
HikariCP_설정:
  maximum_pool_size: 20
  minimum_idle: 5
  connection_timeout: 30000  # 30초
  idle_timeout: 600000       # 10분
  max_lifetime: 1800000      # 30분
  validation_query: "SELECT 1"

6.2 성능 모니터링

6.2.1 주요 메트릭

모니터링_지표:
  성능_메트릭:
    - CPU_사용률: "< 80%"
    - 메모리_사용률: "< 85%"  
    - 디스크_IOPS: "< 2500"
    - 연결_수: "< 80개"
    
  쿼리_성능:
    - 평균_응답시간: "< 100ms"
    - 슬로우_쿼리: "< 5개/시간"
    - 데드락: "0건"
    - 대기_시간: "< 50ms"
    
  가용성_지표:
    - 서버_가동률: "> 99.9%"
    - 장애조치_시간: "< 60초"
    - 백업_성공률: "100%"

7. 데이터베이스 구성

7.1 데이터베이스 및 사용자 생성

7.1.1 데이터베이스 생성

-- 관리자 계정으로 실행
CREATE DATABASE phonebill_auth
    WITH ENCODING 'UTF8'
    LC_COLLATE = 'ko_KR.UTF-8'
    LC_CTYPE = 'ko_KR.UTF-8'
    TIMEZONE = 'Asia/Seoul';

7.1.2 애플리케이션 사용자 생성

-- 애플리케이션 전용 사용자 생성
CREATE USER phonebill_auth_user WITH 
    PASSWORD 'Auth$ervice2025!Prod'
    CONNECTION LIMIT 50;

-- 데이터베이스 접근 권한 부여
GRANT CONNECT ON DATABASE phonebill_auth TO phonebill_auth_user;
GRANT USAGE ON SCHEMA public TO phonebill_auth_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO phonebill_auth_user;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO phonebill_auth_user;

-- 향후 생성될 테이블에 대한 권한 자동 부여
ALTER DEFAULT PRIVILEGES IN SCHEMA public 
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO phonebill_auth_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public 
    GRANT USAGE, SELECT ON SEQUENCES TO phonebill_auth_user;

7.2 스키마 적용 계획

7.2.1 스키마 파일 실행 순서

# 1. 데이터베이스 연결 및 확장 설치
psql -h phonebill-auth-postgresql-prod.postgres.database.azure.com \
     -U phonebill_admin \
     -d phonebill_auth \
     -f design/backend/database/auth-schema.psql

# 2. 스키마 생성 확인
psql -h phonebill-auth-postgresql-prod.postgres.database.azure.com \
     -U phonebill_admin \
     -d phonebill_auth \
     -c "\dt"

# 3. 초기 데이터 확인
psql -h phonebill-auth-postgresql-prod.postgres.database.azure.com \
     -U phonebill_admin \
     -d phonebill_auth \
     -c "SELECT COUNT(*) as service_count FROM auth_services;"

8. 모니터링 및 알림

8.1 Azure Monitor 통합

8.1.1 메트릭 수집

Azure_Monitor_설정:
  메트릭_수집:
    - 서버_성능_메트릭
    - 데이터베이스_성능_메트릭  
    - 연결_메트릭
    - 스토리지_메트릭
    
  로그_수집:
    - PostgreSQL_로그
    - 슬로우_쿼리_로그
    - 감사_로그
    - 오류_로그

진단_설정:
  로그_분석_작업영역: "law-phonebill-prod"
  메트릭_보존기간: "90일"
  로그_보존기간: "30일"

8.2 알림 설정

8.2.2 Critical 알림

Critical_알림:
  서버_다운:
    메트릭: "서버 가용성"
    임계값: "< 100%"
    지속시간: "1분"
    알림채널: "Teams + Email + SMS"
    
  CPU_과부하:
    메트릭: "CPU 사용률"
    임계값: "> 90%"
    지속시간: "5분"
    알림채널: "Teams + Email"
    
  메모리_부족:
    메트릭: "메모리 사용률"
    임계값: "> 95%"
    지속시간: "3분"  
    알림채널: "Teams + Email"
    
  연결_한계:
    메트릭: "활성 연결 수"
    임계값: "> 85개"
    지속시간: "2분"
    알림채널: "Teams"

Warning_알림:
  성능_저하:
    메트릭: "평균 응답시간"
    임계값: "> 200ms"
    지속시간: "10분"
    알림채널: "Teams"
    
  스토리지_사용량:
    메트릭: "스토리지 사용률"
    임계값: "> 80%"
    지속시간: "30분"
    알림채널: "Teams"

9. 설치 작업 계획

9.1 설치 단계

9.1.1 사전 준비 작업

사전_준비:
  - [ ] Azure 구독 및 리소스 그룹 확인
  - [ ] VNet 및 서브넷 구성 확인
  - [ ] 네트워크 보안 그룹(NSG) 규칙 확인
  - [ ] Private DNS Zone 설정 확인
  - [ ] 관리자 계정 권한 확인

필요_권한:
  - Contributor (PostgreSQL 인스턴스 생성)
  - Network Contributor (VNet 통합)
  - DNS Zone Contributor (Private DNS 설정)

9.1.2 설치 작업 단계

1단계_인프라_구성:
  - [ ] Azure Database for PostgreSQL Flexible Server 생성
  - [ ] Zone Redundant 고가용성 설정
  - [ ] VNet 통합 및 Private Endpoint 구성
  - [ ] 방화벽 규칙 설정
  - [ ] 예상소요시간: 30분

2단계_보안_설정:
  - [ ] 관리자 및 애플리케이션 계정 생성
  - [ ] Azure AD 통합 설정
  - [ ] SSL/TLS 인증서 구성
  - [ ] 접근 권한 설정
  - [ ] 예상소요시간: 20분

3단계_고가용성_구성:
  - [ ] 읽기 전용 복제본 생성 (Korea South)
  - [ ] 읽기 전용 복제본 생성 (Korea Central)
  - [ ] 장애조치 테스트 실행
  - [ ] 예상소요시간: 45분

4단계_데이터베이스_설정:
  - [ ] phonebill_auth 데이터베이스 생성
  - [ ] 스키마 파일 (auth-schema.psql) 실행
  - [ ] 초기 데이터 생성 확인
  - [ ] 애플리케이션 계정 권한 테스트
  - [ ] 예상소요시간: 15분

5단계_모니터링_설정:
  - [ ] Azure Monitor 진단 설정
  - [ ] 메트릭 및 로그 수집 활성화
  - [ ] 알림 규칙 생성
  - [ ] 대시보드 구성
  - [ ] 예상소요시간: 30분

6단계_검증_및_테스트:
  - [ ] 애플리케이션 연결 테스트
  - [ ] 성능 벤치마크 실행
  - [ ] 장애조치 시나리오 테스트  
  - [ ] 백업/복구 테스트
  - [ ] 예상소요시간: 60분

총_예상소요시간: "3시간 20분"

9.2 롤백 계획

9.2.1 롤백 시나리오

롤백_트리거:
  - 인스턴스_생성_실패
  - 네트워크_연결_불가
  - 성능_기준_미달성
  - 보안_검증_실패

롤백_절차:
  1단계: "진행중인 작업 중단"
  2단계: "생성된 Azure 리소스 삭제"
  3단계: "VNet/DNS 설정 원복"
  4단계: "사용자/권한 정리"
  5단계: "문제점_분석_및_재설치_계획_수립"

데이터_보호:
  - 기존_데이터_백업_확인
  - 스키마_파일_보관
  - 설정_정보_문서화

10. 운영 이관

10.1 인수인계 체크리스트

10.1.1 기술 문서 이관

문서_이관:
  - [ ] 데이터베이스 접속 정보 (암호화하여 전달)
  - [ ] 스키마 구조 및 ERD 다이어그램
  - [ ] 백업/복구 절차서
  - [ ] 성능 튜닝 가이드
  - [ ] 장애 대응 매뉴얼
  - [ ] 모니터링 대시보드 접근 권한

운영_정보:
  - [ ] 정기 점검 일정
  - [ ] 패치 적용 정책
  - [ ] 용량 관리 계획
  - [ ] 비용 모니터링 정보

10.2 운영 관리 방안

10.2.1 일상 운영 작업

일일_점검:
  - 서버 상태 확인
  - 성능 메트릭 모니터링
  - 백업 상태 확인
  - 보안 알림 검토

주간_점검:
  - 성능 분석 리포트 검토
  - 용량 사용량 분석
  - 슬로우 쿼리 분석
  - 보안 패치 확인

월간_점검:
  - 용량 계획 검토
  - 비용 분석
  - 성능 최적화 검토
  - 재해복구 테스트

11. 비용 분석

11.1 운영 비용 추정

11.1.1 월간 비용 분석 (USD)

구성요소 사양 예상 비용 비고
Primary Server Standard_D4s_v3 $280 4 vCPU, 16GB RAM
Standby Server Standard_D4s_v3 $280 Zone Redundant
스토리지 256GB Premium SSD $40 IOPS 포함
읽기 복제본 (Korea South) Standard_D2s_v3 $140 2 vCPU, 8GB RAM
읽기 복제본 (Korea Central) Standard_D2s_v3 $140 2 vCPU, 8GB RAM
백업 스토리지 35일 보존 $20 압축 적용
네트워크 VNet 통합 $15 Private Link
모니터링 Azure Monitor $10 로그 및 메트릭
총합 $925

11.1.2 비용 최적화 방안

단기_최적화:
  - Reserved_Instance: "1년 약정시 30% 절약"
  - 읽기_복제본_스케일링: "사용량 기반 조정" 
  - 백업_정책_조정: "보존기간 최적화"

중장기_최적화:
  - 성능_기반_사이징: "실제 사용량 분석 후 조정"
  - 읽기_복제본_지역_최적화: "트래픽 패턴 분석"
  - 아카이빙_정책: "오래된 데이터 별도 보관"

12. 위험 관리

12.1 위험 요소 및 대응 방안

12.1.1 기술적 위험

위험 요소 발생 확률 영향도 대응 방안
네트워크 연결 실패 중간 높음 Private Link 다중화, 연결 재시도 로직
성능 저하 낮음 중간 읽기 복제본 활용, 쿼리 최적화
데이터 손실 낮음 매우 높음 Zone Redundant HA, PITR 백업
보안 침해 낮음 높음 Private Endpoint, Azure AD 통합

12.1.2 운영적 위험

운영_위험:
  설치_지연:
    원인: "네트워크 설정 복잡성"
    대응: "사전 테스트 환경에서 검증"
    
  비용_초과:
    원인: "리소스 오버 프로비저닝"
    대응: "단계적 확장, 비용 모니터링"
    
  성능_미달:
    원인: "부하 패턴 예측 오차"
    대응: "성능 테스트, 단계적 최적화"

13. 성공 기준

13.1 설치 완료 기준

13.1.1 기술적 기준

완료_기준:
  가용성:
    - [ ] Zone Redundant 고가용성 정상 작동
    - [ ] 자동 장애조치 60초 이내 완료
    - [ ] 읽기 복제본 정상 동기화
    
  성능:
    - [ ] 평균 응답시간 < 100ms
    - [ ] 동시 연결 수 100개 지원
    - [ ] TPS 500 이상 처리
    
  보안:
    - [ ] Private Endpoint 연결만 허용
    - [ ] SSL/TLS 암호화 적용
    - [ ] 애플리케이션 계정 최소 권한 적용
    
  백업:
    - [ ] 자동 백업 정상 실행
    - [ ] PITR 복구 테스트 성공
    - [ ] 지리적 복제 정상 작동

14. 설치 일정

14.1 작업 일정표

일정 작업 내용 담당자 소요 시간
D-Day 사전 준비 및 인프라 구성 데옵스 (최운영) 1시간
D-Day 보안 설정 및 고가용성 구성 백엔더 (이개발) 1시간
D-Day 데이터베이스 및 스키마 설정 백엔더 (이개발) 30분
D-Day 모니터링 및 알림 설정 데옵스 (최운영) 30분
D+1 애플리케이션 연결 테스트 백엔더 (이개발) 1시간
D+1 성능 및 장애조치 테스트 QA매니저 (정테스트) 2시간
D+2 최종 검증 및 운영 이관 전체 팀 1시간

계획서 작성일: 2025-01-08
작성자: 데옵스 (최운영)
검토자: 백엔더 (이개발), QA매니저 (정테스트)
승인자: 아키텍트 (김기획)


참고: 이 계획서는 설치 전 최종 검토가 필요하며, 실제 환경에 따라 일부 설정값이 조정될 수 있습니다.