데이터베이스_NoSQL

황호준·2023년 6월 15일

CS

목록 보기
22/29
post-thumbnail

NoSQL

NoSQL의 개념

  • 관계형 데이터베이스 이외의 형식으로(비관계형 모델) 데이터를 저장하는 데이터베이스로, NoSQL에서는 데이터를 행과 열이 아닌, 체계적인 방식으로 저장한다.

NoSQL의 종류

1. Key-Value 데이터베이스

  • Key-Value 쌍으로 나타나는 데이터를 배열 형태로 저장
  • key는 속성이름, value는 데이터 값 (Redis, DynamoDB...)

2. 문서형 데이터베이스

  • 데이터를 문서형태로 저장한다.
  • 사용이 번거롭고 쿼리가 SQL과는 다르다.
  • JSON, XML과 같은 Collection 데이터 모델 구조를 채택함 (MongoDB...)

3. Wide-Column 스토어

  • 각 열에는 key-value 형식으로 데이터 저장되고, column family라고 하는 열의 집합체단위로 데이터를 처리할 수 있음
  • 각 행이 동일한 열을 가질 필요 없으므로 RBD에 비해 뛰어난 유연성 제공 (Cassandra,HBase...)

4. 그래프 데이터베이스

  • 그래프와 비슷한 형식으로 데이터 관계를 구성
  • node와 edge 와 함께 그래프 구조를 사용하여 데이터를 저장함. (Neo4J, InfiniteGraph...)

RDB VS NoSQL

RDBMS

  • 장점
    • RDBMS는 위에서 설명을 하였듯이 정해진 스키마에 따라 데이터를 저장하여야 하므로 명확한 데이터 구조를 보장하고 있습니다.
    • 또한 관계는 각 데이터를 중복없이 한 번만 저장할 수 있습니다.
  • 단점
    • 테이블간테이블 간 관계를 맺고 있어 시스템이 커질 경우 JOIN문이 많은 복잡한 쿼리가 만들어질 수 있습니다.
    • 성능 향상을 위해서는 서버의 성능을 향상 시켜야하는 Scale-up만을 지원합니다. 이로 인해 비용이 기하급수적으로 늘어날 수 있습니다.
    • 스키마로 인해 데이터가 유연하지 못합니다. 나중에 스키마가 변경 될 경우 번거롭고 어렵습니다.

NoSQL

  • 장점
    • NoSQL에서는 스키마가 없기 때문에 유연하며 자유로운 데이터 구조를 가질 수 있습니다. 언제든 저장된 데이터를 조정하고 새로운 필드를 추가할 수 있습니다.
    • 데이터 분산이 용이하며 성능 향상을 위한 Saclue-up 뿐만이 아닌 Scale-out 또한 가능합니다.
  • 단점
    • 데이터 중복이 발생할 수 있으며 중복된 데이터가 변경 될 경우 수정을 모든 컬렉션에서 수행을 해야 합니다.
    • 스키마가 존재하지 않기에 명확한 데이터 구조를 보장하지 않으며 데이터 구조 결정가 어려울 수 있습니다.

사용처

  • RDBMS
    데이터 구조가 명확하며 변경 될 여지가 없으며 명확한 스키마가 중요한 경우 사용하는 것이 좋습니다. 또한 중복된 데이터가 없어(데이터 무결성) 변경이 용이하기 때문에 관계를 맺고 있는 데이터가 자주 변경이 이루어지는 시스템에 적합합니다.
  • NoSQL
    정확한 데이터 구조를 알 수 없고 데이터가 변경/확장이 될 수 있는 경우에 사용하는 것이 좋습니다. 또한 단점에서도 명확하듯이 데이터 중복이 발생할 수 있으며 중복된 데이터가 변경될 시에는 모든 컬렉션에서 수정을 해야 합니다. 이러한 특징들을 기반으로 Update가 많이 이루어지지 않는 시스템이 좋으며 또한 Scale-out이 가능하다는 장점을 활용해 막대한 데이터를 저장해야 해서 Database를 Scale-Out를 해야 되는 시스템에 적합합니다.

Redis

개념

  • Redis : REmote DIctionary Server
  • Key-Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈소스 기반의 NoSQL DBMS
  • 사용에 따라 데이터베이스로 사용될 수도 있고, Message Queue, Shared Memory 용도로 사용될 수 있음. 주로 Cache Server로 사용.

특징과 장점

  • Key, Value 구조이기 때문에 쿼리를 사용할 필요가 없음
    • 고정되지 않은 스키마를 가지므로 키마다 원하는 내용만 저장 가능
  • In-Memory 데이터베이스
    • 매우 빠름
    • 서버 재시작 시 모든 데이터 유실
    • 복제 기능이 있지만 사람의 실수에는 복원 불가
    • 백업이 필요할 수 있음 (persist option 지원)
  • 다양한 자료구조를 제공
    • String, List, Hash, Set, Sorted Set, Stream 등
    • 사용 용이, 개발 편의성 증대
    • application 단에서 필요한 로직을 DB 단에서 줄일 수 있음
    • list형 데이터 입력/삭제가 MySQL에 비해 10배 빠름
  • Single Thread로 동작
    • 한 번에 여러 클라이언트의 요청을 수행할 수 없음
    • 때문에 여러 요청이 동시에 돌아가지는 않지만 빠르게 처리해 동시성을 보장하려고 노력하고 경쟁상태를 방지(원자적 연산 수행)
    • 한 클라이언트가 오래 걸리는 작업을 요청하면 장애가 발생할 수 있음
  • 여러 대의 서버 구성 가능 (Master-Slave)
  • Database, Cache, Message broker로 사용됨
    • Cache로 사용 시 무조건 TTL로 사용. 시간 중요
  • 읽기 성능 증대를 위한 서버 측 리플리케이션을 지원
  • 쓰기 성능 증대를 위한 클라이언트 측 샤딩 지원

데이터베이스를 두고 Redis를 사용하는 이유는 데이터베이스는 물리디스크에 직접 write 작업이 이루어지기 때문에 데이터가 손실되지 않는 장점이 있지만, 사용자가 많아질 수록 디스크의 부하가 발생하게 된다. 이에 따라 한번 읽어온 데이터를 인 메모리 DB인 Redis에 캐싱하여 데이터 조회 작업을 빠르게 하여 서비스의 속도를 향상시켜줄 수 있다.

※ 인메모리

  • 컴퓨터의 주 기억장치(메인메모리)인 RAM에 데이터를 올려서 사용하는 방법.
    하드디스크(SSD, HDD)보다 수백배 이상 빠름. but, 휘발성 메모리
    업로드중..

주 활용 방식

  • 여러 서버에서 같은 데이터를 공유가 필요할 때
    • 한대에서만 필요하면 전역변수 쓰면 되지 않나? → X
    • Redis 자체가 Atomic하기때문에 Thread safe 하고 Single Thread 이기 때문에 Race Condition 발생 가능성이 낮음
  • 인증 토큰 등을 저장 (Strings or hash)
  • Ranking 보드로 사용 ( Sorted Set )
  • 유저 API Limit
  • Job QUeue
profile
기록 블로그

0개의 댓글