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에 비해 쓰기 성능이 떨어지고 장애가 전파된 경우 처리가 까다롭다.