우리가 사는 세상은 결코 완벽하지 않습니다. 우리는 끊임없이 딜레마, 때로는 삼위선에 빠져 거래를 해야 합니다. 쇼핑할 때 우리는 '저렴함', '빠르게', '좋음' 중 두 가지만 선택할 수 있습니다. 경제학에서 정부는 '주권 통화정책', '고정환율', '자유자본 흐름'을 동시에 누릴 수 없습니다. 정부는 세 번째 것을 포기함으로써 두 가지를 달성할 수 있습니다. 마찬가지로, CAP(일관성, 가용성, 분할 허용 범위) 정리는 분산 컴퓨팅이 대규모 계산의 인기 솔루션이 된 이후 컴퓨터 과학자와 소프트웨어 엔지니어들을 괴롭혀온 똑같이 이해하기 어려운 삼레마를 포함합니다. 오늘은 CAP 정리를 깊이 파고들어 우리의 필요에 따라 현명한 절충을 하는 방법을 배울 것입니다.

CAP 정리
먼저, CAP 정리에 언급된 삼레마부터 시작해 보겠습니다. CAP는 일관성, 가용성, 분할 허용성을 의미합니다. CAP 정리는 분산 시스템이 네트워크 분할 상황에서 이 세 가지 특성 중 두 가지만 보장할 수 있다고 말합니다. 다음으로, CAP 정리의 맥락에서 일관성, 가용성, 분할 허용성을 정의하겠습니다.
일관성
분산 시스템이 일관적이라면, 모든 읽기 요청은 가장 최근의 쓰기 또는 오류를 받습니다. 즉, 일관성 있게 어떤 노드 사용자가 읽기 요청을 하든 항상 분산 시스템에 기록된 가장 최신 데이터를 받거나, 최신 데이터가 현재 사용 가능하지 않을 경우 오류가 발생합니다.
이용 가능성
가용성이란 모든 요청이 반드시 가장 최근의 쓰기 내용을 포함하지 않는 비오류 응답을 받는다는 것을 의미합니다. 다시 말해, 가용성 상태에서는 사용자가 항상 요청한 데이터를 받지만, 그 데이터가 오래되었을 수 있습니다.
분할 허용
분할을 허용하는 분산 시스템은 노드 간에 네트워크가 임의의 수의 메시지를 드롭하거나 지연시켜도 계속 작동합니다. 즉, 파티션 허용 범위 덕분에 일부 노드가 서로 메시지를 보낼 수 없더라도 시스템은 계속 작동합니다.
네트워크 분할이 일어날 때 왜 세 가지 모두를 동시에 달성하지 못하냐고 궁금할 분도 있을 것입니다. Seth Gilbert와 Nancy Lynch가 발표한 잘 설명된 개념 증명을 찾을 수 있지만, 비컴퓨터 과학자들이 이해하기 어렵고 다소 복잡할 수 있습니다. 따라서 간단한 예시와 함께 더 짧은 증명을 제시하겠습니다.

다음과 같은 가정을 해봅시다: 1. 노드 A와 노드 B로 구성된 분산 시스템이 있습니다. 2. 네트워크 장애로 인해 이 두 노드는 서로 메시지를 받을 수 없으며, 분산 시스템이 서로 소통할 수 없는 두 부분으로 분할되었습니다. 3. 가장 최근의 쓰기는 노드 A에 저장됩니다. 4. 노드 B는 노드 A로부터 메시지를 받을 수 없으므로 노드 B는 최신 데이터를 포함하지 않습니다.
이제 이 시스템이 나머지 두 가지 특성을 달성했음에도 불구하고 왜 이 세 가지 특성을 모두 보장할 수 없는지 살펴보겠습니다.
일관성 + 가용성
분산 시스템이 일관되고 사용 가능하다면, 시스템이 실행 중일 때 모든 읽기 요청은 가장 최근 데이터를 포함하는 비오류 응답을 받습니다. 하지만 노드 B가 최신 데이터를 제공할 수 없기 때문에 이를 달성할 수 없습니다. 따라서 분산 시스템의 운영 시간 동안 일관성과 가용성을 보장하기 위해 일시적으로 시스템을 종료해야 하며, 이는 파티션 허용 범위를 희생해야 합니다.
일관성 + 분할 허용 오차
이 조합을 통해 시스템은 계속 실행되어야 하며, 읽기 요청에 응답하여 최신 데이터를 전송하거나, 최신 데이터가 없을 때 오류를 전송해야 합니다. 노드 B가 최신 쓰기를 받지 못했기 때문에, 시스템이 일관성을 유지하도록 오류를 디스패치해야 합니다. 따라서 이 시나리오에서는 노드 B가 비오류 메시지를 보내야 하는 가용성을 보장할 수 없습니다.
가용성 + 파티션 허용 오차
이 시나리오에서는 시스템이 항상 작동을 중단할 수 없습니다. 또한, 읽기 요청에 대해 오류가 없는 메시지로 응답해야 합니다. 가장 최근의 쓰기는 노드 B에서 접근 가능하지 않으므로, 읽기 요청에 응답하여 오래된 데이터를 전송할 수밖에 없으며, 이는 일관성 요구를 위반하는 것입니다.
일관성, 가용성, 파티션 허용 시 중 선택하는 팁
이제 일관성, 가용성, 파티션 허용 범위를 동시에 달성하는 것이 불가능하다는 것을 입증했으니, 이 세 가지 바람직한 특성 중 어떻게 선택할지 논의하겠습니다. 우리는 일반적으로 다음과 같은 이유로 분산 시스템이 네트워크 파티셔닝을 허용하도록 요구해야 합니다: 1) 네트워크 파티셔닝이 어디에나 보편적이며, 2) 사용자가 처리되지 않은 요청에 혼란스러워하지 않도록 네트워크 파티셔닝이 있어도 분산 시스템이 계속 작동하도록 해야 합니다.
파티션 허용 오용이 필수이기 때문에, 결국 일관성과 가용성 사이의 간단한 선택으로 귀결됩니다. 경험상 사용자가 항상 가장 정확한 데이터를 받아야 할 때는 가용성보다 일관성을 선택하는 것이 좋습니다. 일관성과 파티션 허용도를 목표로 하는 좋은 예로는 은행이나 증권거래소 같은 금융기관을 위해 만들어진 애플리케이션이 있습니다.
반면, 우리는 데이터 정확성을 위해 좋은 사용자 경험을 포기하지 않으려 할 때, 일관성보다 가용성을 선호하는 경우가 많습니다. 소셜 미디어 플랫폼과 게임은 일반적으로 가용성과 파티션 허용성을 목표로 하는 시스템의 좋은 예가 될 수 있습니다.
이 글에서는 CAP 정리가 명시하는 내용을 다루고 일관성, 가용성, 분할 허용 범위의 정의를 보여드렸습니다. 그 후 일관성, 가용성, 분할 허용 범위의 삼위일체가 왜 달성할 수 없는지 자세히 설명했습니다. 마지막으로, 이 삼위일체에서 현명한 의사결정을 내리는 방법에 대한 몇 가지 팁을 제공했습니다. 이 글이 CAP 정리에 대해 더 많은 통찰을 얻고 시스템 설계 시 의사결정에 적용하는 방법에 도움이 되었기를 바랍니다.
다가오는 기사에서는 CAP 정리의 보다 포괄적인 버전인 PACELC 정리에 대해 논의할 예정입니다. 계속 지켜봐 주세요!