개발놀이터

NoSQL의 두 얼굴 : CP 데이터베이스와 AP 데이터베이스 본문

CS 지식/데이터베이스

NoSQL의 두 얼굴 : CP 데이터베이스와 AP 데이터베이스

마늘냄새폴폴 2025. 3. 20. 22:35

이번 포스팅에서는 CAP정리를 간단하게 복기해보고 CP, AP 데이터베이스의 특징에 대해서 정리해보도록 하겠습니다. 

 

CAP 정리

CAP 정리는 2000년에 Brewer가 발표한 이론으로서 "분산 시스템에서 C, A, P를 모두 만족하는 데이터베이스는 없다" 라는 이론입니다. 이 이론에 대한 증명이 끝났기 때문에 더이상 이론이 아니라 정리라고 불러야하는 것이죠. 

 

CAP 정리에 대해 포스팅한 것이 있어서 그걸 좀 가져와봤습니다. 

 

https://coding-review.tistory.com/312

 

CAP 정리와 한계 PACELC 정리

이번 포스팅에서는 Brewer (브루어)의 CAP정리에 대해서 알아보도록 하겠습니다. CAP정리가 20년도 더 된 정리이기 때문에 그걸 보완한 PACELC 정리에 대해서도 알아보겠습니다.  CAP에 대해서 구글링

coding-review.tistory.com

 

여기에 CAP 정리와 한계, 그리고 그것을 보완한 PACELC 정리도 함께 정리되어있으니 위의 글을 참고해주시면 좋겠습니다! 이번 포스팅에선 CAP 정리에 대한 내용보다는 CP데이터베이스, AP데이터베이스들의 종류와 특징에 대해서 다룰 예정입니다. 

 

때문에 CAP 정리에 대한 사전지식이 있다는 가정 하에 적는 글이니 그 점 참고해주시면 감사하겠습니다. 

 

CP / AP 데이터베이스

분산 데이터베이스는 기본적으로 P를 만족하고 P인 상황 즉, 장애 상황에서 C와 A를 모두 만족할 수 없습니다. 둘 중 하나를 포기해야하죠. 

 

물론 그렇다고 CP, AP로 딱딱 나눌 수는 없습니다. 왜냐하면 대표적인 CP 데이터베이스인 HBase는 장애 상황에서 A를 포기하지만 대표적인 AP 데이터베이스인 Cassandra는 장애 상황이던 아니던 C를 포기하도록 되어있기 때문이죠. 

 

그래서 제가 앞으로 표현할 CP, AP 데이터베이스는 편의상 그렇게 부르는 것이니 이 점 또한 참고해주시면 감사하겠습니다. 

 

CP 데이터베이스

CP 데이터베이스는 장애 상황에서 A 즉, 가용성을 포기한 데이터베이스 모델입니다. 가용성을 포기한다는 말은 장애 상황에서 동작하지 않는 노드들도 존재한다는 말이고 그만큼 C (일관성) 를 중요하게 생각한다는 뜻입니다. 

 

그런 의미에서 모든 데이터베이스는 상태를 가지고 있지만 굳이 따지자면 조금 더 stateful 한 쪽으로 기울어져 있는 데이터베이스들입니다. 

 

이제 앞으로 CP 데이터베이스들을 소개하겠지만 CP 데이터베이스들은 앞서 언급했다시피 일관성을 위한 상태를 더 소중히 (?) 생각하는 데이터베이스들입니다. 각 데이터베이스들이 왜 장애상황에서 어찌보면 데이터베이스의 중요한 덕목 중 하나인 A를 포기하게 되었는지 이해하게 되실겁니다. 

 

AP 데이터베이스

AP 데이터베이스들은 장애 상황에서 C 즉, 일관성을 포기한 데이터베이스 모델입니다. 일관성을 포기한다는 말은 장애 상황에서 데이터의 정합성이 깨지는 상황이 존재한다는 것이고 그만큼 A (가용성) 를 중요하게 생각한다는 뜻입니다. 

 

CP 데이터베이스와는 다르게 그런 의미에서 stateless에 조금 더 가깝다고 할 수 있는 데이터베이스들입니다. 

 

CP 데이터베이스와 마찬가지로 앞으로 소개할 AP 데이터베이스를 보면 이 친구들이 데이터베이스에서 중요한 덕목 중 하나인 C를 포기하게 되었는지 이해하게 되실겁니다. 

 

CP 데이터베이스

CP 데이터베이스들의 중요한 특징은 장애 상황에서 C, 일관성을 중요하게 생각하는 데이터베이스들입니다. 그래서 이 CP 데이터베이스를 보실 때 "아, 가용성보다는 일관성이 더 중요한 서비스에서 잘 어울리겠구나" 하는 마음으로 봐주시면 좋을 것 같습니다. 

 

MongoDB

MongoDB는 대표적인 CP 데이터베이스입니다. 보통 MongoDB가 여러군데에서 쓰이지만 주로 웹 애플리케이션의 데이터베이스로서 사용되기 때문에 그런건가? 싶은 생각이 들었습니다. 

 

MongoDB가 NoSQL의 사파같은 느낌이라 RDBMS에서 제공해주는 다양한 개념들을 차용하는만큼 일관성을 중요하게 생각하고 있습니다. 그 중에서도 트랜잭션을 지원하는 몇 안되는 NoSQL이니만큼 확장성이 매우 중요하고 원자성이 어느정도 보장되는 애플리케이션에서 주로 사용됩니다. 

 

HBase

HBase는 HDFS위에서 동작하는 데이터베이스로 NoSQL에선 꽤 흔한 컬럼형 데이터베이스이고 각 Row에는 키만 가지고 있는 형태를 띄고 있습니다. 

 

때문에 키가 새롭게 삽입되면 데이터베이스 노드에 해당하는 Region이 늘어나게 되고 어느정도 늘어나면 오토 샤딩이 되어 Region Server의 관리를 받게 됩니다. 

 

또 HBase의 특징이라면 Column Family라는 개념을 가지고 있는데 이것이 물리적으로 데이터들을 가까운곳에 위치시켜서 같은 Column Family인 경우 I / O 성능을 대폭 향상시키고 있습니다. 

 

레플리케이션과 샤딩에 능해 주로 빅데이터 분석에 사용되는 데이터베이스입니다. 

 

저는 빅데이터..? 라고 했을 때 곧 바로 떠오르는 것이 "가용성은 별로 중요하지 않겠는데..?" 였습니다. 

 

빅데이터를 담아야하는데 서비스가 안정적으로 돌아가야하는 것이 아니고 오히려 일관성이 매우 중요해지기 때문이죠. 데이터를 분석하려면 일관적이긴 해야하니까요. 

 

ZooKeeper

ZooKeeper는 우리가 흔히 생각하는 데이터베이스라고 부르기엔 애매하지만 그래도 Elasticsearch와 같이 NoSQL로 분류되고 그렇게 불려지고 있으니 넣어봤습니다. 

 

ZooKeeper는 서비스 디스커버리라고도 불리는데 우리가 사용하는 애플리케이션의 상태를 지속적으로 체크하고 알려주는 역할로 자주 쓰입니다. 위에서 언급한 HBase와 같은 재단인 Apache 재단에서 만든 서비스여서 HBase는 기본적으로 ZooKeeper가 내장되어있죠. 

 

ZooKeeper는 이런 특징 때문에 가용성보단 일관성이 더 중요해졌습니다. 서비스 하나하나의 상태를 보관하고 있어야하고 안정적으로 ZooKeeper가 동작하는 것도 중요하지만 네트워크 파티션 상황 (장애 상황) 에서 이런 서비스들의 상태를 일관적으로 보관해야하기 때문이죠. 

 

 

대표적인 CP 데이터베이스 세개를 정리해봤는데 이 세개의 데이터베이스가 가용성이 필요없는 경우도 있었고 가용성보단 일관성이 더 중요한 경우도 있었습니다. 물론 MongoDB처럼 애매한 경우가 있긴 했지만 MongoDB 개발진들이 A를 포기하도록 선택했다는 것이니까 나름의 이유가 있었겠죠. 

 

다음으로 살펴볼 데이터베이스들은 AP입니다. 이전 CP와 다른 관전 포인트는 C가 필요없거나 C보단 A가 더 중요하거나 이런 경우에 사용되겠구나 하고 봐주시면 좋을 것 같습니다. 

 

AP 데이터베이스

Cassandra

Cassandra는 대표적인 AP 데이터베이스로 이 친구는 장애 상황이던 정상 상황이던 C를 포기하는 상남자식 데이터베이스입니다. 이렇게 선택하게 된 배경에는 Cassandra의 정신나간 가용성을 보면 좋을 것 같은데요. 

 

Cassandra는 수평 확장으로 P2P를 선택했습니다. 이게 무슨말이냐하면 복제를 하지 않고 어느 노드에 붙더라도 전혀 다른 데이터베이스처럼 사용할 수 있다는 것입니다. 

 

엄청난 트레이드오프인데 일관성이란 개나줘버린 이런 데이터베이스를 어디에 쓸까요? 

 

특징을 떠올려보면 

  1. 확장성이 매우 중요하다
  2. 일관성이 필요없다

바로 SNS입니다. 

 

SNS에서는 일관성이란게 딱히 필요가 없고 대신 엄청난 확장성이 필요한 애플리케이션입니다. 왜냐하면 내 피드에 뜨는 게시글이랑 다른 사람 피드에 뜨는 게시글이 달라도 전혀 문제되지 않고 오히려 같은게 이상한 상황입니다. 

 

또한, SNS에선 업로드되는 그 엄청난 수의 게시글과 댓글들을 생각해보면 확장성이 매우 중요하다고 볼 수 있죠. 

 

DynamoDB

DynamoDB는 AWS에서 제공해주는 Key-Value 데이터베이스입니다. 이 친구는 이해하는데 어렵지 않은게 클라우드에서 운영된다는게 핵심입니다. 

 

클라우드에서 제공해주는 서비스들을 보면 하나같이 가용성에 미쳐있습니다. 서비스가 다운되는 꼴을 못보죠. 

 

AWS만 하더라도 ASG, EKS, Lambda, SQS, SNS 그리고 각종 데이터베이스들 (Elasticache, Aurora, DynamoDB) 이 친구들 가용성에 목숨을 건 친구들이죠. 

 

그래서 일관성은 잠시 버려두고 돌아가는 것이 핵심인 데이터베이스입니다. 

 

 

대표적인 AP 데이터베이스인 Cassandra와 DynamoDB를 소개해드렸는데요. 이 친구들 역시 앞에서 예상했던대로 C가 딱히 필요없거나 C보단 A가 더 중요했습니다. 

 

만약 NoSQL을 선택할 때 우리 서비스가 어떤 것에 초점을 두었는지 잘 고려하면서 선택하시면 좋을 것 같습니다. 

 

마치며

이렇게 대표적인 CP 데이터베이스와 AP 데이터베이스를 소개했습니다. 제가 데이터베이스 카테고리의 포스팅을 작성할 때 너무 RDBMS에 치우쳐져있다고 생각해서 이번 기회에 NoSQL에 대해서 좀 공부를 해보려고합니다. 

 

일단은 개요정도만 공부했는데 실습도 해보면서 샤딩도 직접 해보고 어떤 부분이 RDBMS와 다르고 어떻게 운용하는게 좋은지 생각해보면서 공부해보면 좋은 시간이 될 것 같습니다. 

 

오늘 포스팅은 여기서 마치도록 하겠습니다. 오늘도 즐거운 하루 되세요~