NoSQL

DevMon·2024년 10월 11일

1) NoSQL이란?

Not Only SQL로 SQL'만'을 사용하지 않는 DBMS.
관계형 데이터베이스를 사용하지 않는다는 의미가 아니라, 여러 유형의 데이터베이스를 사용하는 비관계형 데이터베이스 프로그래밍언어.

특징

  • 테이블, 칼럼과 같은 스키마를 가지지 않는다.
  • 대규모 확대가 가능하도록 수평적 확장성을 가져 대규모 데이터를 유연하게 처리.
  • 집합-지향(Aggregate-oriented)모델을 사용한 분산환경으로, 지연과 처리율이 우수(처리속도 빠름).
  • 데이터 베이스의 다양한 저장소 사용 가능.
  • Scale-out 구조(서버를 여러 대 추가해 시스템을 확장).
  • Read/Write 성능이 뛰어남.
  • 빅데이터 처리에 특화됨.

2) NoSQL특징

1. 비일관성
NoSQL은 RDBMS와 다르게 ACID를 충족하지 않는다.

* ACID : 데이터베이스 트랜젝션이 안전하게 수행된다는 것을 보장하기 위한 성질로 원자성, 일관성, 격리성(=독립성), 지속성(=영속성)의 4가지 특성을 한 글자씩 따서 ACID라고 부른다.

2. 분산저장
NoSQL은 수평적 확장을 바탕으로, 대량의 데이터와 컴퓨팅 부하처리를 가능하게 만들었다.

NoSQL은 효율적 데이터 처리를 위해 장비의 성능을 향상할 때, 수평적 확장(Scale-out)을 따른다.

RDBMS는 수직적 확장(Scale-up)을 사용하는데 데이터와 트래픽이 늘어날수록 수직적 확장의 비용은 기하급수적으로 증가한다.

3. Schema-less
NoSQL은 스키마 없이 동작한다. 데이터 구조를 정의할 필요가 없기 때문에 비형식적인 데이터를 저장하는데 용이하다.

데이터베이스가 스키마를 직접 관리하지 않을 뿐, 데이터 타입에 따른 암묵적인 스키마는 존재한다.

3) NoSQL 장단점

1. 장점

  • 스키마가 없기 때문에 유연하다.
  • 데이터를 읽는 속도가 빠르다.
  • ORM프레임워크가 필요하지 않다.

2. 단점

  • 데이터 중복이 존재한다.
  • 데이터를 분산저장하기 때문에, 수정 시 모든 영역의 데이터를 수정해야 한다.

4) NoSQL 종류

  • Key-value: Redis, Memcached, AWS DynamoDB
  • Document: MongoDB, CouchDB
  • Graph: Neo4J
  • Column Family: Cassandra, Hbase

5) NoSQL 데이터 베이스 정리

1. Redis

Redis란?

key, value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터 베이스 관리 시스템.

Redis 특징

  • Key, Value구조이기 때문에 쿼리를 사용할 필요 없음.
  • 데이터를 디스크에 쓰는 구조가 아니고 메모리에서 데이터를 처리하기 때문에 속도가 빠름.
  • String, Lists, Sets, Sorted Sets, Hashes 자료 구조를 지원.
    String : 가장 일반적인 Key-Value 구조의 형태.
    Sets : String의 집합. 여러 개의 값을 하나의 Value에 넣을 수 있음. 포스트의 태깅 같은 곳에 사용할 수 있음.
    Sorted Sets : 중복된 데이터를 담지 않는 Set구조에 정렬 Sort를 적용한 구조로 랭킹 보드 서버 같은 구현에 사용할 수 있음.
    Lists : Array형식의 데이터 구조. List를 사용하면 처음과 끝에 데이터를 넣고 빼는 건 빠르지만 중간에 데이터를 삽입, 삭제하는 것은 어렵다.
  • Single Threaded로 한 번에 하나의 명령만 처리할 수 있다. 중간에 처리 시간이 긴 명령어가 들어오면 그 뒤의 명령어는 앞의 명령어가 처리될 때까지 대기.

Redis 자료 구조

1. Replication 아키텍처 : Master와 Replica로 구성

  • 단순한 복제 연결 시 사용한다. (relicaof 커맨드 이용)
  • 비동기식 복제 (복제가 잘 됐는지 확인하지 않음)
  • HA(고가용성) 기능이 없으므로 장애 상황 시 수동으로 복구한다.
    장애 상황 시 스프링에서 새로운 Redis 서버의 연결 정보를 변경 해주어야 함.

2. Sentinel 아키텍처 : Sentinel, Master, Replica로 구성, 자동 Failover가 가능한 HA(High Availability) 구성

레디스 센티넬은 레디스 서버들(Master, Replica)을 관리한다. 센티넬은 주기적으로 레디스 서버들을 모니터링한다. 마스터 서버가 서비스할 수 없는 상태가 되면 다른 레플리카를 마스터 서버로 변경한다.

  • Sentinel 노드가 Redis 마스터와 레플리카 노드를 감시
  • Master가 비정상 상태일 때 자동으로 Failover(자동 복구)
  • 애플리케이션은 Sentinel과 연결하기 때문에, 장애 상황 발생 시 연결 정보 변경 필요 없음
  • Sentinel 노드도 장애 상황이 발생할 수 있기 때문에 반드시 3대 이상의 홀수로 존재해야 함.
    • 과반수 이상의 Sentinel이 동의(Quorum based)가 있어야 Failover 진행
    • 많은 리소스가 필요하므로 Sentinel과 Master 혹은 Replica를 같은 서버에 올려 사용하기도 함.

3. Cluster 아키텍처 : 레디스 3.0 버전 이후부터 제공, 클러스터에 포함된 노드들이 서로 통신하는 구조

레디스 클러스터는 클러스터에 포함된 노드들이 서로 통신하면서 HA를 유지한다. 거기에 샤딩 기능까지 기본 기능으로 사용할 수 있다. 클러스터 내부에는 센티넬과 동일하게 마스터와 레플리카는 짝을 이루어 데이터를 복제한다. 클러스터 내부의 모든 노드는 모두 서로 연결되어 있는 메시(Mesh) 구조로 되어 있으며, 가십 프로토콜(gossip protocol)을 사용하여 서로 모니터링 한다.

  • 센티넬과 동일하게 Master와 Replica는 짝을 이루어 데이터를 복제.
  • 클러스터를 구성하기 위해 세 개의 마스터 노드는 반드시 필요.
  • 레플리카 노드의 개수는 0개 혹은 그 이상으로 설정 가능.
    • 고가용성을 위해 반드시 한 개 이상의 레플리카를 설정하는 것이 좋음.
  • 데이터를 마스터 노드들에 샤딩.
    • 해시 함수를 사용하여 데이터 분배, 데이터의 키 값을 해시 함수로 넘긴 후 리턴 값을 사용하여 어떤 노드에 저장할지 결정한다. * 리턴 값은 항상 0 ~ 16383 값을 리턴
    • 클러스터에 노드를 추가하거나 제거할 경우 레디스 명령어를 사용하여 해시 함수 값 범위를 조정 가능
  • 리밸런싱(Rebalancing) & 리샤딩(Re-shard)
    • 조정된 범위에 포함되는 레디스 데이터들은 자동으로 재분배되어 설정된 위치로 이동한다.
  • 애플리케이션은 레디스 클러스터의 노드 중 하나라도 연결되면 클러스터의 전체 상태 정보를 확인 가능
    • 장애 상황 발생 또는 노드 확장(Scale out) 시 애플리케이션의 Redis 서버 연결 정보 변경 필요 X

데이터 베이스가 있는데도 Redis라는 인메모리 데이터 구조 저장소를 사용하는 이유는?

일반적인 데이터 베이스는 물리 디스크에 직접 쓰기 때문에 서버에 문제가 발생해도 데이터가 손실되지 않음. 그러나 매번 디스크에 접근해야 하기 때문에 사용자가 많아질수록 부하가 커짐. 규모가 작은 시스템에서는 WEB-WAS-DB의 구조로도 데이터 베이스에 무리가 가지 않지만 사용자가 많아지면 캐시 서버를 도입해야 하는데 캐시 서버로 사용할 수 있는 것이 바로 Redis.

Redis 사용 시 주의할 점

  • 서버에 장애가 발생했을 경우 그에 대한 운영 플랜이 필요함.
  • 메모리 관리가 중요함.
  • 싱글 스레드 특성상, 처리가 오래 걸리는 명령어는 피해야 함.
  • 이 외에도 Master-Slave 형식의 데이터 이중화 구조에 대한 Redis Replication, 분산 처리를 위한 Redis cluster, 장애 복구 시스템 Redis Sentinel, Redis Topology, Redis Sharding, Redis Failover 등의 Redis를 더 효율적으로 사용하기 위한 개념들이 존재함.

2. HBase

HBase란?

HDFS으로 구현한 컬림 기반 분산 NoSQL '데이터저장소'로 여러 가지의 NoSQL중 Column-Family model에 속한다. 구글의 BigTable을 기반으로 설계되었으며, HDFS위에서 동작한다.
비정형/반정형 대량 데이터에 대한 분석 처리 지원에 적합하며, 강력한 일관성을 보장한다.

  • 용도 : 이벤트 로깅, 대규모 SNS서비스의 주 스토리지(페이스북, 라인)

HBase 특징

  • 선형 확장성을 가짐
  • 읽기와 쓰기의 일관성 제공
  • Hadoop 시스템과 연계하기 편리 source와 destination으로 사용 가능
  • 클러스터를 통한 데이터 복제로 장애 극복(fail over)가능

HBase 장단점

  • HBase의 장점
  1. 대용량의 데이터를 안정적으로 다루는데 효과적
    중앙의 전체 분산 시스템을 통제하는 마스터를 두고 전체 데이터의 일관성을 관리하여 복제 데이터 사이의 일관성을 보장
  2. 대량의 데이터 분석 처리 지원에 적합
    HDFS, mapreduce등과 함께 사용하기에 최적화
  3. region 서버를 추가하면 확장 및 성능을 유지할 수 있음
  • HBase의 단점
  1. 특정 region 서버에 특정 table의 region이 집중되기 쉬워 성능저하로 이어질 수 있음.
  2. 적절한 세팅을 위한 조건자료가 있으나 클러스터 규모나 기본 스팩차이가 있어 적용이 힘들 수 있음

1) 확장성 : 요구에 맞게 시스템을 확장하는 기능으로 하드웨어를 추가하거나 기존 하드웨어를 업그레이드 하여 시스템을 확장할 수 있는 것

2) Bloom필터 : 1970년도에 Burton H.Bloom이 고안한 것으로 공간 효율적인 probabilistic data structure로 구성요소가 집합의 구성원인지 점검하는데 사용. HBase에서는 HFile안에 row와 column이 존재하는지 검사하기 위한 용도로 사용

HBase 구조

  • Master Server: RegionSever의 모니터링 및 정보 관리. 클라이언트의 읽기/쓰기 요청 처리. 리전 서버에 리전 할당.

  • Region Server: 수평 확장의 기본 단위. Region서버마다 n개의 Region을 가질 수 있으며, 하나의 Region은 일정 크기 이상 커지면 분리된다. 실제 데이터 저장을 담당하는 서버.

  • Region: 정렬된 데이터를 저장한 큰 테이블을 정렬키 범위로 나눈 것. 자신이 속한 테이블, 첫번째 로우, 마지막 로우로 정의된다.

  • Zookeeper: 클러스터 코디네이터. 활성화된 region과 master서버들과 연결되어 하트비트를 통해서 각 서버의 상태를 관리한다. hbase:meta 카탈로그 테이블(리전 정보 메타 테이블) 위치 관리.

profile
기술 블로그

0개의 댓글