관리 메뉴

HAMA 블로그

[DB/분산] 초보자를 위한 CAP 이론 본문

RDBMS (PostgreSQL)

[DB/분산] 초보자를 위한 CAP 이론

[하마] 이승현 (wowlsh93@gmail.com) 2016.04.29 17:35
*  CAP 은 네트워크로 분산된 DB , FileSystem, state machine (zookeeper  같은) 에서 의미를 가짐.


여담 ) 

NoSQL 이란게 유비쿼터스,클라우드,빅데이터 같은 상품명 처럼 휩쓸고 지나간 자리에는 더 이상 NoSQL 이라는 말 대신 각각 DB 들의 이름 자체로 회자되고 있습니다. "No SQL" SQL 이 아닌, "Not Only SQL" SQL 만이 아닌 등  여러 말들이 많았는데 (NewSQL 도 있고)  이제 SQL 지원은 많은 DB에서 하고 있기때문에 SQL 지원여부는 차이점이 아닌게 되버렸고, 단지 관계형이냐 아니냐 혹은 분산 지향등으로 나누다가, 이제  RDB vs No-RDB 가 아닌  A vs B vs C vs D ...등으로 각각 DB 의 개성을 인정(?) 해주는 분위기로 바뀌었습니다. 

DB 를  단지 Key-value 냐 RDB 냐 IMDB 냐에 그치지 않고 클라우드(분산)환경에서 어떤식으로 운용/서비스 되는지에 관해  촛점을 두고 바라 보는게 매우 중요해졌습니다. 이제 부터 말할 CAP 이해를 통해 DB 선택의 주요 지표로서의 역할을 재고 해보셨으면 합니다. 

* 사실 이 글 제목을 초보자님들을 위한이라고 썼지만,  사실 우리나라에 CAP 에 대해 잘 아는 개발자가 있을까 하는 생각이듭니다. (물론 저도 잘 모릅니다.) 도발적이긴 하지만 그렇다고 봅니다. 이유는 CAP 이 어려워서라기 보단 몬가 현재 분산환경과 그 이론 자체에 큰 괴리가 있어보이며,  CAP 자체의 구분 조차 명확하지 않기 때문입니다.  결국 위에 CAP 이해를 통해 DB 선택을 고려해보란 말도 어떻게 보면 '헛소리' 에 가까울수도 있습니다.  CAP 을 현재 DB 류에 1대1 매핑시키는거 자체가 어려워보이기 때문인데.. 근데 그렇게 생각한다면  이 글 왜 썼냐? 라고 묻는다면.... 잘 모르겠네요. 답이 명확하지 않은 주제라도 의미가 있지 않을까 생각하며 만약 DB 클러스터링을 선택할때 해당 제품이 말하는바와 무엇을 과대광고(high  availability!!) 하고 있구나 라는 통찰을 얻는데 도움이 되지않을까합니다.




1. 그림으로 보는  분산 모델 (기초)

             * 꿈을 이루어가는 소녀들인 도연이와 미나는 DB 하나를 같이 사용합니다. 

             *  DB 가 돌아가는 서버(노드) 가 망가져서 둘은 DB 를 사용하지 못하게 됬습니다. 

              *  DB 를 하나 더  설치해서 2개를 사용합니다. 

              *  하나의 DB 가 고장났지만, 나머지 하나를 사용 할 수 있게 되었습니다.

               *  복제본(Replica) 란  A 와 B 가 정확히 동일한 데이터를 가지고 있는것입니다.
                                 (하나가 고장나도 나머지 하나로 사용 할 수 있습니다. 데이터 안정성을 높입니다)

               *  파편본(Shard) 란  A 의 데이터중 일부를 빼서 그것을 B에 가져다 놓는것입니다.
                                    (A 에 너무 많은 데이터가 있을 경우에 B에 옮겨놓습니다. 양을 분산합니다.)

       결국 복제본과 파편본을 여러 컴퓨터에서 사용하면 데이터안정성과 데이터 크기를 분산시킬수 있게됩니다.

  * 쿼럼은 분산시스템을 관리하는녀석이라고만 생각하면 됩니다.
   * 도연이가 A  에 1000원을 더 입금하였는데,  B 에 갱신이 안되어서 미나는 2000원으로만 보입니다. 

* 미나한테도 3000원으로 보이려면 즉시 A 는 데이터를 B 에 업데이트 해야합니다.
* 이 업데이트는 LB 라는 녀석이 해줄 수 도 있고, A 랑 B 가 서로 간에 해 줄 수 도 있습니다. 개발하는 사람 맘.
* A 가 B 로 2000원을 3000원으로 업데이트하는 시간이 0 일 수는 없습니다. 그 시간동안 미나를 기다리게 해서
  미나도 3000원으로 보이게하는것을  "일관성있는 시스템이다"  라고 말합니다.
* 근데 real life 에서 미나를 기다리게 하는 시간이 너무 지나치게 된다면  "가용성" 은 떨어 진다고 봅니다.

*  B 라는 노드가 망가져도,  A 노드와 C 노드로 도연이와 미나에게 서비스 해줄 수 있습니다. "가용성 있다" 라고 합니다. 
* 쿼럼은 B 노드를 다시 re-join 시켜 줄 것입니다.
* B 가 다시 re-join 되었을때, A 와 데이터가 다를 수 있고, 그 다른  B의 데이터를 미나가 보게되면 이 시스템은     "일관성" 이 없는 시스템이라 할 수 있습니다. 


*  B 라는 노드가 망가진것이 아니라, A 와 B 를 연결해주는 네트워크가 고장났습니다. 
* A 도 작동하고, B 도 작동합니다. 다만 둘간의 커뮤니케이션이 안되기때문에 둘이 동일한 데이터를 갖기 
 힘들어졌습니다. (다른 노드를 경유해서 공유를 하면 됩니다) 
* 만약 A 와 B 가 네트워크가 분단되어서 서로 다른 데이터가 있을때 (제 3의 노드를 통해서 일관성을 유지하지 못할때)  도연이는 A 를 , 미나는 B 디비를 사용한다면 , 둘은 서로 다른 데이터를 보게 됩니다. 즉 "일관성" 이 없어지게 됩니다. 
* "일관성" 을 지키기위해서 네트워크가 복구될때까지 기다린다면 "가용성" 이 떨어지게 됩니다. 가용성이란건 정확히 규정하는게 정해져있지 않지만 , 즉시 서비스 결과를 도연이와 미나는 받을 수 있는걸 말합니다. (실패여부라도 즉시, 여기서 즉시에 해당하는 시간은 정의에 따라서 달라집니다.)


2. CAP 이론  

 
CAP 이론에 관한 블로그글이나 많은 책에서 말하는것들은 대개 비슷합니다. 이것만 가지고는 CAP이 대략 어떤건지 알게되겠지만 시원하게 이해하기는 어렵긴합니다. (함정에 빠지면 굉장히 난해함) 

먼저 이론을 소개하면 아래와 같습니다. 위에 그림으로 설명한 것과 똑같은 내용입니다.

CAP이론은 간단하게 말하면 

“분산 시스템에서는  3개 속성을 모두 가지는 것이 불가능하다!” 이다. 각 속성은 아래와 같이 3가지이다.

Consistency (일관성)

  • 우선.. CAP이론에서 말하는 Consistency는 ACID의 ‘C’가 아니다! ACID의 ‘C’는 “데이터는 항상 일관성 있는 상태를 유지해야 하고 데이터의 조작 후에도 무결성을 해치지 말아야 한다”는 속성이다.
  • CAP의 ‘C’는 “Single request/response operation sequence”의 속성을 나타낸다. 그 말은 쓰기 동작이 완료된 후 발생하는 읽기 동작은 마지막으로 쓰여진 데이터를 리턴해야 한다는 것을 의미한다.
  • 모든 노드가 같은 시간에 같은 데이터를 보여줘야 한다. (저장된 데이터까지 모두 같을 필요는 없음)

Availability (가용성)

  • 흔히 보는 단어이고 의미도 크게 혼동될 이유가 없어보인다. “특정 노드가 장애가 나도 서비스가 가능해야 한다”라는 의미를 가진다.
  • 데이터 저장소에 대한 모든 동작(read, write 등)은 항상 성공적으로 리턴되어야 한다.
  • 명확해 보이는 단어이기는 하지만 분산 시스템에서의 특징을 말하는 것이기 때문에 “서비스가 가능하다”와 “성공적으로 리턴”이라는 표현이 애매하다. 얼마동안 기다리는 것 까지를 성공적이라고 할 수 있느냐에 대한 문제가 남아있다. “20시간정도 기다렸더니 리턴이 왔어! Availability가 있는 시스템이야!”라고 할 수 없기 때문이다.
  • 다시한번 “성공적으로 리턴”에 대해서 보면 모든 동작에 대해서 시스템이 “Fail!!”이라는 리턴을 성공적으로 보내준다면 그것을 Availability가 있다고 해야 하느냐에 대해서도 애매하다. CAP를 설명하는 문서들 중 “Fail!!”이라고 리턴을 하는 경우도 “성공적인 리턴”이라고 설명하는 것을 보았다.

Partitions Tolerance (분리 내구성)

  • 원래는 Tolerance to network Partitions인데 보통은 Partition-tolerance라고도 한다.
  • 노드간에 통신 문제가 생겨서 메시지를 주고받지 못하는 상황이라도 동작해야 한다.
  • Availablity와의 차이점은 Availability는 특정 노드가 “장애”가 발생한 상황에 대한 것이고 Tolerance to network Partitions는 노드의 상태는 정상이지만 네트워크 등의 문제로 서로간의 연결이 끊어진 상황에 대한 것이다

3가지중 2개만 지원한다는것은 MySQL 을 예로 들면 MySQL 은 CA 이며  P 는 지원안한다는 겁니다.  노드가 하나 망가져도 서비스 할 수 있는데 ,  노드간에 네트워크가 장애가 발생했다고  서비스를 못해? 이게 말이 되나?    이렇게 핵깔려 할 수 도 있는데.. 이런게 함정입니다. 저도 빠졌습니다. 


보통 책이나 블로그들에선 이론 설명 후에 그림으로 현재  DB 들의 지향하는바에  대해서 보여줍니다.


위에 말했다시피  MySQL 가  CA 에 있는것에  빠지면 혼동을 겪게되는데, MySQL 은 CA 이기도 하지만 클러스터링 방법에 따라서 다양하게 변화 할수  있음을 인지하셔야합니다. 그래서 결국 각 제품의 클러스터링 전략 별로 살펴보는게 도움이 됩니다.  3 장에선  각 제품들의 CAP 특성에 대해서 조사한 결과를 나열해 보겠습니다.



3. CAP 실제  


3-1. 카산드라, 카우치DB  (AP)


  가. C가 없기때문에 카산드라는 사용자 A,B의 요청에 다른 대답을 할 가능성이 생긴다.

  나. A 가 있기때문에 카산드라는 하나의 노드에 문제가 생겨도 바로바로 리턴한다. 

      어차피 여러노드간에 데이타가 좀 달라도 상관없기때문에 (C 를 포기했으니..)

  다. P 가 있기때문에 카산드라는 네트워크가 끊어져도 , 서비스에 문제가 없다. 

      어차피 여러노드간에 데이타가 좀 달라도 상관없기도 하며 (C를 포기했으니)

      커넥션에 문제있는 노드는 제거되고, 잘되는 놈으로만 서비스한다. 


3-2. 몽고DB (CP) 


   가.  C 가 있기때문에 몽고DB 는 모든 사람에게 동일한 대답을 해주려고 해야한다.

   나.  동일한 대답을 해줘야하기때문에   A 노드와 B 노드가 같은 값을 가져야하는데 

         그러기위해 동기화 시간이 생기기 마련이다.  좀 느릴수가있다. A 가 없으니 상관없다.

   다.  P 가 있기때문에 네트워크 단절이 되도 서비스는 가능해야한다. 음 어렵네..

        네트워크 단절이되어서 일관성에 문제가 생길듯한데, 제 3의 노드를 통해서 일관성을 지킨다는 뜻인듯?

   라.  결국 A 가 없기때문에 P 네트워크 단절이 고쳐질때까지 대기타야하며, A 가 없으니깐

         대기타도 괜찮음으로 결론 -.-a 

3-3. Percona Cluster (CA)

   가.  이것은 CA 속성을 가지고 있다.
   나.  이중 커밋 프로세스에 따라 일관성을 지원한다. 
   다.  노드간 네트워크가 깨지면 일관성을 유지할수 없기때문에, 그룹 커뮤니케이션은 매우 중요하다.
   라. 온라인 쇼핑몰같은곳에 어울린다. 금액을 지불하는 고객에게 일관성 있는 서비스를 제공해야한다.

3-3. MySQL NDB  (AP)

   가.  이것은 AP 속성을 가지고 있다.
   나.  MySQL 서버들은 각각 독립노드로써 기능을 유지한다. 만약 분리된 노드간의 네트워크가 단절되었을때         데이터는 그 노드들 사이의 일관성을 유지시켜주지 못한다. 
   다.  소셜 싸이트에 어울린다. 쇼셜사이트에서는 수많은 서버들간에 네트워크가 문제가 생겼더라도 즉시 즉         시 서비스를 해야하며, 내가 올린 데이터가 상대방에게 즉시 보여질 필요보다는 서비스가 죽었다는 느낌         을 안주는게 중요하다.

3-4. Galera Cluster for MySQL (CA)

   가.  Galera 클러스터는 데이타 안정성과 일관성에 주력한다. 이 말은 클러스터 가용성(A) 과
        분리내구성(P) 사이에 트래이드오프 작용이 있다는것. 이 말은 불안정한 네트워크를 사용했을때,                   
evs.suspect_timeout  와 evs.inactive_timeout  이러한 값이 높냐? 낮냐에 따라서 오래
        지연시킴으로 해서 가용성이 악화되거나,  빠른 실패를 동반하여 네트워크 내구성을 떨어뜨릴 수           있게된다.
   
   나. '가' 에서의 주요 의미는  evs.suspect_timeout 시간을 잘못된 노드를 탐지하기 위한 최소의
        시간으로 설정하것은  일관성 제약에 기인한  클러스터의 가용성을 높힌다는 뜻이다. 

3-5. Oracle RAC    (CP)

   가.  오라클 RAC 은 일관성 및 분리내구성을 가지고 있다. 만약 SQL node 중 하나를 잃더라도 여전히 잘 동작할 것이며, 데이터를 모든 시스템에 나눌것이다.
   나. 명확하게 CP 다. 라고 말하는 문서는 못찾았음.  

3-6.  Zookeeper   (P)

   가.  엄격하게 얘기하면  디폴트로 일관성도 없고, 가용성도 없다. 단지 P
   나.  만약 옵션으로  sync를 호출하면  CP ,  read only 모드를 사용하면 AP
   다.  주키퍼 잣대로 위의 다른 DB 를 보면 대부분 C 도 아니고 A 도 아니다. 


4. CAP 논란 

https://martin.kleppmann.com/2015/05/11/please-stop-calling-databases-cp-or-ap.html
https://www.percona.com/live/mysql-conference-2013/sessions/cap-theorem-two-out-three-aint-right
https://www.quora.com/Distributed-Databases-What-are-the-best-known-exceptions-for-CAP-theorem
http://www.stucharlton.com/blog/archives/2010/10/confused-cap-arguments.html



P.S 

* 제가 분산이나 DB CAP 이론만 파온 전문가는 아니기때문에 이 글을 100% 신뢰를 하시면 아니 됩니다. 
* CAP 이론에 대한 논란은 꽤 많은거 같습니다. 위의 논란 부분을 읽는거 추천합니다.

1 Comments
댓글쓰기 폼