Couchbase CTO Ravi Mayuram이 Couchbase Server 6.5의 분산 다중 문서 ACID 트랜잭션을 발표했습니다. 적극 추천합니다. 라비의 블로그 읽기 는 Couchbase 트랜잭션이 규모, 고가용성, 성능 및 유연성을 갖춘 ACID 보증의 혁신적인 결합이라는 점을 강조합니다.
이 블로그에서는 분산된 애플리케이션에 대해 자세히 알아보겠습니다. 산 거래 기능을 제공합니다.
단순하지만 강력한 기능
먼저 Couchbase 트랜잭션을 작성하는 것이 얼마나 쉬운지 살펴보겠습니다. 트랜잭션을 열고, 몇 가지 작업을 수행하고, 다음을 사용하여 커밋(또는 실패)합니다. Atomicity, C지속성, I해결 및 D유용성. 일반 Couchbase SDK 및 API를 활용하면 기본 프로그래밍 플랫폼의 기능을 활용할 수 있습니다. 다음은 ACID 트랜잭션을 통해 한 계정에서 다른 계정으로 자금을 이체하여 기본적인 차변/입금을 보여주는 코드 스니펫입니다:
Couchbase에는 트랜잭션 프로그래밍을 원활하게 할 수 있는 많은 기능이 내장되어 있습니다:
- 자동 커밋 또는 롤백을 명시적으로 수행할 수 있는 유연성을 제공합니다.
- 네트워크 결함이나 잠금 충돌로 인한 지속 시간 지연과 같은 일시적인 오류에 대해 자동으로 재시도합니다.
- 트랜잭션에 대해 구성 가능한 기간입니다. 교착 상태는 트랜잭션 중 하나가 시간 초과되어 리소스를 해제하므로 자동으로 해결됩니다.
- 클라이언트가 충돌하는 경우 고아 트랜잭션이 자동으로 정리됩니다.
트랜잭션 Java API를 사용한 프로그래밍에 대한 빠른 튜토리얼과 다운로드 가능한 코드 샘플이 필요하면 다음을 확인하세요. 그레이엄 피플의 블로그 및 동영상.
산성 보증
카우치베이스 트랜잭션은 ACID 보증이 요구하는 원자성, 일관성, 격리 및 내구성을 제공합니다:
- 원자성 그리고 내구성 는 이진 속성으로, 가지고 있거나 가지고 있지 않습니다.
- 격리 는 장단점이 있는 스펙트럼입니다. Oracle, MySQL, SQL Server와 같이 널리 사용되는 관계형 데이터베이스는 기본 격리 수준과 최대 격리 수준을 다르게 선택합니다.
- 일관성 는 기존 ACID 대상과 분산 시스템 대상에 따라 다른 의미를 갖습니다. 전통적인 ACID 정의는 트랜잭션이 데이터베이스를 유효한 상태에서 다른 상태로 가져와야 한다고 말합니다. CAP 정리에서 비롯된 분산 시스템 정의는 각 읽기가 최신 쓰기를 수신해야 한다고 말하지만, 이는 격리 의미론과 약간 비슷하게 들릴 수 있습니다.
다음은 카우치베이스 서버 6.5의 트랜잭션이 제공하는 ACID 보장에 대한 요약입니다.
A토미티 | 서로 다른 노드의 여러 샤드에서 여러 문서를 업데이트하기 위한 전부 아니면 전무 시맨틱. |
C지속성 | 복제본은 트랜잭션 커밋과 즉시 일치합니다.
GSI, FTS, XDCR은 결국 트랜잭션 커밋과 일치합니다(N1QL은 요청_plus를 사용하여 읽기 시 강력한 일관성을 적용할 수 있습니다.) |
I솔루션 | 모든 동시 읽기에 대한 읽기 커밋 격리 - 읽기 커밋된 격리 - 트랜잭션 읽기 또는 비트랜잭션 읽기 여부에 관계없이 |
D유용성 | 데이터 보호를 위해 3단계의 내구성을 사용할 수 있습니다:
|
예, 배포됩니다.
Couchbase ACID 트랜잭션은 다중 문서 및 다중 노드이므로 아래의 단순화된 Couchbase 아키텍처 그림에서 볼 수 있듯이 실제로 분산되어 있습니다. 이 그림은 3개의 노드와 2개의 복제본(총 3개의 데이터 사본)이 있는 9개의 v버킷/샤드가 있는 간단한 Couchbase 클러스터를 보여줍니다. 트랜잭션은 두 개의 별도 노드에 있는 활성 복사본으로 두 개의 문서인 Andy와 Beth를 수정합니다. 트랜잭션이 성공적으로 완료되면 두 문서의 활성 복사본과 전체 복사본의 대부분(이 경우 활성 복사본 외에 2개의 복제본 중 하나를 의미)이 새 값으로 업데이트됩니다. 실패하면 상태가 변경되지 않고 트랜잭션 이전과 동일하게 유지됩니다.
기능 드릴다운
ACID 요약은 개괄적인 관점을 제공하지만, 다음 세부 내용은 그 의미에 대해 더 깊이 이해할 수 있도록 도와줍니다:
멀티노드, 멀티버킷, 멀티문서
하나의 트랜잭션이 여러 노드에 있는 여러 버킷의 여러 문서에 걸쳐 있을 수 있습니다. Couchbase에서 버킷은 데이터베이스에 매핑되므로, 트랜잭션은 실제로 동일한 Couchbase 클러스터에 있는 여러 데이터베이스에 걸쳐 있을 수 있습니다. 이는 버킷 간에 조인을 수행할 수 있는 Couchbase의 기능과 함께 애플리케이션에 엄청난 유연성을 제공합니다.
DCP 소비자는 커밋된 데이터만 읽을 수 있습니다.
N1QL, XDCR, 애널리틱스, 모바일, 이벤트, 커넥터 등 어떤 방식으로든 모든 읽기 작업은 커밋된 데이터만 반환합니다. 누구도 커밋되지 않은/더티 데이터를 읽을 수 없습니다. 카우치베이스 데이터 변경 프로토콜(DCP) 프로토콜은 다운스트림 소비자가 커밋되지 않은 중간 데이터를 읽을 수 없도록 보장합니다.
잠금 및 충돌 감지
동일한 문서를 업데이트하려는 트랜잭션 간의 충돌이 감지되면 그 중 하나를 롤백하고 다시 시도하는 방식으로 처리합니다(기본적으로 15초인 트랜잭션 시간 제한이 지날 때까지). 이 작업은 낙관적인 방법과 비관적 잠금 문서 수준에서.
트랜잭션에서 수정하려는 모든 문서는 트랜잭션 내부에서 먼저 읽어야 하며 모든 쓰기는 자동으로 CAS(확인 후 설정) 쓰기가 됩니다. 따라서 트랜잭션이 데이터를 읽은 후 다른 트랜잭션(또는 비트랜잭션) 쓰기에 의해 변경되는 경우, 쓰기 시점에 이 트랜잭션은 CAS 충돌을 감지하고 롤백하고 다시 시도합니다.
베스의 계좌에서 앤디의 계좌로 돈이 이체되는 위의 직불/신용 거래에서 거래가 베스의 계좌를 읽은 후 수정하기 전에 앤디의 계좌가 변경되면 거래는 이를 감지하고 롤백한 후 다시 시도합니다.
트랜잭션에서 문서가 수정되면 암시적으로 문서에 쓰기 잠금이 걸리고, 이 잠금은 트랜잭션이 종료될 때만 해제됩니다. 두 번째 트랜잭션이 이미 트랜잭션에 의해 잠긴 문서를 수정하려고 하면 후자의 트랜잭션은 쓰기 충돌을 감지하고 롤백을 수행한 후 트랜잭션 시간 초과 기간까지 재시도합니다.
위의 차변/입금의 예로 돌아가서, Beth의 계좌는 공제되었지만 Andy의 계좌는 아직 업데이트되지 않은 기내 거래가 있다고 가정해 보겠습니다. 이 시점에서 Beth의 계정 문서는 잠겨 있습니다. 따라서 베스의 계좌에서 빌의 계좌로 돈을 이체하는 다른 트랜잭션이 동시에 시도되면 베스의 쓰기 충돌이 감지되어 롤백됩니다.
동기식 내구성
카우치베이스 서버 6.5에서는 변이가 복제/지속성 기준을 충족한 후에만 독자에게 표시되도록 하고, 해당 기준을 충족하지 못할 경우 롤백할 수 있는 새로운 복제 프로토콜을 구현했습니다. 이 새로운 복제 메커니즘은 현재 젭슨 내부에서 종합적인 테스트를 거치고 있습니다. 코리건의 블로그 읽기 를 클릭해 자세히 알아보세요.
동기식 복제는 조정 가능한 내구성을 제공하여 각 쓰기에 대해 원하는 장애(노드 충돌, 디스크 장애, 단일 또는 다중 장애)에 대한 보호 수준을 선택할 수 있습니다. 3가지 수준 중에서 선택할 수 있습니다:
- 다수 - 이 내구성 수준은 쓰기가 반환되기 전에 대부분의 복제본에 전파되도록 보장합니다(예: 클러스터가 2개의 복제본으로 설정된 경우 활성의 RAM에 쓰여지고 애플리케이션에 성공을 반환하기 전에 최소 1개의 복제본에 전파됨).
- persistToActive - 이 수준은 쓰기가 RAM에서 대부분의 복제본으로 전파되고 활성 상태의 디스크에 유지된 후 애플리케이션에 성공으로 반환되도록 합니다.
- persistToMajority - 이 수준은 애플리케이션에 성공 여부를 반환하기 전에 대부분의 노드에서 디스크에 쓰기가 유지되도록 합니다.
내구성에 실패하면(시간 초과, 노드 장애 등) 쓰기가 자동으로 롤백되고 클라이언트에게 실패를 알립니다.
참고: 새로운 동기식 내구성 쓰기는 단일 문서 변경뿐만 아니라 트랜잭션에도 적용됩니다.
참고: 내구성 수준을 지정하지 않으면 비동기적으로 처리되어 결국 내구성이 떨어집니다.
트랜잭션은 새로운 동기식 복제 메커니즘 위에 계층화되며 기본적으로 내구성 수준을 '다수'. 트랜잭션별로 다른 지속 시간 수준을 선택하여 기본값을 재정의할 수 있습니다. 'persistToMajority' 는 여러 번의 장애 발생 시 가장 강력한 데이터 보호 기능을 제공합니다.
임시 버킷
임시 버킷에서도 트랜잭션과 동기식 지속성을 사용할 수 있습니다. 지속성이 필요하지 않지만 캐시의 항목이 ACID 보장을 통해 업데이트되기를 원하는 캐싱 사용 사례도 있습니다.
다음 단계
Couchbase Server 6.5의 다중 문서 ACID 트랜잭션 지원은 획기적이며 다음과 같은 새로운 사용 사례를 열어줍니다. NoSQL 애플리케이션. 거래에 필요한 추가 개선 사항에 대한 의견과 피드백을 듣고 싶습니다. 다음은 시작하는 데 도움이 되는 몇 가지 리소스입니다:
다운로드
문서
블로그
분산형 다중 문서 ACID 트랜잭션을 NoSQL에 도입한 Couchbase