원문: https://www.cockroachlabs.com/blog/limits-of-the-cap-theorem
Written by Ben Darnell on Jun 27, 2017
CAP 이론은 분산 시스템 이론의 중요한 부분입니다. 분할(네트워크 장애) 상황에 빠진다면 시스템은 일관성과 가용성을 동시에 유지할 수 없으며 둘 중 하나를 선택해야 합니다.
CockroachDB는 일관성을 선택했습니다. CAP 이론에 의하면 CP시스템(가용성을 일관성보다 중요시하는 AP시스템의 반대)입니다. 일관성과 가용성은 둘 다 비즈니스에 매우 중요한데, 이 중요한 목표 중 하나를 어떻게 선택해야 할까요?
이 글에서는 CAP-일관성 시스템이 높은 가용성을 유지하며 사용하는 방법, CAP 이론이 CockroachDB에 적용되는 방식, 대부분의 데이터베이스에게 일관성이 더 중요한 이유를 이야기하겠습니다.
고가용성
CAP 이론은 가용성을 엄격하게 정의합니다. 시스템은 CAP-가용성을 가지거나 가지지 못합니다. 하지만 고가용성이나 서비스 수준 규약에서는 “가용성” 또한 사용되며 이것은 흑백구분이 아닌 연속성을 의미할 수 있습니다.
시스템은 99.99%의 시간(연간 다운타임이 1시간 미만)을 사용할 수 있도록 보장할 수 있습니다. 100% 가용성은 일반적으로 비현실적이며 고가용성을 위한 엔지니어링의 경우 다양한 종류의 서비스 중단 가능성과 그 대응에 대한 비용 사이의 균형을 예측해야 합니다.
CAP-일관성 시스템은 네트워크 분할로 인해 시스템을 사용할 수 없는 상황이 생깁니다. 그러나 CAP-가용성 시스템에도 어떤 이유로든 사용할 수 없는 경우가 생깁니다. 잘 동작하는 네트워크에서는 CAP 트레이드오프 중 한 종류의 운영중단이 다른 종류보다 더 일반적이라고 생각되지 않습니다.
Dr.Brewer는 구글의 네트워크 파티션이 너무 드물기 때문에 Spanner 데이터베이스는 기술적으로 CP이지만 효율적으로 CA라고 말했습니다. 이것은 혼란스러운 주제를 더 어지럽게 하지만, CAP 이론이 의미하는 가용성 손실은 매우 제한된 환경에서만 중요하다는 것을 보여줍니다.
올바른 트레이드오프 만들기
분산시스템 엔지니어링은 일관성, 가용성, 성능 및 유연성을 비롯한 다양한 고려사항 사이의 트레이드오프로 가득합니다. CAP 이론은 일관성과 가용성 사이의 좁은 트레이드오프에 초점을 맞추고 있지만 이것이 모든 문제와 가용불가의 해결책이 되지는 않습니다.
장애는 CAP 정리가 고려하지 않는 단일 노드 하드웨어 장애, 애플리케이션 버그, 운영 실수 등의 다양한 요인에 의해 발생할 수 있습니다. 또한 전체 시스템을 고려하면 네트워크 분할은 일관성을 해치지 않으면서 가용성을 높일 수 있습니다. CAP-가용성을 선택했을 때 가용성의 증가는 미미하지만, 일관성 상실은 애플리케이션 코드에 상당한 복잡성을 일으키고 엔지니어링에 높은 비용을 요구합니다.
예를 들어 세 데이터 센터에 분산된 애플리케이션을 생각해보십시오. 이러한 데이터 센터 중 하나가 네트워크 장애로 중단되면 중단된 데이터센터로 직접 접근하는 클라이언트는 CAP-일관성, CAP-가용성과 관계없이 중단됩니다. 또 로드벨런서가 가용한 데이터 센터로 트래픽을 전송하도록(자동화에 의해) 변경하게 되면 분할을 처리하는 방식에 관계없이 서비스가 복원됩니다.
CAP-가용성만 가용하고 CAP-일관성이 가용하지 않은 유일한 경우는 데이터센터가 다른 레플리카와 통신할 수 없고, 클라이언트와는 통신할 수 있으며, 로드밸런서가 트래픽을 계속 전달할 때입니다. 또 전체 시스템을 고려한다면 CAP 이론의 요구사항을 만족하지 않더라도 단일 분할 노드의 고가용성을 유지할 수 있습니다.
CAP-가용성 시스템의 가용성 증가가 적은데, CAP-일관성을 포기해야 할 이유가 있습니까? 쓰기 지연시간은 이유가 될 수 있습니다. 일관성 시스템은 쓰기 중에 서로 다른 노드 간에 조정을 통해 일관성을 제공합니다(시스템에 따라 일관성 읽기가 비용을 높일 수도 있음). 일관성이 없는 시스템에서는 데이터가 손실될 가능성을 가지고 더 빠르게 응답을 제공합니다. 속도가 일관성보다 더 중요한 애플리케이션에서는 적합한 선택입니다.
CockroachDB에서의 CAP
CockroachDB는 CAP-일관성 시스템입니다. 각 데이터는 최소 3개의 레플리카에 있으며, 쓰기를 수행하려면 레플리카간 통신이 가능해야 합니다. 읽기의 경우 하나의 레플리카가 리스를 만들어 수 초간 통신없이 사용할 수 있습니다. 리스 소유자가 다른 레플리카와 떨어질 경우, 리스가 만료될 때(기본값 9초)까지 읽기를 계속할 수 있습니다. 그런 다음 나머지 두 레플리카 중 하나가 새 리스를 받습니다(첫 번째 레플리카의 리스가 만료된 후). 이것으로 시스템은 중단에서 빠르게 복구되어 CAP 이론의 극단적인 가용성을 대한 정의를 충족하지 않지만, 가용성이 극대화됩니다.
CockroachDB의 강력한 일관성에 대한 기반은 고전적인 SQL을 보장하면서 고가용성인 분산형 데이터베이스를 제공해줍니다. 일관성이 없다면 애플리케이션 개발자는 데이터가 손실된 보조인덱스 또는 복제되지 않은 레코드 등의 예상외의 작동방식을 마주할 수밖에 없고, 노드에 장애가 있을 때 데이터 손실을 고려하며 작업해야 합니다.
대부분 애플리케이션에서 CockroachDB와 같은 CAP-일관성 데이터베이스가 개발자에게 아래의 간단한 규칙을 제공하기때문에 응답이 느려질 가능성이 있더라도 더 좋은 선택입니다.
- 쓰기는 완료된 후에 읽기가 가능합니다(단일 레지스터 선형성).
- 다른 개발자의 쓰기 설정으로 일관성을 손상할 수 없습니다.
- 분할이 발생하면 일관성 없는 데이터를 반환하지 않고 시스템이 차단됩니다.