Post

데이터베이스 설계 - Non Relational DB 편


2024/07/07: 초안 작성
2024/07/24: NoSQL DB 설계 절차, 설계 시 고려 요소, 주의 사항 추가
2024/07/27: NoSQL DB 유형, 아키텍처 보완
2024/08/04: RDB, NoSQL 통합 보완
2024/08/11: Polyglot 부분 보완

※ 내용에 오류가 있을 수 있습니다.
※ 내용을 계속 추가, 수정, 보완하고 있습니다.


목차


머리말


  • ‘데이터베이스 설계 - RDB 편’에서 관계형 Relational DB 설계의 주요 고려 요소와 주의할 점, 상향식, 하향식 설계, 각 설계 방식의 절차, 예시들에 대해서 살펴봄.

  • 여기선 정형, 반정형, 비정형 데이터 유형과 상황에 따른 비관계형 DB Non-Relational DB 특징, 설계 절차, 설계 시 고려 요소, 주의할 점, 설계 예시 등을 살펴보고자 함.


비관계형 Non-Relational DB


  • 비관계형 데이터베이스(NoSQL DB)는 관계형 데이터베이스에서 사용되는 기존 표 형식의 관계에 기반하지 않는 다양한 데이터 모델을 처리하도록 설계되었음.

  • 특히 대량의 비정형, 반정형 또는 정형 데이터를 관리하는 데 적합.

  • 비관계형 데이터베이스는 특히 확장성, 유연성, 비정형 데이터 처리 기능이 필요한 애플리케이션에 있어 기존 RDBMS에 대한 대안을 제공

  • 분산 아키텍처와 다양한 데이터 모델은 웹 애플리케이션부터 빅 데이터 분석에 이르기까지 광범위한 사용 사례에 적합

  • 데이터의 특성, 확장성 요구 사항, 기대 성능 등 애플리케이션의 특정 요구 사항에 따라 적합한 NoSQL 데이터베이스 유형을 선택해야 함.


NoSQL 데이터베이스의 유형과 차이점


문서 스토어 Document Stores (예: MongoDB, CouchDB)

  • 데이터 모델: 중첩된 구조를 가진 JSON과 유사한 문서(MongoDB의 경우 BSON)
  • 사용 사례: 콘텐츠 관리, 전자상거래, 실시간 분석
  • 장점: 스키마 유연성, 계층적 데이터 저장 및 쿼리가 용이
  • 차이점: MongoDB는 복제 및 동기화에 중점을 둔 CouchDB에 비해 더 풍부한 쿼리 및 인덱싱을 지원

키-값 스토어 Key-Value Stores (예: Redis, DynamoDB)

  • 데이터 모델: 각 키가 고유한 키-값 쌍
  • 사용 사례: 캐싱, 세션 관리, 실시간 데이터 처리
  • 장점: 단순성, 고성능, 짧은 지연 시간
  • 차이점: Redis는 인메모리로 더 복잡한 데이터 유형을 지원. AWS DynamoDB는 확장성 제공, AWS에서 관리

컬럼 패밀리 스토어 Column-Family Stores (예: Cassandra, HBase)

  • 데이터 모델: 컬럼 패밀리로 그룹화된 동적 컬럼
  • 사용 사례: 시계열 데이터, IoT, 빅 데이터 애플리케이션
  • 장점: 높은 쓰기 처리량, 상용 하드웨어 전반에 걸친 확장성
  • 차이점: Cassandra는 Peer to Peer 복제 기능을 갖춘 분산형 아키텍처를 제공. HBase는 Hadoop 생태계

그래프 데이터베이스 Graph Databases (예: Neo4j, ArangoDB)

  • 데이터 모델: 엔티티와 그 관계를 나타내는 노드와 엣지
  • 사용 사례: 소셜 네트워크, 추천 엔진, 사기 탐지
  • 장점: 복잡한 관계를 효율적으로 관리, 쿼리 가능
  • 차별점: Neo4j는 그래프 쿼리 언어(Cypher)와 ACID 규정 준수. ArangoDB는 그래프, 문서, 키-값 스토어를 결합한 다중 모델 기능을 제공


왜 비관계형 데이터베이스를 사용하나?


  • 보통 기본적으로 RDB를 사용하고, RDB의 한계를 넘어선 데이터 유형, 데이터 양 등 대량의 정형, 반정형, 비정형 데이터 특성과 환경에 따라 Non-relational DB를 선택

  • 유연성 Flexibility: NoSQL 데이터베이스는 스키마가 없는 데이터 모델을 제공하므로 보다 유연하고 동적인 데이터 구조가 가능

  • 확장성 Scalability: 수평적으로 확장할 수 있도록 설계되어 분산된 시스템에서 대규모 데이터를 보다 쉽게 처리할 수 있음.

  • 성능 Performance: 높은 읽기/쓰기 처리량에 최적화된 NoSQL 데이터베이스는 특정 워크로드에 더 빠른 성능을 제공할 수 있음.

  • 복잡한 데이터 Complex Data: 중첩된 문서나 그래프 데이터와 같은 복잡한 데이터 구조를 광범위한 조인 없이 처리하는 데 적합


비관계형 DB 동작 원칙과 아키텍처, Non-RDB 간 차이


  • 대량의 비정형, 반정형 또는 정형 데이터를 처리하도록 설계되었으며 스키마 설계, 확장성 및 성능 측면에서 유연성을 제공


원칙의 차이


스키마 유연성 Schema Flexibility

  • 고정된 스키마가 필요하지 않으므로 보다 동적인 데이터 모델을 사용할 수 있음. 시간이 지남에 따라 데이터 구조가 변할 수 있는 애플리케이션에 유용

수평적 확장성 Horizontal Scalability

  • 여러 서버에 샤딩을 통해 데이터를 분산하여 확장할 수 있도록 설계함. 샤딩은 데이터를 더 작은 청크로 분할하여 여러 머신 클러스터에 저장할 수 있음.

분산 아키텍처 Distributed Architecture

  • 분산 아키텍처에서 사용하여 데이터가 여러 노드에 복제되고 분할되도록 함. 이는 가용성, 내결함성, 확장성이 좋아짐.

CAP 정리 CAP Theorem

  • 분산 시스템에서는 세 가지 중 두 가지만 달성할 수 있음. 1. 일관성, 가용성, 파티션 허용 오차. 2. 가용성과 파티션 허용, 이벤트성 일관성을 우선시함.

이벤트성 일관성이란 Eventual consistency란 분산 NoSQL 데이터베이스에서 업데이트가 모든 노드에 반영되도록 보장하는 데이터 모델링 개념

고성능 High Performance

  • 읽기/쓰기 성능에 최적화. 인메모리 스토리지와 데이터 검색 메커니즘 활용


NoSQL DB 아키텍처


  • NoSQL 데이터베이스는 일반적으로 확장성을 위해 분산 아키텍처를 사용

데이터 노드 Data Nodes

  • 데이터 노드는 데이터가 저장되고 관리되는 서버. 데이터 노드는 읽기/쓰기 작업을 처리하고 데이터 복제 및 파티셔닝을 보장합니다.

쿼리 프로세서 Query Processors

  • 이러한 구성 요소는 데이터베이스에 대한 쿼리를 해석하고 실행합니다. 기본 데이터 모델을 기반으로 쿼리 성능을 최적화합니다.

클러스터 관리 Cluster Management

  • 여기에는 클러스터 내의 노드 관리, 데이터 일관성 보장, 로드 밸런싱, 장애 조치 메커니즘, 시스템 상태 모니터링이 포함됩니다.

복제 및 샤딩 Replication and Sharding

  • 복제는 내결함성을 위해 여러 노드에 걸쳐 데이터를 복사합니다. 샤딩은 데이터를 더 작고 관리하기 쉬운 조각으로 나누어 클러스터 전체에 분산시킵니다.

  • 샤딩: 샤드 키를 기반으로 여러 서버에 데이터를 분산하는 것입니다. 이를 통해 수평적 확장 및 로드 밸런싱이 가능

  • 복제: 여러 서버에 데이터 사본을 생성하여 데이터 가용성과 내결함성을 보장

  • 파티셔닝: 데이터를 더 작고 관리하기 쉬운 부분으로 분할하여 쿼리 성능을 최적화하고 경합을 줄임.


NoSQL DB들 간의 차이점


  • 비관계형 데이터베이스 간 주요 차이점은 데이터 모델, 확장성 접근 방식, 일관성, 트랜잭션, 쿼리 언어 및 사용 사례에 있음.

  • 데이터 모델: 문서 데이터베이스는 문서 중심의 스토어, 키-값 스토어는 키-값 쌍, 와이드 컬럼 스토어는 컬럼형 스토어, 그래프 데이터베이스는 그래프 이론에 중점을 둠.

  • 확장성: NoSQL 데이터베이스는 수평적으로 확장되는 반면, RDBMS는 수직적으로 확장됨.

  • 일관성: 많은 NoSQL 데이터베이스는 확장성을 위해 최종적인 일관성을 제공하지만, 일관성 옵션이 존재

  • 트랜잭션: 전통적인 ACID(원자성, 일관성, 격리성, 내구성) 트랜잭션은 NoSQL 데이터베이스에서 엄격하게 적용되지 않지만, 일부 데이터베이스는 제한된 트랜잭션 지원 제공

  • 쿼리 언어: SQL은 데이터 쿼리를 위해 RDBMS에서 사용되나 NoSQL 데이터베이스는 자체 쿼리 언어 또는 JSONPath와 같은 문서 기반 쿼리 언어를 사용하는 경우가 많음.


NoSQL DB 설계 절차


  • 비관계형(NoSQL) 데이터베이스는 데이터 모델, 확장 메커니즘, 트레이드오프가 다르기 때문에 관계형 데이터베이스와는 다른 접근 방식이 필요 6. 보안 및 액세스 제어:

1. 요구 사항 분석 → 2. NoSQL 모델 선택 → 3. 데이터 모델 설계 → 4. 데이터 파티셔닝 및 샤딩 → 5. 인덱싱 및 쿼리 최적화 → 6. 데이터 일관성 및 트랜잭션 → 7. 테스트 및 유효성 검사 → 8. 모니터링 및 유지 관리


  1. 요구 사항 분석
  • 애플리케이션의 데이터 요구 사항, 액세스 패턴 분석, 문서화
  • 데이터 엔티티와 관계 분석
  • 읽기 및 쓰기 요구 사항과 데이터의 양을 결정


  1. NoSQL 모델 선택
  • 문서 Document 방식(MongoDB, CouchDB): 계층적 데이터, 유연한 스키마, JSON과 유사한 문서에 가장 적합
  • 키-값 방식(예: Redis, DynamoDB): 캐싱, 세션 관리, 실시간 분석에 이상적
  • 컬럼-패밀리 방식(Cassandra, HBase): 쓰기 작업이 많은 워크로드, 대규모 데이터 세트 및 넓은 컬럼 스토리지에 적합
  • 그래프 방식(Neo4j, ArangoDB): 소셜 네트워크, 추천 엔진과 같이 복잡한 관계를 가진 애플리케이션에 적합


  1. 데이터 모델 설계
  • 선택한 NoSQL 모델을 기반으로 데이터 구조 정의
  • 문서 방식은 필요에 따라 배열이 포함된 문서 또는 중첩된 문서를 설계
  • 키-값 방식은 키와 관련 값을 결정
  • 컬럼 패밀리 방식은 컬럼과 컬럼 패밀리를 디자인
  • 그래프 방식은 노드, 에지 및 속성을 정의


  1. 데이터 파티셔닝 및 샤딩
  • 확장성을 보장하기 위해 여러 노드에 데이터를 분산하는 방법을 계획
  • 샤딩 키를 사용해 데이터를 분할
  • 데이터 가용성과 내구성을 보장하기 위해 복제 전략 고려


  1. 인덱싱 및 쿼리 최적화
  • 인덱스를 생성하여 쿼리 성능 속도를 향상
  • 인덱싱 전략과 데이터 모델에 맞게 쿼리를 설계
  • 애플리케이션의 필요에 따라 데이터 액세스 패턴을 최적화


  1. 데이터 일관성 및 트랜잭션
  • 애플리케이션의 일관성 요구 사항(예: 최종 일관성, 강한 일관성)을 결정
  • 트랜잭션과 동시성을 처리하기 위해 적절한 메커니즘을 사용


  1. 보안 및 액세스 제어
  • 데이터 보안을 위해 액세스 제어 메커니즘을 구현
  • 미사용 및 전송 중인 민감한 데이터에는 암호화를 사용


  1. 테스트 및 유효성 검사
  • 실제 데이터와 워크로드 시나리오로 데이터베이스를 테스트
  • 다양한 조건에서 데이터 무결성과 성능을 검증


  1. 모니터링 및 유지 관리
  • 데이터베이스 성능과 상태를 추적하는 모니터링 도구를 설정
  • 백업, 업그레이드와 같은 유지 관리 작업을 정기적으로 수행


NoSQL DB 설계 시 고려 요소


  • 데이터 모델 적합성: 데이터 구조와 액세스 패턴에 가장 적합한 NoSQL 모델을 선택. 스키마의 유연성, 시간 경과에 따른 변화 고려

  • 확장성: 수평적 확장성 고려하여 데이터 볼륨과 트래픽 증가를 처리할 수 있도록 설계. 읽기 및 쓰기 확장성 고려 필요

  • 성능: 데이터 모델, 쿼리 최적화. 적절한 인덱싱 및 캐싱 메커니즘 사용

  • 일관성 및 가용성: 일관성, 가용성, 파티션 허용 오차(CAP 정리) 사이의 절충점. 애플리케이션의 요구 사항에 따라 적절한 균형을 선택

  • 데이터 내구성: 복제 및 백업 전략을 통해 데이터 내구성을 보장. 재해 복구 계획 수립

  • 운영 복잡성: NoSQL 데이터베이스 관리 복잡성 평가. 유지 관리, 모니터링, 확장을 위한 운영 오버헤드 고려


NoSQL DB 설계 시 주의 사항


데이터 중복성

  • NoSQL 데이터베이스는 종종 비정규화를 수반, 이로 인해 데이터 중복이 발생할 수 있음.
  • 중복 데이터를 신중하게 관리하여 일관성을 보장, 스토리지 비용 절감

샤딩 및 파티셔닝

  • 비효율적인 샤딩은 핫스팟과 불균일한 부하 분산으로 이어질 수 있습니다.
  • 노드 간에 데이터를 고르게 분산하는 샤딩 키를 선택하세요.

보안

  • 적절한 액세스 제어와 데이터 암호화를 보장하세요.
  • 보안 관행을 정기적으로 검토하고 업데이트합니다.


RDB, NoSQL DB 통합하기


관계형 데이터베이스 사용 사례

  • 트랜잭션 시스템: PostgreSQL 또는 MySQL과 같은 관계형 데이터베이스는 ACID 규정 준수 및 복잡한 쿼리가 필요한 시스템에 이상적입니다.

  • 레거시 시스템: 구조화된 데이터와 잘 정의된 스키마에 의존하는 기존 애플리케이션.

  • 비즈니스 인텔리전스: 기존 데이터베이스는 강력한 쿼리 기능으로 인해 보고 및 비즈니스 인텔리전스에 자주 사용됩니다.


비관계형 데이터베이스 사용 사례


  • 실시간 분석: 시계열 데이터와 실시간 분석을 처리하기 위해 Cassandra와 같은 컬럼 패밀리 저장소를 사용

  • 콘텐츠 관리: 유연하고 확장 가능한 콘텐츠 관리 시스템을 위해 MongoDB와 같은 문서 저장소를 사용

  • 캐싱: 자주 액세스하는 데이터를 캐싱하여 성능을 향상시키기 위해 Redis와 같은 키-값 저장소를 활용

  • 소셜 네트워크: Neo4j와 같은 그래프 데이터베이스를 활용하여 소셜 네트워크의 복잡한 관계를 관리하고 쿼리


Polyglot Persistence 다양한 언어, 도구 지속성


Polyglot adjective speaking or writing several languages

  1. speaking or writing several languages.
  2. : containing or composed of several languages. polyglot noun.
  • Polyglot Persistence 다언어 지속성이란 동일한 애플리케이션 내에서 서로 다른 작업에 최적화된 여러 데이터베이스를 사용하는 것. 이를 통해 관계형 데이터베이스와 비관계형 데이터베이스의 강점을 모두 활용할 수 있음.

관계형 DB와 NoSQL DB 통합을 위한 단계

  • 사용 사례 파악: 애플리케이션의 어떤 부분(예: 대용량 로깅)이 NoSQL이 유리한지, 어떤 부분(예: 금융 거래)에 관계형 데이터베이스의 ACID 속성이 필요한지 결정

데이터 흐름 설계

  • 데이터 세분화: 사용량에 따라 데이터를 세분화. 예를 들면, 사용자 프로필은 문서 저장소에 저장하고 트랜잭션 데이터는 관계형 데이터베이스에 저장
  • ETL 프로세스: ETL(추출, 변환, 로드) 프로세스를 사용해 필요에 따라 시스템 간 데이터 이동. Apache Kafka와 같은 도구는 실시간 데이터 통합을 가능하게함.
  • 데이터 일관성: 중요하지 않은 데이터에는 이벤트 일관성을, 중요한 작업에는 강한 일관성을 사용하는 등 시스템 간의 데이터 일관성을 위한 전략을 구현

API 계층

  • 통합 API: 기본 데이터베이스 시스템을 추상화하는 통합 API 계층을 만듦. 이를 통해 애플리케이션이 서로 다른 데이터베이스와 원활하게 상호 작용할 수 있음.
  • 마이크로서비스: 각 서비스가 요구 사항에 가장 적합한 데이터베이스를 사용할 수 있는 마이크로 서비스 아키텍처를 활용해야.

동기화 메커니즘

  • 변경 데이터 캡처(CDC): CDC를 구현하여 데이터의 변화를 모니터링하고 대응. Debezium과 같은 도구는 관계형 데이터베이스의 변경 사항을 캡처하여 NoSQL 시스템으로 전파할 수 있습니다.
  • 2단계 커밋(2PC): 데이터베이스 전반에서 강력한 일관성이 필요한 중요한 작업의 경우, 2PC를 사용하여 모든 시스템에서 트랜잭션이 커밋되도록 하거나 전혀 커밋되지 않도록 할 수 있습니다.

Change data capture (변경 데이터 캡처)란 변경된 데이터를 확인하고 추적하여 변경된 데이터(the “deltas”)를 사용하여 작업을 수행할 수 있도록 하는 소프트웨어 설계 패턴 세트입니다. 그 결과는 델타 기반 데이터 세트 delta-driven dataset임.

데이터 액세스 패턴

  • 하이브리드 쿼리: 데이터베이스가 가장 잘하는 작업에 데이터베이스를 사용해야. 예를 들면, 관계형 데이터베이스에서는 복잡한 조인을 수행. NoSQL 데이터베이스에서는 간단한 키-값 쌍을 검색하게 함.
  • 캐싱: 관계형 데이터베이스에서 자주 액세스하는 데이터를 Redis와 같은 키-값 저장소에 캐싱하는 캐싱 메커니즘을 구현



[참고자료]

[DATA ON-AIR]성공적인 NoSQL 도입을 위한 키포인트 : NoSQL 데이터 모델링
https://dataonair.or.kr/db-tech-reference/d-lounge/technical-data/?mod=document&uid=236123

[MongoDB] NOSQL 데이터 모델링 기법 살펴보기
https://velog.io/@hwaya2828/MongoDB-NOSQL-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81-%EA%B8%B0%EB%B2%95-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0

[Wikipedia] Change data capture
https://en.wikipedia.org/wiki/Change_data_capture

This post is licensed under CC-BY-NC-ND-4.0 by the author.