요약
- 12장. 데이터 시스템의 미래의 나머지 부분에 대해 이해함.
- 정확성을 목표로
- 제약 조건 강제하기
- 유일성 제약 조건은 합의가 필요하다
- 로그 기반 메시징의 유일성
- 다중 파티션 요청 처리
- 적시성과 무결성
- 데이터플로 시스템의 정확성
- 느슨하게 해석되는 제약 조건
- 코디네이션 회피 데이터 시스템
메모
제약 조건 강제하기
유일성 제약 조건은 합의가 필요하다
- 분산 설정에서 유일성 제약 조건을 강제하려면 합의가 필요함.
- 동일한 요청이 동시에 여러 개 존재할 경우, 시스템은 충돌하는 연산 중 하나를 수용하고 나머지를 제약 조건 위반으로 거부해야 함.
- 이러한 합의를 달성하는 표준적인 방법은 특정 노드를 리더로 지정하고 해당 노드가 모든 결정을 내리는 것임.
- 이 방법은 모든 요청이 단일 노드로 집중되는 것을 문제삼지 않고, 리더 노드에 장애가 발생하지 않는 한 잘 작동함.
- 리더 노드가 실패하는 경우, 다시 합의 문제로 돌아가야 함.
- 유일성 검사는 유일성이 필요한 값을 기준으로 파티셔닝하면 확장 가능함.
- 예를 들어, 요청 ID의 유일성을 보장하려면 같은 요청 ID를 사용하는 모든 요청을 같은 파티션으로 라우팅할 수 있음.
- 하지만, 비동기 다중 마스터 복제는 적용할 수 없음.
- 서로 다른 마스터에서 동시에 충돌하는 쓰기를 받아들일 수 있기 때문에 값의 유일성을 보장할 수 없음.
- 제약 조건을 위반하면 어떤 쓰기도 즉시 거부하기를 원한다면 동기식 코디네이션을 피할 수 없음.
로그 기반 메시징의 유일성
- 로그 기반 메시징은 모든 소비자가 동일한 순서로 메시지를 보도록 보장함.
- 이를 전체 순서 브로드캐스트라 부르며, 이는 합의와 동일한 개념임.
- 로그 기반 메시징을 사용하는 언번들링 데이터베이스 접근법에서 유일성 제약 조건을 강제하기 위해 비슷한 접근법을 사용할 수 있음.
- 스트림 처리자는 단일 스레드에서 한 로그 파티션의 모든 메시지를 순차적으로 소비함.
- 유일성이 필요한 값을 기준으로 로그를 파티셔닝하면 스트림 처리자는 충돌이 발생한 연산 중 어떤 것이 처음 들어온 연산인지 명확하게 판단할 수 있음.
- 사용자명 요청을 예로 들면, 모든 사용자명 요청은 메시지로 인코딩되어 사용자명의 해시값으로 결정된 파티션에 추가됨.
- 스트림 처리자는 로그에서 요청을 연속해서 읽고 로컬 데이터베이스를 이용해 어떤 사용자명을 사용했는지 추적함.
- 이러한 접근법은 유일성 제약 조건뿐만 아니라 다른 많은 제약 조건에도 사용할 수 있음.
- 이 접근법의 핵심 원칙은 충돌이 발생할 수 있는 쓰기를 모두 같은 파티션으로 라우팅하고 순서대로 처리하는 것임.
다중 파티션 요청 처리
- 다중 파티션 요청 처리는 원자적 연산을 보장하는 데 중요함.
- 요청 ID, 받는 사람 계좌, 보내는 사람 계좌를 포함하는 세 가지 파티션이 모두 독립적임.
- 데이터베이스의 전통적인 접근법에서는 원자적 커밋이 필요하지만, 파티셔닝된 로그를 사용하면 동등한 정확성을 달성할 수 있음.
- 클라이언트가 송금 요청을 하면 요청 ID를 발급받아 특정 로그 파티션에 추가됨.
- 스트림 처리자는 요청 로그를 읽어 보내는 사람 계좌에서의 출금 지시와 받는 사람 계좌로의 입금 지시를 출력 스트림으로 방출함.
- 원 요청 ID가 포함됨.
- 후속 처리자는 출금과 입금 지시 스트림을 소비하여 요청 ID로 중복을 제거하고 변경 내용을 계좌 잔고에 반영함.
- 스트림 처리자에 장애가 발생하면 이전 체크포인트에서 처리를 재개함.
- 중복 처리로 인한 입금과 출금 지시의 중복 생산 가능성이 있지만, 결정적인 요청으로 인해 중복을 쉽게 제거할 수 있음.
- 보내는 사람 계좌에서 중복 인출을 방지하기 위해 추가적인 스트림 처리자를 사용할 수 있음.
- 이 처리자는 계좌 잔고를 유지하고 트랜잭션 유효성을 검증함.
- 다중 파티션 트랜잭션을 서로 다르게 파티셔닝된 두 단계로 나누고 종단 간 요청 ID를 사용하면 원자적 커밋 프로토콜 없이도 동일한 정확성 속성을 달성할 수 있음.
- 서로 다르게 파티셔닝된 다중 단계를 사용하는 개념은 다중 파티션 데이터 처리와 비슷함.
적시성과 무결성
- 트랜잭션의 선형성을 이용하면 커밋이 완료된 후 해당 쓰기가 모든 독자에게 보여지도록 할 수 있음.
- 이는 로그 기반 메시징에서 유일성을 확인하는 데 사용되는 기법과 유사하다.
- 일관성에는 적시성과 무결성이라는 두 가지 요소가 있다.
- 적시성은 사용자가 시스템을 항상 최신 상태로 볼 수 있음을 의미함.
- 만약 사용자가 뒤처진 데이터를 읽는다면, 일관성이 없는 상태의 데이터를 관측하게 될 수 있음.
- 하지만 이는 일시적인 상태이므로, 기다리면 해결될 수 있음.
- 무결성은 데이터에 누락이나 모순, 오류가 없음을 의미함.
- 특히 파생 데이터셋이 기반 데이터를 정확하게 반영해야 함.
- 무결성이 위반되면 이는 영원히 지속되므로, 명시적인 검사와 수리가 필요함.
- 일관성에 대한 오해 중 하나는 무결성이 적시성보다 중요하지 않다는 것임.
- 적시성 위반이 혼란을 야기할 수는 있지만, 무결성 위반이 결국 파국을 초래함.
- 예를 들어 신용카드 결제 내역이 24시간 이내에 보이지 않는 것은 놀랍지 않지만, 잔고가 거래 합계와 일치하지 않거나 결제가 상인에게 지불되지 않는 것은 매우 큰 문제임.
데이터플로 시스템의 정확성
- ACID 트랜잭션은 적시성과 무결성을 모두 보장하지만, 이벤트 기반 데이터플로 시스템은 이 두 가지를 분리함.
- 비동기 처리 시 소비자가 메시지 도착을 기다리지 않으므로 적시성은 보장되지 않음.
- 하지만 무결성이 스트림 시스템의 핵심이며, 정확히 한 번이나 결과적으로 한 번 시맨틱은 무결성을 보존하는 메커니즘임.
- 무결성을 지키는 데 중요한 기능은 내결함성 메시지 전달과 중복 억제(ex: 멱등 연산)임.
- 이벤트가 유실되거나 이벤트의 효과가 중복되면 데이터 시스템의 무결성을 위반할 수 있음.
- 신뢰성 있는 스트림 처리 시스템은 분산 트랜잭션과 원자적 커밋 프로토콜 없이 무결성을 보존할 수 있음.
- 이는 더 좋은 성능과 운영적 견고함을 줄 수 있음을 의미함.
- 이 무결성은 쓰기 연산을 단일 메시지로 표현, 결정적 파생 함수 사용, 클라이언트가 생성한 요청 ID 전달, 메시지를 불변으로 만들고 재처리 등의 메커니즘을 통해 달성할 수 있음.
- 이러한 메커니즘의 조합은 미래의 내결함성 애플리케이션 구축에 유망한 방향이라고 볼 수 있음.
느슨하게 해석되는 제약 조건
- 유일성 제약 조건은 합의가 필요하며, 이는 모든 이벤트를 단일 노드를 통해 특정 파티션으로 보내 처리하는 방식으로 구현됨.
- 스트림 처리 역시 비슷한 제한 사항을 가지고 있음.
- 그러나 많은 애플리케이션에서는 이 제한을 완화된 유일성 개념을 통해 피할 수 있음.
- 제약 조건을 일시적으로 위반하고 나중에 사과하는 방법은 많은 비즈니스 맥락에서 실제로 수용 가능함.
- 이를 통해 데이터를 쓰기 전에 모든 제약 조건을 검사하는 전통적인 모델은 불필요하게 제한적일 수 있으며, 이러한 경우 선형적 제약 조건도 필요하지 않음.
- 낙관적으로 쓰기를 즉시 하고 사후에 제약 조건을 검사하는 방법은 합리적인 선택일 수 있음.
- 복구 비용이 비싼 일은 여전히 수행 전에 유효성 검증을 보장할 수 있음.
- 그러나 이러한 상황 때문에 데이터를 쓰기 전에는 꼭 유효성 검사를 해야 한다는 뜻은 아님.
- 이러한 애플리케이션은 무결성을 반드시 요구함.
- 예약을 놓치거나 입금액과 출금액이 일치하지 않아 돈이 사라지는 것을 원하지는 않을 것임.
- 그러나 제약 조건을 강제하는 상황에서도 적시성은 반드시 필요한 것은 아님.
- 재고보다 많은 상품을 팔았다면 사후에 사과를 하고 문제를 해결할 수 있음.
코디네이션 회피 데이터 시스템
- 다음의 두 가지 흥미로운 점을 관찰할 수 있음.
- 데이터플로 시스템은 원자적 커밋, 선형성, 파티션에 걸친 동기 코디네이션 없이도 파생 데이터에 대한 무결성 보장이 가능함.
- 엄격한 유일성 제약 조건은 적시성과 코디네이션을 필요로 하지만, 많은 애플리케이션에서는 느슨한 제약 조건을 사용하면서도 전체적인 무결성을 유지할 수 있음.
- 일시적인 제약 조건 위반도 이후에 수정이 가능함.
- 즉, 데이터플로 시스템은 코디네이션 없이도 많은 애플리케이션용 데이터 관리 서비스를 제공하며, 무결성을 강력하게 보장함.
- 이러한 코디네이션 회피 데이터 시스템은 성능이 좋고, 내결함성이 높음.
- 데이터 시스템은 여러 데이터 센터에 분산해 운영하고, 비동기로 지역 간 복제가 가능함.
- 각 데이터 센터는 다른 데이터 센터와 독립적으로 운영할 수 있음.
- 지역 간 동기식 코디네이션은 필요 없음.
- 그러나 적시성은 약하게 보장하며, 선형성은 코디네이션을 도입하지 않는 한 없음.
- 그럼에도 불구하고 무결성은 강력하게 보장됨.
- 직렬성 트랜잭션은 파생 상태를 유지하는 데 부분적으로만 유용함.
- 그러나 잘 작동하는 작은 범위에서는 충분히 실행 가능함.
- 이종 분산 트랜잭션은 필요하지 않음.
- 동기식 코디네이션은 필요한 곳에 도입할 수 있음.
- 그러나 애플리케이션의 작은 부분에서만 코디네이션이 필요하다면, 모든 곳에서 코디네이션 비용을 지불할 필요는 없음.
- 코디네이션과 제약 조건은 불일치 때문에 해야하는 사과의 수를 줄임.
- 그러나 이들은 시스템의 성능과 가용성을 줄일 수 있고, 따라서 중단 때문에 해야하는 사과의 수를 늘릴 수 있음.
- 최상의 트레이드오프를 찾는 것이 목표임.
- 즉, 너무 많은 불일치나 가용성 문제가 없는 최적의 장소를 찾는 것이 목표임.
댓글