새소식

반응형
CS/DB

(5) SQL vs NoSQL 비교 / 리플리케이션 & 클러스터링 & 샤딩

  • -
728x90
반응형

 

TL;DR

SQL vs NoSQL 비교
1. 최적의 워크로드
2. 데이터 모델 (스키마, 관계)
3. 확장성 (scale-up vs scale-out)
4. 특성 ( ACID vs CAP)


클러스터링 vs 리플리케이션
이란? DB를 수평적, 수직적으로 확장하는 두 가지 방법
DB샤딩이란? DB 트래픽을 분산할 목적으로 데이터를 분산해서 저장하는 기법

 

✅ 최적의 워크로드

  • 관계형 데이터베이스는 일관성이 뛰어난 온라인 트랜잭션 프로세싱 어플리케이션을 위해 설계되어 온라인 분석 프로세싱에 적합
    • 데이터 중복 감소가 개발 목적
    • 성능은 일반적으로 디스크 하위 시스템에 따라 다르다. 최고 성능을 위해서는 쿼리, 인덱스 및 테이블 구조를 자주 최적화 해야 한다.
    • 데이터  저장 및 검색하기 위한 요청은 SQL을 준수하는 쿼리를 사용해 전달
    • 쿼리는 RDBMS에 의해 구문 분석되고 실행된다.
  • NoSQL 데이터베이스는 낮은 지연 시간의 어플리케이션을 포함한 수 많은 데이터 액세스 패턴에 맞도록 설계되었다. 반정형 데이터에서 분석을 위해 설계되었다.
    • 애자일/ 확장 가능성/ 유연성 등이 개발 목적 
    • 성능은 일반적으로 기본 하드웨어 클러스터 크기, 네트워크 지연 시간 및 호출 어플리케이션의 기능이다.
    • 객체 기반 API를 통해 앱 개발자가 데이터 구조를 쉽게 저장 및 검색할 수 있다.
    • 파티션 키를 사용해 앱에서 키-값 페어, 열 세트 또는 일련의 앱 객체 및 속성을 포함하는 반정형 문서를 검색할 수 있다.

 

 데이터 모델

  • 관계형 모델은 데이터를 행과 열로 구성된 테이블로 정규화
    • 스키마는 테이블, 행, 열, 인덱스, 테이블 간 관계, 기타 데이터베이스 요소를 정확하게 규정
    • 테이블 사이의 관계에서 참조 무결성을 실현
    • 엄격한 데이터 구조

 

  • NoSQL 데이터베이스는 키-값, 문서, 그래프 등 성능과 규모 확장에 최적화된 다양한 데이터 모델을 제공
    • 유연한 데이터 구조

 

1️⃣ 스키마

DB의 구조, 제약조건에 관한 명세

  • 개체의 특징을 나타내는 속성(Attribute)
  • 속성들의 집합으로 이루어진 개체(Entity)
  • 개체 간 존재하는 관계(RelationShip)

 

  SQL NoSQL
1   Table에 데이터가 저장됨 (2차원 테이블로 모델링) 스키마를 정의하지 않아도 된다.
2   Row, Col 구조 document, key-value, 그래프 등
3   스키마를 정의 해야 데이터를 저장할 수 있음   
  • SQL은 명확한 데이터 구조를 보장하기 때문에 구조가 유연하지 못하고
  • NoSQL은 유연하고 자유로운 구조를 가지고 있기 때문에 명확한 데이터 구조가 보장되지 않는다.

 

 

2️⃣ Relation(관계)

  SQL NoSQL
1     SQL에서 가장 중요     Join 이란 개념이 없음
2     Table간의 관계(Join)을 통해 데이터를 파악할 수 있음     Users 의 데이터가 Orders에 다 담김.
    -> Join을 통해 확인 X
3     데이터를 중복 없이 저장 가능(정규화 필요)     Collections 별로 중복된 데이터 존재
    -> 업데이트 할 때 주의 필요
  • SQL은 데이터 중복 없이 한 번만 저장함으로 무결성을 보장하지만 시스템이 커지면 join 문이 많은 복잡한 쿼리가 필요하게된다.

 

  Scalability(확장)

  SQL NoSQL
특징 Vertical Horizontal
  = Scale up = Scale out
  성능을 향상시키는 것 더 많이 서버를 늘리는 것
  • 관계형 데이터베이스는 하드웨어 계산 성능을 높이거나, 읽기 전용 워크로드의 복제물을 추가함으로써 확장
    • 수평적 확장이 까다로워 비용이 큰 수직적 확장을 주로 사용하는 것
  • NoSQL 데이터베이스는 거의 무제한적인 범위에서 일관된 성능을 제공하기 위해 분산형 아키텍처 사용해 액세스 패턴 확장이 가능하기 때문에 분할성이 있다.
    • 중복 데이터가 많아 데이터 변경 시 모든 컬렉션에서 수정이 필요해 update가 오버헤드가 있다.

 

  Property(특성)

  SQL NoSQL
특징 ACID CAP (ACID를 완벽히 구현하지 않고 “Eventual consistency” 개념을 도입.)
  트랜잭션이 안전하게 수행되도록 보장하는 것 CAP 의 Consistency나 Avaliability를 포기해 분산 확장성을 보장
    A+P : 비동기식 서비스
C+P : 성능 보장형 대용량 분산 파일 시스템
  Atomicity(원자성) : 트랜잭션의 작업이 부분적으로 실행되거나 중단되지 않는 것을 보장  
  Consistency(일관성) : 미리 정의된 규칙에서만 수정이 가능한 특성 (숫자 컬럼에 문자열 값 저장 안되도록 보장) Consistency (일관성) : 모든 요청은 최신 데이터 또는 에러를 응답 (DB가 3개로 분산되었다고 가정할 때, 하나의 특정 DB의 데이터가 수정되면 나머지 2개의 DB에서도 수정된 데이터를 응답받아야 한다.)
  Isolation(고립성) : 트랜잭션 수행시 다른 트랜잭션의 작업이 끼어들지 못하도록 보장 Availability (가용성) : 모든 요청은 정상 응답을 받는다. (특정 DB가 장애가 나도 서비스가 가능해야 한다.)
  Durability(영구성) : 성공적으로 수행된 트랜잭션은 영원히 반영 Partitions Tolerance (분리 내구성) : DB간 통신이 실패하는 경우라도 시스템은 정상 동작

 

  • NoSQL은 분산형의 특성상 정보의 일관성을 유지하기가 어렵다. 수많은 머신에 데이터를 분산저장했는데 한 영역에 Update가 생길 시 그것을 실시간으로 다른 영역에 전파하는 것이 쉽지만은 않기 때문이다. 반드시 어느 정도의 전파 비용은 수반될 수밖에 없다. 그래서 NoSQL은 Consistency를 조금 타협하고 꼭 실제 최신은 아닐 수 있지만 “업데이트가 되기 전까지는” 가지고 있는 최신의 데이터를 반환한다는 “Eventual Consistency”라는 개념을 사용한다.

 

👆 CAP 이란?

2002년 버클리 대학의 Eric Brewer 교수가 발표한 분산 컴퓨팅 이론으로, 분산 컴퓨팅 환경에서 일관성, 가용성, 분산 가용성 세 가지 특징을 보장해야 함을 정의하고, 분산 시스템은 이중 두 가지만 만족할 수 있다는 이론이다.

 

그래서 둘 중에 뭘 선택해야 하는가?

정답은 없다. 어떤 데이터를 다루느냐에 따라 달라진다.

 

SQL 데이터 베이스 사용이 더 좋을 때

  • 변경될 여지가 없는 명확한 스키마가 사용자와 데이터에게 중요한 경우
  • 관계를 맺고 있는 데이터가 자주 변경되는 어플리케이션 (데이터 update가 잦은 시스템)
  • 데이터베이스의 ACID 성질을 준수해야 하는 경우 (금융 서비스)

 

NoSQL 데이터 베이스 사용이 더 좋을 때

  • 정확한 데이터 구조를 알 수 없거나 변경/확장 될 수 있는 경우
  • 읽기를 자주 하지만, 데이터 변경은 자주 없는 경우
  • 데이터베이스를 수평으로 확장해야 하는 경우 (막대한 양의 데이터를 다뤄야 하는 경우)
  • 데이터 정합성이나 일관성이 최고 우선순위가 아닌 경우

 

 

Replication vs Clustering

  • 리플리케이션은 여러 개의 DB를 수직적인 구조(Master-Slave)로 구축하는 방식
    • 장점 : 읽기 작업이 많은 DB 요청에서는 replication 만으로 충분히 성능 높이기가 가능하다. 비동식 방식이라 지연 시간이 거의 없다.
    • 단점 : Master 노드가 다운되면 복구/대처가 까다롭다. 동기화가 보장되지 않아 일관성 있는 데이터 신뢰가 불가능하다.
  • 클러스터링은 여러 개의 DB를 수평적인 구조로 구축하는 방식
    • 장점 : 노드들 간의 데이터를 동기화해 일관성 있는 데이터를 신뢰할 수 있다. 1개 노드가 죽어도 다른 노드가 살아있어 시스템을 장애없이 운영할 수 있다.
    • 단점 : Replication에 비해 쓰기 성능이 떨어지고 장애가 전파된 경우 처리가 까다롭다.

 

Replication

  • 여러 개의 DB를 권한에 따라 수직 구조로 구축하는 방식.
  • 데이터 베이스 서버와 스토리지를 모두 확장
  • Master Node는 쓰기 작업만, Slave Node는 읽기 작업만. (기존의 부하를 분산)
  • 비동기 방식으로 노드 데이터 동기화
더보기
  1. Master Node에 쓰기 작업 실행
  2. 데이터를 저장하고 트랜잭션 로그를 파일에 기록(BinLog)
  3. Slave Node IO Thread는 BinLog를 복사
  4. Slave 노드의 SQL Thread는 파일을 읽으며 데이터 저장

 

 

Clustering

  • 여러 개의 DB를 수평 구조로 구축하는 방식. (데이터 베이스 서버 확장)
  • Fail Over 시스템을 구축하기 위해 사용.
    • 데이터 베이스가 동작하지 않으면 전체 서비스가 동작할 수 없다는 점을 해결하기 위해 Clustering을 통해 데이터 베이스 서버를 늘린다.
  • 동기 방식으로 노드들 간의 데이터 동기화
더보기
  1. 1개의 노드에 쓰기 트랜잭션 수행
  2. 실제 디스크에 내용을 쓰기 전에 다른 노드로 데이터 복제 요청
  3. 다른 노드에서 복제 요청 수락 신호를 보내고, 디스크에 쓰기 시작
  4. 다른 노드로부터 신호를 받으면 실제 데이터 저장

 

Sharding

  • 같은 테이블 스키마를 가진 데이터를 다수의 데이터베이스에 분산하여 저장하는 방법.
    = Horizontal Partitioning
  • DB 트래픽을 분산할 목적
    • 데이터가 급격히 증가하게 되거나 트래픽이 특정 DB로 몰리는 상황을 대비해서 빠르고 유연하고 안전하게 DB를 증설할 수 있게 한다. (DB 서버의 부하를 분산)
    • Scale-up 에는 한계가 있고, Scale-out은 동기화라는 제약이 따르게 되므로 DB 서버의 샤딩은 대규모 시스템 설계와 확장성 확보에 필수 불가결인 요소가 된다.
  • 다수의 복제본으로 구성하고 각 샤드에 어떤 데이터가 저장될 지를 Shard Key를 기준으로 분리한다.
  • Shard Key를 어떻게 정의하느냐에 따라 데이터를 효율적으로 분산시키는 것이 결정됨

 

샤딩 방법

  • Hash Sharding : 데이터를 어디에 넣을지 해싱하여 결정
  • Dynamic Sharding : Locator Service 를 통해 동적 샤딩 키를 얻어 사용
  • Entity Group : 관련된 데이터를 하나의 샤드로 사용하는 방식

 

더보기

샤딩 적용시 문제점 및 고려사항

  1. 데이터 재분배 (Rebalancing Data)
    • 샤딩된 DB의 물리적 한계나 성능 한계 도달 시 scale-up 작업이 필요한데,
    • 이때 서비스 정지 없이 scale-up 할 수 있도록 설계 방향 잡아야 한다.
  2. 데이터 조인하기
    • 샤딩 DB 간 조인이 불가능 하므로 데이터 중복에 대한 trade-off
  3. Global Unique Key
    => 라우팅을 위해 구분할 수 있는 유일한 키값이 있어야 한다.
  4. DBMS에서 제공하는 auto-increament를 사용하면 Key가 중복될 수 있기 때문에 어플리케이션 레벨에서 Key 생성을 담당해야 한다.
  5. 프로그래밍 복잡도가 증가하고, 데이터가 한 쪽 샤드로 몰리면 샤딩이 무의미해짐
  6. 한 번 샤딩 사용하면 샤딩 이전 구조로 돌아가기 힘들다.

 

 

 

 

References

반응형

'CS > DB' 카테고리의 다른 글

DB 면접 대비 질문 리스트업  (1) 2023.05.04
(6) 인덱스 / B-Tree  (1) 2023.05.03
(4) NoSQL : 특징/ 종류  (0) 2023.05.02
(3) 무결성 제약/ 트랜잭션/ 교착상태  (0) 2023.05.02
(2) RDBMS - 테이블 구조/ 키/ 정규형/ Join  (0) 2023.05.02
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.