CS 공부
SQL vs NoSQL 본문
SQL이란
SQL은 관계형 데이터베이스 관리 시스템(RDBMS)의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어이다.
관계형 데이터 베이스 관리 시스템에서 자료의 검색과 관리, 데이터베이스 스키마 생성과 수정, 데이터 베이스 객체 접근 조정 관리를 위해 고안되었다.
많은 수의 데이터베이스 관련 프로그램들이 SQL을 표준으로 채택하고 있다.
데이터 저장 방식으로 인해 SQL 데이터베이스는 일반적으로 수직적 확장만 지원한다.
관계형 데이터베이스
관계형 데이터베이스 정의
- 통합된 데이터(integrated data) : 똑같은 데이터가 원칙적으로 중복되어 있지 않다는 것을 말한다.
- 저장된 데이터(stored data) : 컴퓨터가 접근할 수 있는 기억장치에 저장된 데이터를 말한다.
- 운영 데이터(operational data) : 존재 목적이 명확하고 유용성을 지니고 있는 데이터를 말한다.
- 공용 데이터(shared data) : 여러 사용자들이 서로 다른 목적으로 사용하는 공유 가능한 데이터를 말한다.
관계형 데이터베이스의 특징
- 수시적이고 비정형적인 질의(query)에 대하여 실시간 처리로 응답할 수 있어야 한다.
- 저장된 데이터는 최신의 정보가 정확하게 저장되어 처리 되어야 한다.
- 동일 데이터를 동시에 서로 다른 목적으로 사용할 수 있어야 한다.
- 데이터는 정해진 데이터 스키마에 따라 테이블에 저장되고 관계를 통해 여러 테이블에 분산 저장한다.
- 데이터는 테이블에 레코드로 저장되는데, 각 테이블마다 명확하게 정의된 구조가 있다. 해당 구조는 필드의 이름과 데이터 유형으로 정의된다.
- 스키마를 준수하지 않은 레코드는 테이블에 추가할 수 없다. 즉 스키마를 수정하지 않는 이상은 정해진 구조에 맞는 레코드만 추가가 가능한 것이 관계형 데이터베이스의 특징
- 데이터의 중복을 피하기 위해 '관계'를 이용한다.
- 데이터베이스 내에 있는 데이터 레코드들은 주소나 위치에 의해 참조되는 것이 아니라 가지고 있는 값에 따라 참조해야 한다.
- 하나의 테이블에서 중복 없이 하나의 데이터만을 관리하기 때문에 다른 테이블에서 부정확한 데이터를 다룰 위험이 없어지는 장점이 있다.
관계형 데이터베이스 구조
- 논리적 구조로 표현한 데이터베이스 => 논리적 데이터베이스 => 사용자 입장
- 물리적 구조로 표현한 데이터베이스 => 물리적 데이터베이스 => 실제 저장 구조
NOSQL
NoSQL이 무엇의 약자인지는 사람에 따라 엇갈리는 의견들이 있지만 현재 Not Only SQL로 풀어 설명하는 것이 다수를 차지한다. 이 말의 의미를 풀어보면, 단순히 기존 관계형 DBMS가 갖고 있는 특성뿐만 아니라, 다른 특성들을 부가적으로 지원한다는 것을 의미한다.
NoSQL은 초고용량 데이터 처리 등 성능에 특화된 목적을 위해, 비관계형 데이터 저장소에, 비구조적인 데이터를 저장하기 위한 분산 저장 시스템이다.
NoSQL 데이터베이스의 특징
- 기존의 관계형 데이터베이스 보다 더 융통성 있는 데이터 모델을 사용한다.
- 데이터의 저장 및 검색을 위한 특화된 매커니즘을 제공한다.
- 이를 통해 NoSQL 데이터베이스는 단순 검색 및 추가 작업에 있어서 매우 최적화된 키 값 저장 기법을 사용하여 응답속도나, 처리 효율 등에 있어서 매우 뛰어난 성능을 보임
- NoSQL에서는 레코드를 문서(documents)라고 부른다.
- NoSQL에서는 다른 구조의 데이터를 같은 컬렉션에 추가가 가능하다.
- 문서(documents)는 Json과 비슷한 형태로 가지고 있다. 관계형 데이터베이스처럼 여러 테이블에 나누어담지 않고, 관련 데이터를 동일한 '컬렉션'에 넣는다.
- 여러 테이블에 조인할 필요없이 이미 필요한 모든 것을 갖춘 문서를 작성하는 것이 NoSQL이다. (NoSQL에는 조인이라는 개념이 존재하지 않음)
- 조인하고 싶을 때 컬렉션을 통해 데이터를 복제하여 각 컬렉션 일부분에 속하는 데이터를 정확하게 산출하도록 한다.하지만 이러면 데이터가 중복되어 서로 영향을 줄 위험이 있다. 따라서 조인을 잘 사용하지 않고 자주 변경되지 않는 데이터일 때 NoSQL을 쓰면 상당히 효율적이다.
기존 관계형 데이터베이스와 NoSQL의 차이점
- 관계형 모델을 사용하지 않으며 테이블간의 조인 기능 없음
- 직접 프로그래밍을 하는 등의 비SQL 인터페이스를 통한 데이터 액세스
- 대부분 여러 대의 데이터베이스 서버를 묶어서(클러스터링) 하나의 데이터베이스를 구성
- 관계형 데이터베이스에서는 지원하는 Data처리 완결성(Transaction ACID 지원) 미보장
- 데이터의 스키마와 속성들을 다양하게 수용 및 동적 정의 (Schema-less)
- 데이터베이스의 중단 없는 서비스와 자동 복구 기능지원
- 다수가 Open Source로 제공
- 확장성, 가용성, 높은 성능
- SQL은 정해진 스키마를 따르지 않으면 데이터 추가가 불가능하지만 NoSQL에서는 다른 구조의 데이터를 같은 컬렉션에 추가가 가능하다.
- SQL은 일반적으로 수직적 확장만 지원하는데 반해 NoSQL은 수평적 확장도 지원
장단점
SQL 장점
명확하게 정의된 스키마, 데이터 무결성 보장
관계는 각 데이터를 중복없이 한번만 저장
SQL 단점
덜 유연함. 데이터 스키마를 사전에 계획하고 알려야 함. (나중에 수정하기 힘듬)
관계를 맺고 있어서 조인문이 많은 복잡한 쿼리가 만들어질 수 있음
대체로 수직적 확장만 가능함
NoSQL 장점
스키마가 없어서 유연함. 언제든지 저장된 데이터를 조정하고 새로운 필드 추가 가능
데이터는 애플리케이션이 필요로 하는 형식으로 저장됨. 데이터 읽어오는 속도 빨라짐
수직 및 수평 확장이 가능해서 애플리케이션이 발생시키는 모든 읽기/쓰기 요청 처리 가능
NoSQL 단점
유연성으로 인해 데이터 구조 결정을 미루게 될 수 있음
데이터 중복을 계속 업데이트 해야 함
데이터가 여러 컬렉션에 중복되어 있기 때문에 수정 시 모든 컬렉션에서 수행해야 함 (SQL에서는 중복 데이터가 없으므로 한번만 수행이 가능)
SQL 데이터베이스 사용이 더 좋을 때
관계를 맺고 있는 데이터가 자주 변경되는 애플리케이션의 경우
NoSQL에서는 여러 컬렉션을 모두 수정해야 하기 때문에 비효율적
변경될 여지가 없고, 명확한 스키마가 사용자와 데이터에게 중요한 경우
NoSQL 데이터베이스 사용이 더 좋을 때
정확한 데이터 구조를 알 수 없거나 변경/확장 될 수 있는 경우
읽기를 자주 하지만, 데이터 변경은 자주 없는 경우
데이터베이스를 수평으로 확장해야 하는 경우 (막대한 양의 데이터를 다뤄야 하는 경우)
단어 설명
수직적 확장
단순히 데이터베이스 서버의 성능을 향상시키는 것 (ex. CPU 업그레이드)(Scale Out)
단순하고 어플리케이션을 수정할 필요는 없다는 장점이 있지만
확장에 한계가 있다는 점과 경우에 따라서는 특정 제조사 전용 장비만 써야 하는 등의 단점이 있다.
수평적 확장
더 많은 서버가 추가되고 데이터베이스가 전체적으로 분산됨을 의미 (하나의 데이터베이스에서 작동하지만 여러 호스트에서 작동) (Scale UP)
소프트웨어만 구동할 수 있으면 되기 때문에 하드웨어 종속성이 덜하다.
이론상으로는 무한한 확장이 가능하고,
쿠버네티스 같은 오케스트레이션을 이용해 중단 없는 자동 확장도 가능하다.
하지만 일반적으로 네트워크로 연결 되므로 네트워크 환경이 좋지 않으면 확장이 불가능하거나, 확장을 해도 원하는 성능을 못 얻는 경우가 있다.
그리고 어플리케이션의 수정이 필요한 경우가 많고, 어플리케이션의 수정, 업데이트의 경우 각 노드에 반영해야 하므로 작업량이 늘어난다.
Replication
리플리케이션이란 여러 개의 DB를 권한에 따라 수직적인 구조(Master-Slave)로 구축하는 방식이다. 리플리케이션에서 Master Node는 쓰기 작업 만을 처리하며 Slave Node는 읽기 작업 만을 처리한다. 리플리케이션은 비동기 방식으로 노드들 간의 데이터를 동기화하는데, 자세한 처리 방법은 아래와 같다.
위의 그림은 MySQL의 Replication 방식에 대한 그림이며 자세한 처리 순서는 아래와 같다.
- Master 노드에 쓰기 트랜잭션이 수행된다.
- Master 노드는 데이터를 저장하고 트랜잭션에 대한 로그를 파일에 기록한다.(BIN LOG)
- Slave 노드의 IO Thread는 Master 노드의 로그 파일(BIN LOG)를 파일(Replay Log)에 복사한다.
- Slave 노드의 SQL Thread는 파일(Replay Log)를 한 줄씩 읽으며 데이터를 저장한다.
리플리케이션은 Master와 Slave간의 데이터 무결성 검사(데이터가 일치하는지)를 하지 않는 비동기방식으로 데이터를 동기화한다. 이러한 구조에 의해 리플리케이션 방식은 다음과 같은 장점과 단점을 갖고 있다.
- 장점
- DB 요청의 60~80% 정도가 읽기 작업이기 때문에 Replication만으로도 충분히 성능을 높일 수 있다.
- 비동기 방식으로 운영되어 지연 시간이 거의 없다.
- 단점
- 노드들 간의 데이터 동기화가 보장되지 않아 일관성있는 데이터를 얻지 못할 수 있다.
- Master 노드가 다운되면 복구 및 대처가 까다롭다.
Clustering
클러스터링이란 여러 개의 DB를 수평적인 구조로 구축하는 방식이다. 클러스터링은 분산 환경을 구성하여 Single point of failure와 같은 문제를 해결할 수 있는 Fail Over 시스템을 구축하기 위해서 사용된다. 클러스터링은 동기 방식으로 노드들 간의 데이터를 동기화하는데, 자세한 처리 방법은 아래와 같다.
위의 그림은 MySQL의 Clustering 방식 中 Galera 방식에 대한 그림이며 자세한 처리 순서는 아래와 같다.
- 1개의 노드에 쓰기 트랜잭션이 수행되고, COMMIT을 실행한다.
- 실제 디스크에 내용을 쓰기 전에 다른 노드로 데이터의 복제를 요청한다.
- 다른 노드에서 복제 요청을 수락했다는 신호(OK)를 보내고, 디스크에 쓰기를 시작한다.
- 다른 노드로부터 신호(OK)를 받으면 실제 디스크에 데이터를 저장한다.
클러스터링은 DB들 간의 데이터 무결성 검사(데이터가 일치하는지)를 하는 동기방식으로 데이터를 동기화한다. 이러한 구조에 의해 클러스터링 방식은 다음과 같은 장점과 단점을 갖고 있다.
- 장점
- 노드들 간의 데이터를 동기화하여 항상 일관성있는 데이터를 얻을 수 있다.
- 1개의 노드가 죽어도 다른 노드가 살아 있어 시스템을 계속 장애없이 운영할 수 있다.
- 단점
- 여러 노드들 간의 데이터를 동기화하는 시간이 필요하므로 Replication에 비해 쓰기 성능이 떨어진다.
- 장애가 전파된 경우 처리가 까다로우며, 데이터 동기화에 의해 스케일링에 한계가 있다.
CAP 이론
위의 그림은 MySQL의 Clustering 방식 中 Galera 방식에 대한 그림이며 자세한 처리 순서는 아래와 같다.
- 1개의 노드에 쓰기 트랜잭션이 수행되고, COMMIT을 실행한다.
- 실제 디스크에 내용을 쓰기 전에 다른 노드로 데이터의 복제를 요청한다.
- 다른 노드에서 복제 요청을 수락했다는 신호(OK)를 보내고, 디스크에 쓰기를 시작한다.
- 다른 노드로부터 신호(OK)를 받으면 실제 디스크에 데이터를 저장한다.
클러스터링은 DB들 간의 데이터 무결성 검사(데이터가 일치하는지)를 하는 동기방식으로 데이터를 동기화한다. 이러한 구조에 의해 클러스터링 방식은 다음과 같은 장점과 단점을 갖고 있다.
[ 클러스터링(Clustering) 장점과 단점 ]
- 장점
- 노드들 간의 데이터를 동기화하여 항상 일관성있는 데이터를 얻을 수 있다.
- 1개의 노드가 죽어도 다른 노드가 살아 있어 시스템을 계속 장애없이 운영할 수 있다.
- 단점
- 여러 노드들 간의 데이터를 동기화하는 시간이 필요하므로 Replication에 비해 쓰기 성능이 떨어진다.
- 장애가 전파된 경우 처리가 까다로우며, 데이터 동기화에 의해 스케일링에 한계가 있다.
출처: https://mangkyu.tistory.com/97 [MangKyu's Diary]
분산 컴퓨팅 시스템이 보장해야 할 3가지 특징인 일관성, 가용성, 부분 결함허용 중에 분산 시스템은 2가지만 보장 가능하고, 3가지를 모두 보장하는 것은 불가능 하다는 이론.
- Consistency, Availability, Partition Tolerance
- 일관성
- 모든 사용자는 항상 동시에 같은 데이터를 조회해야 한다.
- 가용성
- 모든 사용자는 항상 read/write가 가능해야 한다.
- 몇몇 노드가 장애나도 다른 노드들이 작동해야 한다.
- 부분 결함 허용
- 물리적 네트워크 분할시에 메시지 손실이 발생해도 시스템은 잘 작동해야 한다.
참고
https://blog.yena.io/studynote/2018/10/02/DBMS-SQL.html
https://sungwoon.tistory.com/56
'CS공부 > 데이터베이스' 카테고리의 다른 글
트랜잭션(Transaction) 2(트랜잭션 관리 전략+트랜잭션 격리 수준) (0) | 2021.07.20 |
---|---|
트랜잭션(Transaction) 1(트랜잭션이란+트랜잭션 작동방식) (0) | 2021.07.20 |
SQL Injection (0) | 2021.07.17 |
SQL-JOIN (0) | 2021.07.17 |
Database의 Key (0) | 2021.07.16 |