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

19 KiB
Raw Blame History

Redis 캐시 설치 계획서 - 운영환경

1. 개요

1.1 설치 목적

  • 통신요금 관리 서비스의 운영환경용 Redis 캐시 구축
  • Azure Cache for Redis Premium을 활용한 고가용성 캐시 서비스 제공
  • 모든 마이크로서비스 간 공유 구성으로 데이터 일관성 및 성능 최적화
  • 99.9% 가용성과 엔터프라이즈급 보안 수준 달성

1.2 설계 원칙

  • 고가용성: Zone Redundancy를 통한 Multi-Zone 배포
  • 보안 우선: Private Endpoint와 VNet 통합을 통한 격리된 네트워크
  • 성능 최적화: Premium 계층으로 고성능 및 데이터 지속성 보장
  • 확장성: 클러스터링을 통한 수평 확장 지원
  • 모니터링: 포괄적인 메트릭 수집 및 알림 체계

1.3 참조 문서

  • 운영환경 물리아키텍처: design/backend/physical/physical-architecture-prod.md
  • 데이터 설계 종합: design/backend/database/data-design-summary.md
  • 백킹서비스설치방법: claude/backing-service-method.md

2. 시스템 환경

2.1 운영환경 사양

  • 환경: Microsoft Azure (운영환경)
  • 위치: Korea Central (주 리전), Korea South (재해복구 리전)
  • 네트워크: Azure Virtual Network (VNet) 통합
  • 서비스 계층: Azure Cache for Redis Premium
  • 가용성: 99.99% (Zone Redundancy 적용)
  • 동시 사용자: Peak 1,000명 지원

2.2 네트워크 구성

  • VNet: phonebill-prod-vnet (10.0.0.0/16)
  • Cache Subnet: 10.0.3.0/24 (Redis 전용)
  • Private Endpoint: VNet 내부 접근만 허용
  • DNS Zone: privatelink.redis.cache.windows.net

3. Azure Cache for Redis Premium 구성

3.1 기본 설정

구성 항목 설정 값 설명
서비스 명 phonebill-cache-prod 운영환경 Redis 인스턴스
계층 Premium P2 6GB 메모리, 고성능
위치 Korea Central 주 리전
클러스터링 활성화 확장성 및 가용성
복제 활성화 데이터 안전성

3.2 고가용성 구성

3.2.1 Zone Redundancy 설정

zone_redundancy_config:
  enabled: true
  primary_zone: Korea Central Zone 1
  secondary_zone: Korea Central Zone 2
  tertiary_zone: Korea Central Zone 3
  automatic_failover: true
  failover_time: "<30초"

3.2.2 클러스터 구성

cluster_configuration:
  shard_count: 3  # 데이터 분산
  replicas_per_shard: 1  # 샤드별 복제본
  total_nodes: 6  # 3개 샤드 × 2개 노드(마스터+복제본)
  
  shard_distribution:
    shard_0: 
      master: "phonebill-cache-prod-000001.cache.windows.net:6380"
      replica: "phonebill-cache-prod-000002.cache.windows.net:6380"
    shard_1:
      master: "phonebill-cache-prod-000003.cache.windows.net:6380"
      replica: "phonebill-cache-prod-000004.cache.windows.net:6380"
    shard_2:
      master: "phonebill-cache-prod-000005.cache.windows.net:6380"
      replica: "phonebill-cache-prod-000006.cache.windows.net:6380"

4. 네트워크 보안 설정

4.1 Virtual Network 통합

vnet_integration:
  resource_group: "phonebill-prod-rg"
  vnet_name: "phonebill-prod-vnet"
  subnet_name: "cache-subnet"
  subnet_address_prefix: "10.0.3.0/24"
  
  private_endpoint:
    name: "phonebill-cache-pe"
    subnet_id: "/subscriptions/{subscription}/resourceGroups/phonebill-prod-rg/providers/Microsoft.Network/virtualNetworks/phonebill-prod-vnet/subnets/cache-subnet"
    connection_name: "phonebill-cache-connection"

4.2 방화벽 규칙

firewall_rules:
  # AKS 노드에서만 접근 허용
  - name: "Allow-AKS-Nodes"
    start_ip: "10.0.1.0"
    end_ip: "10.0.1.255"
    description: "AKS Application Subnet 접근 허용"
    
  # 관리용 Bastion 호스트 접근
  - name: "Allow-Bastion"
    start_ip: "10.0.4.100"
    end_ip: "10.0.4.110"
    description: "운영 관리용 Bastion 호스트"
    
  # 외부 접근 차단 (기본값)
  public_network_access: "Disabled"

4.3 보안 인증 설정

security_configuration:
  # Redis AUTH 활성화
  auth_enabled: true
  require_ssl: true
  minimum_tls_version: "1.2"
  
  # 액세스 키 관리
  access_keys:
    primary_key_regeneration: "매월 1일"
    secondary_key_regeneration: "매월 15일"
    key_vault_integration: true
    
  # Azure AD 통합 (Preview 기능)
  azure_ad_authentication:
    enabled: false  # 운영 안정성을 위해 비활성화
    fallback_to_access_key: true

5. 캐시 전략 및 키 관리

5.1 캐시 키 전략

5.1.1 네이밍 규칙

cache_key_patterns:
  # 서비스별 네임스페이스 분리
  auth_service:
    user_session: "auth:session:{userId}:{sessionId}"
    user_permissions: "auth:permissions:{userId}"
    login_attempts: "auth:attempts:{userId}"
    
  bill_inquiry_service:
    customer_info: "bill:customer:{lineNumber}"
    bill_cache: "bill:inquiry:{customerId}:{month}"
    kos_response: "bill:kos:{requestId}"
    
  product_change_service:
    product_info: "product:info:{productCode}"
    available_products: "product:available:{customerId}"
    change_history: "product:history:{customerId}:{requestId}"
    
  common:
    system_config: "system:config:{configKey}"
    circuit_breaker: "system:cb:{serviceName}"

5.2 TTL 정책

5.2.1 서비스별 TTL 설정

ttl_policies:
  # 고객정보 - 4시간 (자주 조회되지만 변경 가능성 있음)
  customer_info: 14400  # 4시간
  
  # 상품정보 - 2시간 (정기적 업데이트)
  product_info: 7200    # 2시간
  
  # 세션정보 - 24시간 (로그인 유지)
  session_info: 86400   # 24시간
  
  # 권한정보 - 8시간 (보안 중요도 높음)
  permissions: 28800    # 8시간
  
  # 가용 상품 목록 - 24시간 (일반적으로 일정)
  available_products: 86400  # 24시간
  
  # 회선 상태 - 30분 (실시간성 중요)
  line_status: 1800     # 30분
  
  # KOS 응답 캐시 - 1시간 (외부 API 부하 감소)
  kos_response: 3600    # 1시간
  
  # 시스템 설정 - 1일 (거의 변경되지 않음)
  system_config: 86400  # 24시간
  
  # Circuit Breaker 상태 - 5분 (빠른 복구 필요)
  circuit_breaker: 300  # 5분

5.3 메모리 관리 정책

memory_management:
  # 메모리 정책 설정
  maxmemory_policy: "allkeys-lru"
  
  # 메모리 사용량 임계값
  memory_thresholds:
    warning: "80%"  # 경고 알림
    critical: "90%" # 긴급 알림
    
  # 메모리 샘플링 설정
  maxmemory_samples: 5
  
  # 키 만료 정책
  expire_policy:
    active_expire_frequency: 10  # 초당 10회 만료 키 검사
    lazy_expire_on_access: true  # 접근 시 만료 검사

6. 데이터 지속성 설정

6.1 RDB 백업 구성

rdb_backup_configuration:
  # 스냅샷 백업 설정
  save_policy:
    - "900 1"    # 15분 이내 1개 이상 키 변경 시 저장
    - "300 10"   # 5분 이내 10개 이상 키 변경 시 저장
    - "60 10000" # 1분 이내 10000개 이상 키 변경 시 저장
    
  # 백업 파일 관리
  backup_retention:
    daily_backups: 7   # 7일간 보관
    weekly_backups: 4  # 4주간 보관
    monthly_backups: 12 # 12개월간 보관
    
  # 백업 스토리지
  backup_storage:
    account: "phonebillprodbackup"
    container: "redis-backups"
    encryption: true

6.2 AOF (Append Only File) 설정

aof_configuration:
  # AOF 활성화
  appendonly: true
  
  # 동기화 정책
  appendfsync: "everysec"  # 매초마다 디스크에 동기화
  
  # AOF 리라이트 설정
  auto_aof_rewrite_percentage: 100
  auto_aof_rewrite_min_size: "64mb"
  
  # AOF 로딩 설정
  aof_load_truncated: true

7. 모니터링 및 알림 설정

7.1 Azure Monitor 통합

monitoring_configuration:
  # Azure Monitor 연동
  diagnostic_settings:
    log_analytics_workspace: "law-phonebill-prod"
    metrics_retention_days: 90
    logs_retention_days: 30
    
  # 수집할 메트릭
  metrics:
    - "CacheMisses"
    - "CacheHits"
    - "GetCommands"
    - "SetCommands"
    - "ConnectedClients"
    - "UsedMemory"
    - "UsedMemoryPercentage"
    - "TotalCommandsProcessed"
    - "CacheLatency"
    - "Errors"

7.2 알림 규칙

alert_rules:
  # 성능 관련 알림
  performance_alerts:
    - name: "High Cache Miss Rate"
      metric: "CacheMissPercentage"
      threshold: 30  # 30% 이상
      window: "5분"
      severity: "Warning"
      action: "Teams 알림"
      
    - name: "High Memory Usage"
      metric: "UsedMemoryPercentage"
      threshold: 85  # 85% 이상
      window: "5분"
      severity: "Critical"
      action: "Teams + SMS 알림"
      
    - name: "High Response Time"
      metric: "CacheLatency"
      threshold: 10  # 10ms 이상
      window: "5분"
      severity: "Warning"
      action: "Teams 알림"
      
  # 가용성 관련 알림
  availability_alerts:
    - name: "Cache Connection Failed"
      metric: "Errors"
      threshold: 5   # 5개 이상 에러
      window: "1분"
      severity: "Critical"
      action: "즉시 전화 + Teams 알림"
      
    - name: "Too Many Connected Clients"
      metric: "ConnectedClients"
      threshold: 500  # 500개 이상 연결
      window: "5분"
      severity: "Warning"
      action: "Teams 알림"

7.3 대시보드 구성

dashboard_configuration:
  # Azure Portal 대시보드
  azure_dashboard:
    - "Cache Hit/Miss 비율 차트"
    - "메모리 사용량 추이"
    - "연결된 클라이언트 수"
    - "응답 시간 분포"
    - "에러 발생률"
    
  # Grafana 대시보드 (옵션)
  grafana_dashboard:
    datasource: "Azure Monitor"
    panels:
      - "실시간 메트릭 패널"
      - "성능 추이 그래프"
      - "알림 상태 표시"

8. 연결 설정 및 클라이언트 구성

8.1 연결 문자열

connection_configuration:
  # 클러스터 연결 (운영환경)
  cluster_connection_string: |
    phonebill-cache-prod.redis.cache.windows.net:6380,
    password={access_key},ssl=True,abortConnect=False,
    connectTimeout=5000,syncTimeout=5000
    
  # 클라이언트 라이브러리별 설정
  client_configurations:
    spring_boot:
      redis_host: "phonebill-cache-prod.redis.cache.windows.net"
      redis_port: 6380
      redis_ssl: true
      redis_timeout: 5000
      redis_pool_size: 20
      redis_cluster_enabled: true
      
    connection_pool:
      max_total: 20
      max_idle: 10
      min_idle: 5
      test_on_borrow: true
      test_while_idle: true

8.2 Spring Boot 연동 설정

spring_redis_configuration:
  # application-prod.yml 설정
  spring:
    redis:
      cluster:
        nodes:
          - "phonebill-cache-prod.redis.cache.windows.net:6380"
      ssl: true
      password: "${REDIS_PASSWORD}"
      timeout: 5000ms
      lettuce:
        pool:
          max-active: 20
          max-idle: 10
          min-idle: 5
          max-wait: 5000ms
        cluster:
          refresh:
            adaptive: true
            period: 30s

9. 재해복구 및 백업 전략

9.1 지역 간 복제 설정

geo_replication:
  # 주 리전 (Korea Central)
  primary_region:
    cache_name: "phonebill-cache-prod"
    resource_group: "phonebill-prod-rg"
    
  # 재해복구 리전 (Korea South)
  secondary_region:
    cache_name: "phonebill-cache-prod-dr"
    resource_group: "phonebill-prod-dr-rg"
    
  # 복제 설정
  replication_configuration:
    link_name: "phonebill-cache-geo-link"
    replication_role: "Primary"
    linked_cache_name: "phonebill-cache-prod-dr"

9.2 백업 및 복구 절차

backup_recovery:
  # 백업 전략
  backup_strategy:
    automated_backup: true
    backup_frequency: "매시간"
    backup_retention: "7일"
    
    manual_backup:
      before_maintenance: true
      before_major_release: true
      
  # 복구 목표
  recovery_objectives:
    rto: "15분"  # Recovery Time Objective
    rpo: "5분"   # Recovery Point Objective
    
  # 복구 절차
  recovery_procedures:
    automated_failover: true
    manual_failover_approval: false  # 운영환경에서는 자동 처리
    health_check_interval: "30초"

10. 보안 강화 설정

10.1 Azure Key Vault 통합

key_vault_integration:
  vault_name: "phonebill-prod-kv"
  
  # 저장할 시크릿
  secrets:
    - name: "redis-primary-key"
      description: "Redis 기본 액세스 키"
      rotation_period: "30일"
      
    - name: "redis-secondary-key"
      description: "Redis 보조 액세스 키"
      rotation_period: "30일"
      
    - name: "redis-connection-string"
      description: "Redis 연결 문자열"
      auto_update: true

10.2 네트워크 보안 정책

network_security:
  # Private Endpoint 보안
  private_endpoint_security:
    network_access_policy: "Private endpoints only"
    public_network_access: "Disabled"
    
  # Network Security Group 규칙
  nsg_rules:
    - name: "Allow-Redis-From-AKS"
      priority: 100
      direction: "Inbound"
      access: "Allow"
      protocol: "TCP"
      source_port_ranges: "*"
      destination_port_ranges: "6379-6380"
      source_address_prefix: "10.0.1.0/24"
      
    - name: "Deny-All-Other"
      priority: 1000
      direction: "Inbound"
      access: "Deny"
      protocol: "*"
      source_port_ranges: "*"
      destination_port_ranges: "*"
      source_address_prefix: "*"

11. 성능 최적화 설정

11.1 클러스터 최적화

cluster_optimization:
  # 클러스터 설정 최적화
  cluster_configuration:
    cluster_enabled: true
    cluster_config_file: "nodes.conf"
    cluster_node_timeout: 15000
    cluster_slave_validity_factor: 10
    
  # 메모리 최적화
  memory_optimization:
    maxmemory: "5gb"  # P2 계층 6GB 중 5GB 사용
    maxmemory_policy: "allkeys-lru"
    maxmemory_samples: 5
    
  # 네트워크 최적화
  network_optimization:
    tcp_keepalive: 300
    timeout: 0
    tcp_backlog: 511

11.2 클라이언트 최적화

client_optimization:
  # 연결 풀 최적화
  connection_pool:
    max_total: 20
    max_idle: 10
    min_idle: 5
    max_wait_millis: 5000
    test_on_borrow: true
    test_on_return: false
    test_while_idle: true
    
  # 파이프라이닝 설정
  pipelining:
    enabled: true
    batch_size: 100
    timeout: 1000

12. 설치 실행 계획

12.1 설치 단계

installation_phases:
  phase_1_preparation:
    duration: "1일"
    tasks:
      - "Azure 리소스 그룹 준비"
      - "Virtual Network 구성 확인"
      - "서브넷 및 NSG 설정"
      - "Key Vault 시크릿 준비"
      
  phase_2_deployment:
    duration: "2일"
    tasks:
      - "Azure Cache for Redis 생성"
      - "클러스터링 구성"
      - "Private Endpoint 설정"
      - "방화벽 규칙 적용"
      
  phase_3_configuration:
    duration: "1일"
    tasks:
      - "백업 설정 구성"
      - "모니터링 설정"
      - "알림 규칙 생성"
      - "대시보드 구성"
      
  phase_4_testing:
    duration: "2일"
    tasks:
      - "연결 테스트"
      - "성능 테스트"
      - "장애조치 테스트"
      - "보안 검증"

12.2 사전 준비사항

prerequisites:
  azure_resources:
    - "Azure 구독 및 권한 확인"
    - "Resource Group 생성: phonebill-prod-rg"
    - "Virtual Network: phonebill-prod-vnet"
    - "Key Vault: phonebill-prod-kv"
    
  network_configuration:
    - "Cache Subnet (10.0.3.0/24) 생성"
    - "Network Security Group 규칙 준비"
    - "Private DNS Zone 설정"
    
  security_preparation:
    - "Service Principal 생성 및 권한 부여"
    - "SSL 인증서 준비"
    - "액세스 키 생성 정책 수립"

12.3 검증 체크리스트

validation_checklist:
  connectivity_tests:
    - [ ] "AKS 클러스터에서 Redis 연결 테스트"
    - [ ] "각 서비스에서 캐시 읽기/쓰기 테스트"
    - [ ] "클러스터 모드 연결 확인"
    - [ ] "SSL/TLS 암호화 통신 확인"
    
  performance_tests:
    - [ ] "응답 시간 < 5ms 확인"
    - [ ] "초당 10,000 요청 처리 확인"
    - [ ] "메모리 사용량 최적화 확인"
    - [ ] "캐시 히트율 > 90% 달성"
    
  security_tests:
    - [ ] "외부 접근 차단 확인"
    - [ ] "인증 및 권한 확인"
    - [ ] "데이터 암호화 확인"
    - [ ] "감사 로그 기록 확인"
    
  availability_tests:
    - [ ] "Zone 장애 시뮬레이션"
    - [ ] "노드 장애 복구 테스트"
    - [ ] "자동 장애조치 확인"
    - [ ] "백업 및 복원 테스트"

13. 운영 및 유지보수

13.1 일상 운영 절차

daily_operations:
  monitoring_checks:
    - [ ] "Redis 클러스터 상태 확인"
    - [ ] "메모리 사용률 점검"
    - [ ] "캐시 히트율 확인"
    - [ ] "에러 로그 검토"
    
  weekly_operations:
    - [ ] "성능 메트릭 리포트 생성"
    - [ ] "백업 상태 확인"
    - [ ] "보안 패치 적용 검토"
    - [ ] "용량 계획 검토"

13.2 성능 튜닝 가이드

performance_tuning:
  memory_optimization:
    - "키 만료 정책 최적화"
    - "메모리 사용 패턴 분석"
    - "불필요한 키 정리"
    
  network_optimization:
    - "연결 풀 크기 조정"
    - "타임아웃 값 튜닝"
    - "파이프라이닝 활용"
    
  application_optimization:
    - "캐시 키 설계 개선"
    - "TTL 값 최적화"
    - "배치 처리 활용"

14. 비용 최적화

14.1 예상 비용 (월간, USD)

monthly_cost_estimation:
  azure_cache_redis:
    tier: "Premium P2"
    capacity: "6GB"
    estimated_cost: "$350"
    
  network_costs:
    private_endpoint: "$15"
    data_transfer: "$20"
    
  backup_storage:
    storage_account: "$10"
    
  total_monthly_cost: "$395"

14.2 비용 최적화 전략

cost_optimization:
  rightsizing:
    - "실제 메모리 사용량 기반 계층 조정"
    - "사용량 패턴 분석 후 스케일링"
    
  efficiency_improvements:
    - "TTL 최적화로 불필요한 데이터 정리"
    - "압축 알고리즘 활용"
    - "캐시 히트율 향상"
    
  reserved_capacity:
    - "1년 예약 인스턴스 (20% 할인)"
    - "3년 예약 인스턴스 (40% 할인)"

15. 설치 완료 확인

15.1 설치 성공 기준

  • Azure Cache for Redis Premium 정상 생성
  • Zone Redundancy 및 클러스터링 활성화
  • Private Endpoint를 통한 VNet 통합 완료
  • 모든 서비스에서 캐시 연결 성공
  • 모니터링 및 알림 체계 구축
  • 백업 및 재해복구 설정 완료

15.2 성과 목표 달성 확인

  • 🎯 가용성: 99.99% 이상 (Zone Redundancy)
  • 🎯 성능: 응답시간 < 5ms, 초당 10,000+ 요청 처리
  • 🎯 보안: Private Endpoint, 암호화 통신 적용
  • 🎯 확장성: 클러스터링을 통한 수평 확장 준비
  • 🎯 모니터링: 실시간 메트릭 수집 및 알림 체계

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

이 Redis 캐시 설치 계획서는 통신요금 관리 서비스의 운영환경에 최적화되어 있으며, Azure Cache for Redis Premium을 활용한 고가용성 및 고성능 캐시 서비스를 제공합니다.