본문으로 건너뛰기

NoSQL_시스템 설계 노트 12

무료2020-03-22#Back-End#NoSQL数据库#NoSQL应用场景#NoSQL Pros and Cons#NoSQL的优缺点#NoSQL的缺陷

먼저 정규화하고 성능 병목에 직면한 후 비정규화를 수행하는 것보다, 처음부터 비정규화 설계를 고려하는 것이 낫다——직접 NoSQL 을 채택

앞에 쓰는 말

관계형 데이터베이스의 경우, (필요시) 비정규화 를 통해 쓰기 성능의 일부를 희생하여 더 높은 읽기 성능을 얻을 수 있지만, 전제는 먼저 范式设计을 만족시키고, 그 다음 이 基础上에서 局部調整을 수행하고, 의도적으로 몇 가지 규칙을 깨는 것입니다

먼저 정규화하고 성능 병목에 직면한 후 비정규화를 수행하는 것보다, 처음부터 비정규화 설계를 고려하는 것이 낫습니다——직접 NoSQL 을 채택합니다

一.NoSQL 이란 무엇인가?

관계형 데이터베이스와 달리, NoSQL 데이터베이스 (비 SQL 또는 비관계형 데이터베이스라고도 함) 가 제공하는 데이터 저장, 검색 메커니즘은 표 관계에 기반한 모델링이 아닙니다:

A NoSQL (originally referring to "non SQL" or "non relational") database provides a mechanism for storage and retrieval of data that is modeled in means other than the tabular relations used in relational databases.

데이터 테이블이 없어지면, 자연스럽게 여러 테이블 결합 검색 (join 조작) 의 성능 우려도 없어지고, 范式制約과 비정규화의 선택도 존재하지 않게 됩니다

하지만 데이터 테이블이 없어지면, 데이터는 어떻게 조직하고, 관계는 어떻게 기술해야 할까요?

실제로, SQL(관계형 데이터베이스) 은 유일한 선택이 아닙니다

Not Only SQL

NOSQL 에 대해, 또 다른 재미있는 이해는 Not Only SQL 로, 관계형 데이터베이스 밖의 광활한 세계에서, 데이터는 반드시 평평하게 하여 이차원 테이블에 저장할 필요가 없으며, 관계도 주키, 외키, 관계 테이블로만 기술할 필요가 없습니다

데이터베이스 타입이라는 관점에서 보면, NoSQL 은 관계형 이외의其它타입의 데이터베이스를 가리키며, 즉 비관계형 데이터베이스 (NoREL, Non Relational) 입니다. 예를 들어 MongoDB, CouchDB

사용 관점에서 보면, NoSQL 을 실천하려면 반드시 NoSQL 데이터베이스를 선택할 필요는 없으며, "NoSQL"의 방식으로 MySQL 등의 관계형 데이터베이스를 사용하는 것도 물론 포함됩니다:

You can stay with MySQL, and use it like a NoSQL database.

예를 들어 데이터 테이블에 JSON 문자열 열을 저장하고, 이 열을 키 - 밸류 데이터베이스로 사용합니다

二.4 가지 NoSQL 데이터베이스

관계형 데이터베이스의 테이블 구조와 달리, NoSQL 데이터베이스는 더 유연한 데이터 구조를 지원하여 몇 가지 조작을 더 빠르게 합니다

키 - 밸류 스토어

키 - 밸류 스토어 (Key-value store) 는 가장 간단한 NoSQL 데이터 모델로, 키 - 밸류 페어만 저장할 수 있으며, key 로만 검색 가능 합니다. 저장되는 값은 데이터베이스 시스템에 대해 불투명 (BLOB 와 유사) 하여, 값의 특징에 기반하여 검색하거나 인덱스를 생성할 수 없습니다

P.S.일부 키 - 밸류 데이터베이스는 key 를 정렬할 수 있어, 범위 검색 (특정 구간 내의 key 의 데이터를 검색) 을 지원합니다. 예를 들어 사원 번호가 100000 보다 큰 신입 사원 정보 검색

데이터 모델은해시 테이블이며, O(1) 의 읽기/쓰기 성능을 달성할 수 있고, 간단하거나 빈번하게 변경되는 데이터에 적합하며, 메모리 캐시로 자주 사용됩니다. 예를 들어 Memcached, Redis

도큐먼트 스토어

도큐먼트 스토어 (Document store) 는 도큐먼트 (XML, JSON 등의 반구조화 데이터) 를 중심으로 모델링하며, 강화판 키 - 밸류 스토어에 해당하며, 도큐먼트 지향으로 더 정교한 데이터 조작을 제공 합니다. 키 - 밸류 스토어와의 최대 차이는 데이터베이스가 저장되는 값 (즉 도큐먼트) 을 이해하고 처리할 수 있으며, 값의 특징 (즉 도큐먼트의 내부 구조) 에 기반하여 검색하고 인덱스를 생성할 수 있다는 것입니다

게다가, 도큐먼트는 중첩을 지원하며, MongoDB, CouchDB 등의 도큐먼트 데이터베이스는 SQL 과 유사한 쿼리 언어도 제공하여 복잡한 쿼리를 지원합니다

영속화 저장에 적합하며, 빈번하게 변경되지 않는 데이터를 저장하는 데 사용되며, 관계형 데이터베이스의 일반 대체안으로

와이드 컬럼 스토어

와이드 컬럼 스토어 (Wide column store) 에서, 컬럼 (column) 이 최소 데이터 유닛이며, 각 컬럼은 이름 - 값 페어 (및 버전 관리와 충돌 해결을 위한 타임스탬프) 이며, 컬럼 위에는 슈퍼 컬럼 (super column) 이라는 레벨이 있습니다:

컬럼만 포함하는 행을 컬럼 패밀리 (column family) 라고 하며, 슈퍼 컬럼을 포함하는 행을 슈퍼 컬럼 패밀리 (super column family) 라고 하며, 각 행 (즉, 컬럼 패밀리 또는 슈퍼 컬럼 패밀리) 은 하나의 엔티티를 나타내며, 해당 엔티티의 모든 관련 정보를 포함합니다:

데이터 모델은이차원 Map으로, 고성능과 양호한 확장성이 특징이며, 매우 큰 데이터 세트에 적합하며, Twitter, Facebook 등의 소셜 네트워크가 해량 사용자가 생성하는 데이터를 저장하는 데 사용합니다

P.S.예를 들어 Google 이 최초로 발표한 Bigtable, Hadoop 에코시스템 중의 HBase, 및 Facebook 이 발표한 Cassandra

그래프 데이터베이스

데이터는 그래프에 기반하여 모델링되며, 그래프 중 각 노드는 하나의 레코드를 나타내고, 각 에지는 노드 간의 관계를 나타냅니다. 따라서 데이터 오브젝트 간의 복잡한 관계를 쉽게 기술할 수 있습니다. 예를 들어 관계 모델 중의 복잡한 외키와 다대다 관계

그래프 데이터베이스의 실제 응용은 아직 충분히 성숙하지 않으며, 널리 채택된 표준화 쿼리 언어조차 아직 없지만, 그 연결성 우위는 복잡한 관계를 가진 데이터 모델 (예를 들어 소셜 네트워크) 에 특히 적합하며, 기대할 가치가 있습니다:

P.S.예를 들어 Neo4j, Oracle Spatial and Graph, ArangoDB

三.NoSQL 은 무엇을 의미하는가?

간단한 NoSQL 모델 (키 - 밸류 스토어 등) 을 채택하는 것은, 일부 작업을 데이터베이스 층에서 애플리케이션 층으로 이전하는 것에 해당합니다:

Joins will now need to be done in your application code.

데이터베이스 층과 비교하여, 애플리케이션 층은 일반적으로 (수평으로) 확장하기 쉬우며, 따라서 이 작업량 이전은 시스템의 확장성 향상에 도움이 되며, 복잡한 데이터 조작을 애플리케이션 층에 처리하게 하여 더 큰 최적화 공간을 구합니다

심지어 트랜잭션 등의 강일관성 보장도 애플리케이션 층에서 처리해야 합니다. 대다수 NoSQL 데이터베이스는 트랜잭션 지원을 제공하지 않기 때문입니다:

Most NoSQL stores lack true ACID transactions, although a few databases have made them central to their designs.

ACID vs. BASE

관계형 데이터베이스에서 추구되는 ACID(트랜잭션의 4 대 특성) 와는 다릅니다:

  • Atomicity(원자성): 일련의 조작은 모두 성공하거나 실패하여 모두 롤백

  • Consistency(일관성): 트랜잭션 실행 전후에 데이터베이스는 일관성 상태여야 함 (기정된 모든 일관성 제약 만족)

  • Isolation(격리성): 병행 트랜잭션 조작의 결과 상태는 순서대로 실행하는 것과 같음

  • Durability(지속성): 트랜잭션이 커밋되면, 데이터의 변경은 영구적이며, 장애에遭遇해도 커밋된 결과는 손실되지 않음

NoSQL 은 CAP 의 선택 에서 C 에 타협하여, 최종 일관성을 허용합니다. 즉 BASE 입니다:

  • Basically Available(기본可用): 읽기/쓰기 조작은 가능한 한 可用을 보장하지만, 어떠한 일관성도 보장하지 않음

  • Soft state(軟 상태): 일관성 보장이 없으므로, 일정 시간 후, 최신 상태를 읽을 수 있을 뿐이며, 아직 수렴하지 않았을 수 있음

  • Eventual consistency(최종 일관성): 시스템이 정상적으로 실행되면, 충분한 시간을 기다린 후, 최종적으로 최신 상태를 읽을 수 있음

즉, 분산 환경에서, (대다수의) NoSQL 데이터베이스는 최종 일관성만 보장하며, 최신 데이터를 즉시 읽지 못할 수 있습니다

四.SQL or NoSQL?

그에 비해, SQL 데이터베이스 (관계형 데이터베이스) 의 우위는:

  • 트랜잭션 조작을 지원

  • 명확한 확장 모드 있음

  • 개발자, 커뮤니티, 툴 등이 비교적 성숙

주요 결점은:

  • 복잡한 테이블 결합 쿼리로 인해 데이터 읽기 성능이 좋지 않음

  • 확장하기 어려움 (수동 샤딩)

  • 관계 모델과 OOP 간에 큰 차이가 있음 (Object-relational impedance mismatch)

  • 구조화 데이터의 저장과 취득만 지원하며, 관계 모드 (테이블 구조 등) 는 사전에 정의해야 하며, 변경 비용이 높음

P.S.Object-relational impedance mismatch 에 대한 상세 정보는, Why is MongoDB wildly popular? It's a data structure thing. 참조

NoSQL 데이터베이스 (비관계형 데이터베이스) 의 우위는 다음에 집중:

  • 복잡한 테이블 결합 쿼리가 존재하지 않음

  • 확장하기 쉬움 (일부 NoSQL 데이터베이스는 자동 샤딩을 지원)

  • OOP 데이터 모델과 일치하여 사용하기 쉬움

  • 데이터 모드를 사전에 정의할 필요 없으며, 급속하게 변화하는 구조화, 반구조화, 비구조화 데이터의 저장과 취득을 지원

  • 읽기/쓰기 성능 (IOPS) 이 높음, 데이터 집약형 작업에 적합

주요 결점은:

  • 강일관성 보장이 결여

  • 개발자, 커뮤니티, 툴 등이 그다지 성숙하지 않음

응용 장면

따라서, NoSQL 데이터베이스는 다음에 적합합니다:

  • 급속하게 변화하는 데이터. 예를 들어 클릭 스트림 (click stream) 데이터 또는 로그 데이터

  • 랭킹 또는 스코어 데이터

  • 임시 데이터. 예를 들어 쇼핑카트 데이터

  • 빈번하게 액세스되는 핫 데이터

  • 메타데이터 (metadata), 및 룩업 테이블 (lookup tables)

참고 자료

댓글

아직 댓글이 없습니다

댓글 작성