공유의 문제점
공유는 고 가용성, 성능, 확장성을 저해하는 주요 요인 중 하나이다.
예를 들어, 다양한 파티션이 독립적인 오류 모드를 가질 수 있으므로 파티셔닝을 통해 공유를 줄여 시스템의 전체 가용성을 높일 수 있다. 그리고 단일 데이터 항목을 볼 땐 복제를 통해 공유를 늘려 가용성을 높일 수 있다.
공유 줄이기
공유를 줄이는 것은 적절하게 적용하면 매우 유익할 수 있다. 일부 시스템 아키텍처는 모든 요청이 시스템의 단일 노드 또는 단일 노드 그룹에 의해 독립적으로 처리될 수 있도록 조정과 경합을 줄이기 위해 이 원칙을 극단적으로 따른다. 이를 일반적으로 비공유 아키텍처라고 합니다.
시스템의 상태 저장과 상태 비저장 부분 분해
공유를 줄이기 위해 기본적이고 널리 사용되는 기술은 시스템의 상태 저장 부분과 상태 비저장 부분을 분해하는 것 이다.
이것의 주요 이점은 시스템의 무상태 부분이 완전히 대칭적이고 동질적인 경향이 있다는 것 이다. 즉, 무상태 애플리케이션의 모든 인스턴스가 나머지 부분과 구별되지 않는다는 것을 의미한다. 이들을 분리하면 확장이 훨씬 쉬워지게 된다.
상태 저장 시스템 관리
상태 저장 시스템은 시스템의 다양한 노드가 동일하지 않기 때문에 관리하기가 더 어렵다.
각 노드에는 요청을 시스템의 적절한 부분으로 보내기 위한 적절한 라우팅을 수행하기 위한 다양한 데이터 조각이 포함되어 있습니다. 이 상태는 고가용성이 필요한 경우 공유를 완전히 제거하지 못하게 하는 긴장감을 조성한다.
균형을 유지하기 위해 분할 과 복제 의 조합이 사용됩니다. 공유를 줄이고 독립성과 결함 격리를 생성하기 위해 데이터가 분할되지만, 모든 파티션은 내결함성이 있도록 여러 노드에 걸쳐 복제된다.
비 공유 시스템의 이익
비공유 아키텍처는 성능 및 내결함성 측면에서 더 많은 이점을 제공하며 확장성과 가용성을 보장한다.
확장성
애플리케이션의 모든 계층은 부하에 따라 점진적으로 확장되거나 축소될 수 있다. 또한 상태 비저장 구성 요소에서는 데이터 전송이 덜 필요하므로 확장성을 더 쉽고 빠르게 달성할 수 있습니다 .
가용성
시스템은 단일 노드 및 다중 노드 오류에 대한 복원력을 갖추고 있다.
보다 구체적으로, 이러한 두 가지 다른 형태의 오류는 유사한 방식으로 시스템의 상태 비저장 부분에 영향을 미치게 된다. 예를 들어 나머지 노드는 더 큰 로드를 처리해야 하거나 더 많은 서버를 프로비저닝해야 할 수 있다.
아키텍처의 상태 저장 부분 의 경우 단일 및 다중 노드 오류의 동작이 약간 다르다.
- 각 파티션은 대다수의 노드가 정상인 한 완전한 기능을 유지할 수 있는 합의 기반 복제 기술을 사용할 수 있으므로 단일 노드 오류를 처리하기가 훨씬 쉽다.
- 다중 노드 장애는 대다수에 영향을 미쳐 파티션을 사용할 수 없게 만들 수 있다.
파티셔닝이 가능한 문제 지원
비 공유 아키텍처는 세분화된 파티셔닝이 필요한 문제에 적합한 경향이 있다.
이 분야에 대한 대표적인 예로는 아래와 같다.
- 사용자 세션 관리
- 카탈로그 제품 관리
두 경우 모두 데이터 액세스 작업이 단일 데이터 항목에 액세스해야 하는 방식으로 데이터를 쉽게 분할할 수 있다.
- 세션에는 고유 식별자가 할당될 수 있으며 이 속성으로 세션을 분할할 수 있다.
- 제품은 유사한 제품 식별자에 따라 분할될 수 있다.
동시성 제어
파티션 범위에는 일종의 제한된 동시성 제어를 위한 공간도 있다.
단일 항목 액세스가 일반적인 경우, 일반적인 기술은 낙관적 동시성 제어를 사용하여 오버헤드와 경합을 줄이는 것이다. 이는 모든 데이터 항목에 버전 속성을 포함함으로써 달성된다. 모든 작성자는 쓰기 전에 읽기를 수행하여 현재 버전을 찾은 다음 업데이트가 완료되기 위한 조건으로 업데이트에 현재 버전을 포함시킨다.
이를 위해서는 조건부 업데이트를 지원하는 해당 데이터 저장소가 필요하다. 동시 작성자가 그 동안 동일한 항목을 업데이트한 경우 첫 번째 작성자는 초기 쓰기가 여전히 적용되어야 하는지 확인하기 위해 새 읽기를 수행하여 중단하고 다시 시작해야 하며, 그렇다면 다시 시도해야 한다.
비공유 아키텍처의 단점
가장 큰 단점은 유연성이 감소 한다는 것이다. 애플리케이션이 새로운 데이터 액세스 패턴에 효율적으로 액세스해야 하는 경우 시스템의 데이터가 특정 방식으로 분할되어 있으므로 이를 제공하기 어려울 수 있다.
예를 들어, 분할 키가 아닌 보조 속성으로 쿼리를 시도하려면 시스템의 모든 노드에 대한 액세스가 필요할 수 있다. 이러한 유연성 감소는 강력한 트랜잭션 의미 체계의 부족으로 나타날 수도 있다.
강력한 격리를 통해 여러 항목 읽기를 수행하거나 단일 원자성 트랜잭션에서 여러 항목을 작성해야 하는 애플리케이션은 이러한 아키텍처 형식에서는 이 작업을 수행하지 못할 수 있다. 과도한 추가 오버헤드가 발생하는 경우에만 가능할 수도 있다.
참고