본문 바로가기
※ IT관련

"NoSQL 성능 최적화 완벽 가이드: 인덱싱, 샤딩, 캐싱 전략"

by 홍길동젼 2025. 2. 5.
728x90
반응형

1. NoSQL 실무 활용 시나리오

(1) IoT 및 로그 데이터 저장 (Cassandra 활용)

>> 시나리오

  • 수백만 개의 IoT 장치에서 실시간 센서 데이터를 수집
  • 고속 데이터 삽입이 필요하며, 데이터의 유실을 최소화해야 함
  • 과거 데이터를 분석하는 쿼리 성능을 최적화

>> 설계 전략

  • 테이블 모델링
    • CREATE TABLE sensor_data (
          device_id UUID,
          timestamp TIMESTAMP,
          temperature FLOAT,
          humidity FLOAT,
          PRIMARY KEY ((device_id), timestamp)
      ) WITH CLUSTERING ORDER BY (timestamp DESC);
    • Partition Key: device_id (하나의 장치별로 데이터를 샤딩)
    • Clustering Key: timestamp (최신 데이터를 빠르게 조회)
  • 최적화 전략
    • TTL(Time-to-Live) 설정하여 오래된 데이터 자동 삭제
    • Compaction Strategy: TimeWindowCompactionStrategy(TWCS) 활용
    • Writes 최적화: Batch Insert 활용하여 여러 개의 레코드 한 번에 저장

(2) 전자상거래 주문 처리 시스템 (MongoDB 활용)

>> 시나리오

  • 사용자가 주문한 상품 정보를 빠르게 저장 및 조회
  • 한 주문에 여러 개의 상품이 포함될 수 있음
  • 주문 내역을 JSON 형식으로 관리해야 하며, 관계형 DB보다 유연한 구조가 필요

>> 설계 전략

  • 문서(Document) 모델링
    • {
          "order_id": "12345",
          "user_id": "user_6789",
          "items": [
              { "product_id": "A001", "name": "Laptop", "price": 1200, "quantity": 1 },
              { "product_id": "B002", "name": "Mouse", "price": 25, "quantity": 2 }
          ],
          "order_date": "2024-02-03T10:15:00Z",
          "status": "shipped"
      }
    • 한 주문(order_id)에 대한 연관 데이터를 한 문서로 저장
    • items 배열을 이용해 주문 내 상품 리스트 포함
  • 최적화 전략
    • Indexing: order_id, user_id, order_date에 인덱스 적용
      db.orders.createIndex({ "user_id": 1, "order_date": -1 });
      
    • Sharding 활용: order_id 기준으로 샤딩하여 트래픽 분산
    • Aggregation Framework 활용: 주문 내역 요약 및 분석
      db.orders.aggregate([
          { $match: { "user_id": "user_6789" } },
          { $group: { _id: "$status", totalOrders: { $sum: 1 } } }
      ]);
      

(3) 서버리스 애플리케이션 세션 저장소 (DynamoDB 활용)

>> 시나리오

  • 웹 애플리케이션에서 로그인 세션을 관리해야 함
  • 세션 데이터는 만료 기간이 있으며, 빠른 조회가 필요
  • AWS Lambda + API Gateway와 함께 사용

>> 설계 전략

  • DynamoDB 테이블 모델링
    • Table: UserSessions
      ┌──────────────┬───────────┬──────────────┐
      │ SessionID                   │ UserID               │ Expiry                         │
      ├──────────────┼───────────┼──────────────┤
      │ ABC123                      │ user_1                │ 2025-02-03                 │
      │ XYZ789                      │ user_2                │ 2025-02-04                 │
      └──────────────┴───────────┴──────────────┘
    • SessionID를 Partition Key로 설정하여 빠른 조회
    • TTL 설정을 통해 자동 만료 (Expiry 컬럼 사용)
  • 최적화 전략
    • 온디맨드 프로비저닝 모드: 트래픽 변화에 자동 대응
    • 캐싱 적용: DynamoDB Accelerator (DAX) 활용
    • Access Pattern 최적화: UserID 기준으로 조회 시 GSI (Global Secondary Index) 사용
      {
          "IndexName": "UserIDIndex",
          "KeySchema": [{ "AttributeName": "UserID", "KeyType": "HASH" }]
      }
      

 

2. NoSQL 성능 최적화 Best Practices

전략 MongoDB  Cassandra  DynamoDB
인덱싱 최적화 복합 인덱스 활용 파티셔닝 키/클러스터링 키 설계 GSI & LSI 활용
쓰기 최적화 Bulk Insert, TTL Batch Write, TWCS 사용 온디맨드 모드, DAX 적용
읽기 최적화 Projection, Aggregation Read Repair & Bloom Filter Query Filtering & Caching
확장성 고려 샤딩(Sharding) 분산 클러스터 운영 DynamoDB Streams 활용
데이터 수명 관리 TTL 설정 TTL 기반 데이터 정리 TTL 기반 자동 삭제

3. NoSQL을 선택하는 기준

요구사항  추천 NoSQL DB 이유
고속 읽기/쓰기 Cassandra 분산 아키텍처, 쓰기 성능 최적화
유연한 JSON 데이터 저장 MongoDB 문서 기반, 동적 스키마 지원
AWS 네이티브 서버리스 지원 DynamoDB AWS 통합, 자동 스케일링
고객 트랜잭션 및 ACID 필요 MongoDB (4.0 이상) 멀티 문서 트랜잭션 지원
대용량 시계열 데이터 Cassandra 시간 기반 데이터 최적화

 

4. 결론

  • MongoDB → JSON 기반 문서 저장, 웹/전자상거래에 적합
  • Cassandra → 분산 환경에서 고속 읽기/쓰기, IoT 및 로그 분석 최적
  • DynamoDB → AWS 서버리스 환경에 최적화, 세션 관리 및 실시간 데이터 처리



728x90
반응형