데이터베이스 설계 - 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 부분 보완
※ 내용에 오류가 있을 수 있습니다.
※ 내용을 계속 추가, 수정, 보완하고 있습니다.
목차
- 머리말
- 비관계형 Non-Relational DB
- 비관계형 DB 동작 원칙과 아키텍처, Non-RDB 간 차이
- NoSQL DB 설계 절차
- RDB, NoSQL DB 통합하기
- Polyglot Persistence 다양한 언어, 도구 지속성
머리말
‘데이터베이스 설계 - 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. 모니터링 및 유지 관리
- 요구 사항 분석
- 애플리케이션의 데이터 요구 사항, 액세스 패턴 분석, 문서화
- 데이터 엔티티와 관계 분석
- 읽기 및 쓰기 요구 사항과 데이터의 양을 결정
- NoSQL 모델 선택
- 문서 Document 방식(MongoDB, CouchDB): 계층적 데이터, 유연한 스키마, JSON과 유사한 문서에 가장 적합
- 키-값 방식(예: Redis, DynamoDB): 캐싱, 세션 관리, 실시간 분석에 이상적
- 컬럼-패밀리 방식(Cassandra, HBase): 쓰기 작업이 많은 워크로드, 대규모 데이터 세트 및 넓은 컬럼 스토리지에 적합
- 그래프 방식(Neo4j, ArangoDB): 소셜 네트워크, 추천 엔진과 같이 복잡한 관계를 가진 애플리케이션에 적합
- 데이터 모델 설계
- 선택한 NoSQL 모델을 기반으로 데이터 구조 정의
- 문서 방식은 필요에 따라 배열이 포함된 문서 또는 중첩된 문서를 설계
- 키-값 방식은 키와 관련 값을 결정
- 컬럼 패밀리 방식은 컬럼과 컬럼 패밀리를 디자인
- 그래프 방식은 노드, 에지 및 속성을 정의
- 데이터 파티셔닝 및 샤딩
- 확장성을 보장하기 위해 여러 노드에 데이터를 분산하는 방법을 계획
- 샤딩 키를 사용해 데이터를 분할
- 데이터 가용성과 내구성을 보장하기 위해 복제 전략 고려
- 인덱싱 및 쿼리 최적화
- 인덱스를 생성하여 쿼리 성능 속도를 향상
- 인덱싱 전략과 데이터 모델에 맞게 쿼리를 설계
- 애플리케이션의 필요에 따라 데이터 액세스 패턴을 최적화
- 데이터 일관성 및 트랜잭션
- 애플리케이션의 일관성 요구 사항(예: 최종 일관성, 강한 일관성)을 결정
- 트랜잭션과 동시성을 처리하기 위해 적절한 메커니즘을 사용
- 보안 및 액세스 제어
- 데이터 보안을 위해 액세스 제어 메커니즘을 구현
- 미사용 및 전송 중인 민감한 데이터에는 암호화를 사용
- 테스트 및 유효성 검사
- 실제 데이터와 워크로드 시나리오로 데이터베이스를 테스트
- 다양한 조건에서 데이터 무결성과 성능을 검증
- 모니터링 및 유지 관리
- 데이터베이스 성능과 상태를 추적하는 모니터링 도구를 설정
- 백업, 업그레이드와 같은 유지 관리 작업을 정기적으로 수행
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
- : speaking or writing several languages.
- : 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