SQL 의 CAP 이론과 NoSQL 의 BASE

CAP 이론

분산 시스템 설계에 많이 인용되는 CAP 이론은 UC Berkeley 의 Eric Brewer 교수님이 제안한 개념이다. 분산 시스템 설계니 당연히 한 대의 서버로 이루어진 시스템이 아니라 여러 서버로 이루어진 시스템을 가정하는데, Consistency, Availability, Partition Tolerance 라는 세 가지 속성의 약자를 따서 CAP 라고 이름이지어진 이 개념은 Partition tolerance 한 시스템을 구현하기 위해서는 Consistency 나 Availability 둘 다를 얻을 수 없음을 의미한다. 좀 더 쉽게 말하면 C, A, P 이 세 속성 중에 기껏해야 두 개 밖에 취할 수 없다는 뜻이다.

여기서 Consistency 는 다른 서버에서도 가장 최근에 쓰여진 데이터가 읽혀야 됨을 의미한다. 예를 들어 A 와 B 라는 서버가 분산 시스템을 구성하고 있다면, A 라는 서버에 데이터를 쓰면 그 바로 뒤에 B 서버에서 누군가 그 데이터를 읽어들일 때 가장 최근의 데이터를 읽을 수 있어야 됨을 뜻한다.

Availability 는 보낸 요청에 대해서는 응답을 줄 수 있어야 됨을 의미한다. 그 응답이 가장 최근의 응답이 되었든, 아니면 살짝 이전의 데이터가 되었든말이다. 이 자체로는 너무 쉽고 당연한 것 같지만, 시스템이 “가장 최근의 데이터만을 줘야된다” 라는 제약이 붙게 되면, 가장 최근인지 아닌지 판단을 할 수 없는 경우 응답을 보내지 못할 수도 있게 된다는 점을 기억하자.

Partition tolerance 는 서버간의 통신에서 설령 네트워크가 끊긴 수준의 오류가 있더라도 시스템이 동작해야됨을 의미한다.

.

RDBMS 와 ACID 속성

RDBMS 는 Relational Database Management System 의 약자이다. 우리가 보통 DB 라고 말하는 것은 원칙적으로 DBMS 를 의미한다. 그러니 RDBMS 도 보통 RDB 라는 이름으로 부르기도 한다. R에 해당하는 Relation(al) 은 “데이터를 테이블 형태” 로 관리함을 의미한다. SQL 서버들이 테이블을 만들고 그 안에 데이터를 저장하는 것을 기억하는가? SQL 쿼리 문도 “CREATE TABLE …” 로 시작한다. 바로 SQL 이 RDB 이기 때문이다. 우리가 일반적으로 사용하는 DB 들은 이 RDB 형태들이다.

전통적인 RDB 에서는 Network Partition 을 크게 고려하지 않았다. DB 는 같은 데이터센터 안에, 심지어 같은 랙에 존재하고 있고 그 때문에 서버간 통신은 굉장히 잘 관리가 되는 안정적인 상황이었기 때문이다.

대신 RDB 에서는 ACID 라는 속성을 중요하게 생각해왔다. Atomicity, Consistency, Isolation, Durability 의 약자를 모아서 단어를 만든 것이다.

Atomicity 는 관련된 작업들은 전부 반영되거나 아니면 하나도 반영이 안되거나 해야된다는 것을 의미한다. “All or nothing” 인데, 쉽게 생각해서 우리가 SQL 에 transaction 을 만들면 그 안의 작업들이 모두 다같이 반영되어야 되는 것을 생각해보면 이해가 쉬울 것이다.

Consistency 는 CAP 의 consistency 와는 약간 다르다. CAP 에서는 서로 다른 서버라 하더라도 가장 최근 데이터를 반환함을 의미하지만, 여기서 consistency 는 DB 의 상태가 늘 일관된 상태를 유지해야됨을 의미한다. 예를 들어 DB 데이터의 속성이나 테이블 내 제약 등이 지정되어있는 경우 이를 준수하는 상황이 계속 일관되게 이어져야 된다는 것이다.

Isolation 은 여러 작업이 실행되더라도 그것이 순차적으로 실행된 것과 같은 결과를 내야됨을 의미한다. 만일 두 작업이 겹치는 것이 아예 없다면 이는 전혀 상관없이 동시에 실행될 수 있어야 되고, 만일 겹치는 부분이 있으면 순서대로 처리가 되어야지 겹쳐서 처리되어 데이터가 이상한 상태가 되어서는 안된다는 것을 뜻한다.

Durability 는 일단 작업이 완료 되었다고 리포팅이 되었다면 그게 DB 에 영구적으로 반영이 되어야 함을 의미한다. 설령 DB 가 크래쉬 하더라도 말이다.

.

NoSQL 등장의 배경

앞서 언급한 것처럼 DB 에서는 Partition 의 상황보다는 ACID 를 훨씬 중요한 가치로 생각을 하고 그쪽으로 많은 연구들이 이루어졌다. 그러나 구글이나 아마존, 페이스북 등 인터넷 회사들의 경우 데이터 센터가 여러곳에 분산되는 것이 일반적이다. 그런데 DB 는 한 곳에서만 가져다가 써야된다고 하면 이는 성능상의 큰 병목이 될 것이다. 그때문에 DB 역시 여러곳에 분산을 해야되는 상황이 되었고, 이 때문에 partition tolerance 를 중요한 가치로 인식하게 되었다.

앞에서 Partition tolerance 를 취하면 consistency 나 availability 둘 중 하나 밖에 취할 수 없다고 말을 했다. 그런데 실제 상황에서 consistency 가 그렇게까지 강하게 요구되지 않는 경우들이 많다는 것을 알게 됐다. 구글 검색을 했는데, 방금 crawler 가 긁어온 최신의 데이터를 꼭 보여줘야될 필요는 없지 않은가. 친구가 facebook 에 글을 쓰고 1-2초 지나서 내 화면에 뜬다고 문제가 될 건 없는 경우 등도 마찬가지다.

그래서 consistency 를 좀 약하게 보장하고 대신 시스템의  availability 를 좀 더 보장하는 방법들이 소개 되기 시작했다. 이 때 나온 개념이 eventual consistency 이다. 어느 한쪽이 데이터를 쓰더라도 다른쪽이 가장 최근의 데이터가 아니라 그 전의 데이터를 볼 수 있음을 의미한다. 이렇게 되면 “요청에 응답을 보내야 한다” 라는 availability 기준이 “이전 데이터라도” 보낼 수 있게 되니 크게 향상될 수 있다.

기존에 데이터를 쓰면 다음에 데이터를 읽는 쪽에서는 가장 최근의 데이터를 받아야 된다는 것은 이와 대비해서 strong consistency 라는 표현을 쓴다.  그리고 이런 속성의 DB 는 strong consistency 의 RDB 와는 사뭇 다르다. 그래서 기존의 SQL 과 다른 DB 로 NoSQL 이라는 이름을 얻게 되었다.

이런 속성으로 SQL 의 ACID 에 대응하는 NoSQL 의 주요 속성으로 BASE 를 이야기 한다. Basically Available, Soft-state, Eventual consistency 의 약자를 딴 것이다.

.

게임에서의 SQL 과 NoSQL 의 적용

NoSQL 이 처음 소개되었을 때에는 그것이 새로운 개념이다보니 기존 SQL 을 대체하는 우월한 개념처럼 잘못 인식되곤 했다. 하지만 SQL 과 NoSQL 은 가정하는 상황이 완전히 다른 별개의 솔루션들이다. 풀어야 되는 문제가 다르면 다른 솔루션을 적용해야되는 것처럼, SQL 과 NoSQL 역시 필요에 따라 다르게 사용하는 것이 바람직하다.

앞서 설명한 것처럼 SQL 은 strong consistency 를 보장한다. 그 때문에 consistency 가 중요한 상황에서는 SQL 이 더 적합하다. 그 때문에 많은 경우에 유저 데이터를 SQL 에 저장하는 것이다.

NoSQL 은 partition tolerance 와 availability 가 중요한 상황에서 유용하다. 디비가 먼 지역에 분산되어있고, 반드시 최신 데이터를 보여주지 않아도 되는 경우에 유용할 수 있다. 아니면 적어도 몇초 나 몇분 단위로 싱크만 맞아도 되는 경우라면 적합하다. 이런 이유로 많은 경우에 로그데이터를 NoSQL 에 저장하기도 한다.

이번 컬럼에서는 SQL 과 NoSQL 이 어떤 이유로 나오게 되었고 각각 어떤 것을 중요하게 생각하는지를 설명했다. 어떤 경우도 만능의 솔루션은 없다. 한 선택에 의한 트레이드 오프는 필연적이라고 할 수 있다. 각 솔루션의 배경에 맞게 적절하게 사용하는 것이 무엇보다 중요하다.

아이펀팩토리 문대경 대표

답글 남기기

댓글을 게시하려면 다음의 방법 중 하나를 사용하여 로그인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중