728x90

NoSQL데이터 베이스에 대해서는 데이터중심어플리케이션 설계 Ch.02에서 언급되었다.

관계형데이터베이스가 지니는 단점에 대응해 등장한 데이터베이스 개념으로, NoSQL의 의미는 Not Only SQL즉 관계형데이터베이스가 아닌 데이터 베이스를 뜻한다고 보면 된다.

 

-NoSQL
2010년대에 등장하기 시작한 해당 데이터 베이스는 특정 데이터베이스를 뜻하는 것이 아니라 관계형 모델의 우위를 뒤집으려 등장한 비관계형 데이터베이스를 의미한다. 
대규모 데이터 셋이나 높은 쓰기 처리량에서 관계형데이터베이스보다 뛰어난 확장성이 필요하며, 당시 오픈소스 소프트웨어에 대한 선호도가 확산되었고 관계형 모델에서 지원하지 않는 특정 질의 언어를 지원했기 때문에 사용되기 시작했다. 

 

NoSQL를 사용하는 경우

  • 고성능의 처리량이 필요할때
  • 많은 양의 데이터를 다룰때
  • 수직적 확장이 필요할때(scale out)
  • 지연이 낮은 빠른 속도의 처리가 필요할때
  • 대표적으로 apache cassandra

 

분산데이터베이스 시스템

  • 높은 처리량을 자랑한다.
  • 다수의 머신에서 작업을 처리해서 scale out이 가능하다.
  • downtime이 거의 없다.
    -> 노드들이 작업을 하다보면 항상 성공하리란 법은 없다.
  • 만약에 다수의 머신중에서 하나의 노드가 실패해서 다운된다면, 그 곳에서 작업중인 데이터를 복사해서 다른 곳에서 동일하게 작업할 수 있도록 해야한다. 즉 모든 노드에서 데이터가 최신상태가 아닐 것이다.
    -> 결과적으로 작업이 완료된 데이터들이 일관성을 지녀야 하는데, 이를  eventual consistency 라고 한다.

간단하게 말하자면  단기적으로 일관성을 잃더라도 결국에는 일관성을 유지하는 모델
일관성을 데이터 관점으로 좁혀보면 데이터 정합성으로 이어진다. 전통적으로 관계형 데이터베이스에서는 테이블 간 데이터 정합성을 지키는 방법으로 기본 키Primary Key나 외래 키Foreign Key 같은 제약과 트랜잭션을 사용한다. 하지만 분산 환경에서는 엄격하게 제어하기 어려울뿐더러 할 수 있더라도 자원을 많이 소비한다.

데이터 변경과 이벤트 메시지 발행은 데이터베이스 트랜잭션 안에서 이루어진다. 문제는 이벤트 발행에 사용하는 메시지 브로커에는 데이터베이스 트랜잭션을 함께 사용할 수 없다는 것이다. 따라서 데이터베이스에 데이터 변경이 성공했지만 이벤트 발행에 실패하거나 혹은 이벤트 발행은 성공했지만 데이터베이스 반영은 실패한다면 서비스 간 데이터 일관성이 깨지고 만다. 

 

CAP Theorem(참고)

Network로 연결된 분산된 데이터베이스 시스템은 일관성(Consistency), 가용성(Availability),  분할 내구성(Partition Tolerance)의 3가지 특성중 2가지 특성만을 충족 할수 있고 3가지 모두 충족할 수 없다는 이론

-> 일관성

일관성을 가진다는 것은 모든 데이터를 요청할 때 응답으로 가장 최신의 변경된 데이터를 리턴 또는 실패를 리턴한다는 것. 즉, 모든 읽기에 대해서 DB노드가 항상 동일한 데이터를 가지고 있어야한다는 의미이다.

DB가 2개의 Instance를 유지하고 있다면 A에 요청하든 B에 요청하든 동일한 값이 반환됨을 의미하며, A에 update를 하든 B에 update를 했을 경우 누군가 동기화 되기전 READ를 한다면 바로 반환하는 것이 아니라 모두 동기화 후 READ가 되어야 합니다.

 

->가용성(Availability)

가용성은 모든 요청에 대해서 정상적인 응답을 한다는 것. 즉, 클러스터의 노드 일부에서 장애(Down 등)가 발생하더라도 READ와 WRITE 등의 동작은 항상 성공적으로 리턴되어야 한다.

 

-> 분할 내구성(Partition Tolerance)

분할 내구성이란 DB Node간의 통신 장애가 발생하더라도 동작해야한다는 것입니다. Instacne A와 B가 있습니다. 이때 A와 B의 Instance간의 네트워크에 장애가 발생했고, 유저는 A DB에서 쿼리를 했다. Instance A는 B의 상태를 알지 못하지만 A 자체만으로 동작한다.

가용성 VS 분할 내구성
가용성과 분할 내구성의 개념이 조금 헷갈릴 수 있다. 
가용성은 노드에서 장애가 발생하여 Down 되었을 때, 분할 내구성은 노드간의 통신이 정상적으로 이루어지지 않을 때 
Client 입장에서보면, 전자의 경우 client a와 b가 있을때 모두 동일한 장애가 나지 않는 node를 이용하지만, 후자의 경우 client 별로 바라보고 있는 node가 다를 수 있다.

 -> 카산드라와 다른 NoSQL 데이터베이스의 경우 높은 가용성과 분할 내구성을 선택하였고 이런 데이터베이스를 AP데이터베이스라고 한다. 

 

Mysql
 CA에 속한다고 되어있지만 실질적으로는 설정하기에 따라서 CP 또는 CA에 속할 수 있다.(클러스터 설정을 지원하므로 클러스터 설정을 하게 되면)
기본적으로 MySQL을 그냥 사용했을 때는 CA에 속한다. 왜나하면 main이 되는 master 노드가 있고 그 노드를 복제해서 사용하는 slave 가 있는 패러다임을 사용하기 때문이다. 이때 MySql은 가용성과 일관성을 만족하게 된다.

 

Apache Cassandra

-> 페이스북에서 처음 만들었다. 

-> 빅데이터 시대가 도래하면서 관계형 데이터베이스가 직면한 문제를 다루기 위해 등장했다.

-> 관계형 데이터 베이스를 NoSQL데이터베이스로 이관할때, 그대로 옮길 수 없고, (역정규화 작업을 통해) 데이터 모델링작업을 다시하여 데이터를 이관해야 한다.

-> RDBMS에서는 역정규화 작업 이후에 쓰기 작업의 비효율성을 걱정해야 하지만, 카산드라의 경우, 쓰기작업에 최적화 되어있어서 역정규화 작업으로 데이터 모델링을 해도 쓰기작업에 대한 지연을 걱정하지 않아도된다.

 

 

CQL : Cassandra Query Language

 

Primary Key/ Partition Key

  • 무조건 unique해야한다. 카산드라에서 중복된 값이 잇으면 안된다. 
  • 만약에 같은 PK값으로 데이터가 들어오면 에러가 발생하지 않고 데이터가 update된다.
  • 분산키로서 해싱되어서 특정 노드에 저장된다.
  • 간단하고, 두개의 칼럼이 합쳐져서 하나의 PK가 될 수 있다.
  • 한 개이상의 clustering column을 가진다.

 

-> Primary key는 partition key가 될 수 있으나, 모든 partition key가 primary key가 되는 것은 아니다.

 

 

clustering column

-> 괄호로 한번 더 감싼 year이 PK가 되고, 그 이후에 추가한 키값들은 clustering cloumn이 되어서 해당 키에 속하는 데이터들을 sorting 해서 정렬해준다. 

 

 

Where clause

-> 기본적으로 NoSQL데이터는 빅데이터를 기반으로 하므로, 쿼리를 짤때 엄청난 양의 데이터가 출력될 것을 감안해야 한다. 

-> where에 모든 PK와 clustering clomun을 모두 포함하고 난 다음에 어떠한 조건도 없는 key를 where조건에 사용할 수 있다.

-> NoSQL을 사용하는 근본적인 이유자체가 높은 처리속도와 많은 데이터를 다루기 위함이라서 이러한 경우를 잘 고려 해야한다. 

 

 

728x90

+ Recent posts