책너두 (데이터 중심 애플리케이션 설계) 46일차 (~526p)

요약

  • 12장. 데이터 시스템의 미래의 나머지 부분에 대해 이해함.
    • 정확성을 목표로
      • 제약 조건 강제하기
        • 유일성 제약 조건은 합의가 필요하다
        • 로그 기반 메시징의 유일성
        • 다중 파티션 요청 처리
      • 적시성과 무결성
        • 데이터플로 시스템의 정확성
        • 느슨하게 해석되는 제약 조건
        • 코디네이션 회피 데이터 시스템

메모

제약 조건 강제하기

유일성 제약 조건은 합의가 필요하다

  • 분산 설정에서 유일성 제약 조건을 강제하려면 합의가 필요함.
    • 동일한 요청이 동시에 여러 개 존재할 경우, 시스템은 충돌하는 연산 중 하나를 수용하고 나머지를 제약 조건 위반으로 거부해야 함.
  • 이러한 합의를 달성하는 표준적인 방법은 특정 노드를 리더로 지정하고 해당 노드가 모든 결정을 내리는 것임.
    • 이 방법은 모든 요청이 단일 노드로 집중되는 것을 문제삼지 않고, 리더 노드에 장애가 발생하지 않는 한 잘 작동함.
  • 리더 노드가 실패하는 경우, 다시 합의 문제로 돌아가야 함.
  • 유일성 검사는 유일성이 필요한 값을 기준으로 파티셔닝하면 확장 가능함.
    • 예를 들어, 요청 ID의 유일성을 보장하려면 같은 요청 ID를 사용하는 모든 요청을 같은 파티션으로 라우팅할 수 있음.
  • 하지만, 비동기 다중 마스터 복제는 적용할 수 없음.
    • 서로 다른 마스터에서 동시에 충돌하는 쓰기를 받아들일 수 있기 때문에 값의 유일성을 보장할 수 없음.
    • 제약 조건을 위반하면 어떤 쓰기도 즉시 거부하기를 원한다면 동기식 코디네이션을 피할 수 없음.

로그 기반 메시징의 유일성

  • 로그 기반 메시징은 모든 소비자가 동일한 순서로 메시지를 보도록 보장함.
    • 이를 전체 순서 브로드캐스트라 부르며, 이는 합의와 동일한 개념임.
  • 로그 기반 메시징을 사용하는 언번들링 데이터베이스 접근법에서 유일성 제약 조건을 강제하기 위해 비슷한 접근법을 사용할 수 있음.
    • 스트림 처리자는 단일 스레드에서 한 로그 파티션의 모든 메시지를 순차적으로 소비함.
  • 유일성이 필요한 값을 기준으로 로그를 파티셔닝하면 스트림 처리자는 충돌이 발생한 연산 중 어떤 것이 처음 들어온 연산인지 명확하게 판단할 수 있음.
    • 사용자명 요청을 예로 들면, 모든 사용자명 요청은 메시지로 인코딩되어 사용자명의 해시값으로 결정된 파티션에 추가됨.
    • 스트림 처리자는 로그에서 요청을 연속해서 읽고 로컬 데이터베이스를 이용해 어떤 사용자명을 사용했는지 추적함.
  • 이러한 접근법은 유일성 제약 조건뿐만 아니라 다른 많은 제약 조건에도 사용할 수 있음.
    • 이 접근법의 핵심 원칙은 충돌이 발생할 수 있는 쓰기를 모두 같은 파티션으로 라우팅하고 순서대로 처리하는 것임.

다중 파티션 요청 처리

  • 다중 파티션 요청 처리는 원자적 연산을 보장하는 데 중요함.
    • 요청 ID, 받는 사람 계좌, 보내는 사람 계좌를 포함하는 세 가지 파티션이 모두 독립적임.
    • 데이터베이스의 전통적인 접근법에서는 원자적 커밋이 필요하지만, 파티셔닝된 로그를 사용하면 동등한 정확성을 달성할 수 있음.
  • 클라이언트가 송금 요청을 하면 요청 ID를 발급받아 특정 로그 파티션에 추가됨.
    • 스트림 처리자는 요청 로그를 읽어 보내는 사람 계좌에서의 출금 지시와 받는 사람 계좌로의 입금 지시를 출력 스트림으로 방출함.
    • 원 요청 ID가 포함됨.
  • 후속 처리자는 출금과 입금 지시 스트림을 소비하여 요청 ID로 중복을 제거하고 변경 내용을 계좌 잔고에 반영함.
    • 원자적 커밋이 필요하지 않음.
  • 스트림 처리자에 장애가 발생하면 이전 체크포인트에서 처리를 재개함.
    • 중복 처리로 인한 입금과 출금 지시의 중복 생산 가능성이 있지만, 결정적인 요청으로 인해 중복을 쉽게 제거할 수 있음.
  • 보내는 사람 계좌에서 중복 인출을 방지하기 위해 추가적인 스트림 처리자를 사용할 수 있음.
    • 이 처리자는 계좌 잔고를 유지하고 트랜잭션 유효성을 검증함.
  • 다중 파티션 트랜잭션을 서로 다르게 파티셔닝된 두 단계로 나누고 종단 간 요청 ID를 사용하면 원자적 커밋 프로토콜 없이도 동일한 정확성 속성을 달성할 수 있음.
    • 서로 다르게 파티셔닝된 다중 단계를 사용하는 개념은 다중 파티션 데이터 처리와 비슷함.

적시성과 무결성

  • 트랜잭션의 선형성을 이용하면 커밋이 완료된 후 해당 쓰기가 모든 독자에게 보여지도록 할 수 있음.
    • 이는 로그 기반 메시징에서 유일성을 확인하는 데 사용되는 기법과 유사하다.
  • 일관성에는 적시성과 무결성이라는 두 가지 요소가 있다.
    1. 적시성은 사용자가 시스템을 항상 최신 상태로 볼 수 있음을 의미함.
      • 만약 사용자가 뒤처진 데이터를 읽는다면, 일관성이 없는 상태의 데이터를 관측하게 될 수 있음.
      • 하지만 이는 일시적인 상태이므로, 기다리면 해결될 수 있음.
    2. 무결성은 데이터에 누락이나 모순, 오류가 없음을 의미함.
      • 특히 파생 데이터셋이 기반 데이터를 정확하게 반영해야 함.
      • 무결성이 위반되면 이는 영원히 지속되므로, 명시적인 검사와 수리가 필요함.
  • 일관성에 대한 오해 중 하나는 무결성이 적시성보다 중요하지 않다는 것임.
    • 적시성 위반이 혼란을 야기할 수는 있지만, 무결성 위반이 결국 파국을 초래함.
    • 예를 들어 신용카드 결제 내역이 24시간 이내에 보이지 않는 것은 놀랍지 않지만, 잔고가 거래 합계와 일치하지 않거나 결제가 상인에게 지불되지 않는 것은 매우 큰 문제임.

데이터플로 시스템의 정확성

  • ACID 트랜잭션은 적시성과 무결성을 모두 보장하지만, 이벤트 기반 데이터플로 시스템은 이 두 가지를 분리함.
    • 비동기 처리 시 소비자가 메시지 도착을 기다리지 않으므로 적시성은 보장되지 않음.
    • 하지만 무결성이 스트림 시스템의 핵심이며, 정확히 한 번이나 결과적으로 한 번 시맨틱은 무결성을 보존하는 메커니즘임.
  • 무결성을 지키는 데 중요한 기능은 내결함성 메시지 전달과 중복 억제(ex: 멱등 연산)임.
    • 이벤트가 유실되거나 이벤트의 효과가 중복되면 데이터 시스템의 무결성을 위반할 수 있음.
  • 신뢰성 있는 스트림 처리 시스템은 분산 트랜잭션과 원자적 커밋 프로토콜 없이 무결성을 보존할 수 있음.
    • 이는 더 좋은 성능과 운영적 견고함을 줄 수 있음을 의미함.
    • 이 무결성은 쓰기 연산을 단일 메시지로 표현, 결정적 파생 함수 사용, 클라이언트가 생성한 요청 ID 전달, 메시지를 불변으로 만들고 재처리 등의 메커니즘을 통해 달성할 수 있음.
    • 이러한 메커니즘의 조합은 미래의 내결함성 애플리케이션 구축에 유망한 방향이라고 볼 수 있음.

느슨하게 해석되는 제약 조건

  • 유일성 제약 조건은 합의가 필요하며, 이는 모든 이벤트를 단일 노드를 통해 특정 파티션으로 보내 처리하는 방식으로 구현됨.
    • 스트림 처리 역시 비슷한 제한 사항을 가지고 있음.
    • 그러나 많은 애플리케이션에서는 이 제한을 완화된 유일성 개념을 통해 피할 수 있음.
  • 제약 조건을 일시적으로 위반하고 나중에 사과하는 방법은 많은 비즈니스 맥락에서 실제로 수용 가능함.
    • 이를 통해 데이터를 쓰기 전에 모든 제약 조건을 검사하는 전통적인 모델은 불필요하게 제한적일 수 있으며, 이러한 경우 선형적 제약 조건도 필요하지 않음.
  • 낙관적으로 쓰기를 즉시 하고 사후에 제약 조건을 검사하는 방법은 합리적인 선택일 수 있음.
    • 복구 비용이 비싼 일은 여전히 수행 전에 유효성 검증을 보장할 수 있음.
    • 그러나 이러한 상황 때문에 데이터를 쓰기 전에는 꼭 유효성 검사를 해야 한다는 뜻은 아님.
  • 이러한 애플리케이션은 무결성을 반드시 요구함.
    • 예약을 놓치거나 입금액과 출금액이 일치하지 않아 돈이 사라지는 것을 원하지는 않을 것임.
    • 그러나 제약 조건을 강제하는 상황에서도 적시성은 반드시 필요한 것은 아님.
    • 재고보다 많은 상품을 팔았다면 사후에 사과를 하고 문제를 해결할 수 있음.

코디네이션 회피 데이터 시스템

  • 다음의 두 가지 흥미로운 점을 관찰할 수 있음.
    1. 데이터플로 시스템은 원자적 커밋, 선형성, 파티션에 걸친 동기 코디네이션 없이도 파생 데이터에 대한 무결성 보장이 가능함.
    2. 엄격한 유일성 제약 조건은 적시성과 코디네이션을 필요로 하지만, 많은 애플리케이션에서는 느슨한 제약 조건을 사용하면서도 전체적인 무결성을 유지할 수 있음.
      • 일시적인 제약 조건 위반도 이후에 수정이 가능함.
  • 즉, 데이터플로 시스템은 코디네이션 없이도 많은 애플리케이션용 데이터 관리 서비스를 제공하며, 무결성을 강력하게 보장함.
    • 이러한 코디네이션 회피 데이터 시스템은 성능이 좋고, 내결함성이 높음.
  • 데이터 시스템은 여러 데이터 센터에 분산해 운영하고, 비동기로 지역 간 복제가 가능함.
    • 각 데이터 센터는 다른 데이터 센터와 독립적으로 운영할 수 있음.
    • 지역 간 동기식 코디네이션은 필요 없음.
    • 그러나 적시성은 약하게 보장하며, 선형성은 코디네이션을 도입하지 않는 한 없음.
    • 그럼에도 불구하고 무결성은 강력하게 보장됨.
  • 직렬성 트랜잭션은 파생 상태를 유지하는 데 부분적으로만 유용함.
    • 그러나 잘 작동하는 작은 범위에서는 충분히 실행 가능함.
    • 이종 분산 트랜잭션은 필요하지 않음.
    • 동기식 코디네이션은 필요한 곳에 도입할 수 있음.
    • 그러나 애플리케이션의 작은 부분에서만 코디네이션이 필요하다면, 모든 곳에서 코디네이션 비용을 지불할 필요는 없음.
  • 코디네이션과 제약 조건은 불일치 때문에 해야하는 사과의 수를 줄임.
    • 그러나 이들은 시스템의 성능과 가용성을 줄일 수 있고, 따라서 중단 때문에 해야하는 사과의 수를 늘릴 수 있음.
    • 최상의 트레이드오프를 찾는 것이 목표임.
    • 즉, 너무 많은 불일치나 가용성 문제가 없는 최적의 장소를 찾는 것이 목표임.

댓글

Designed by JB FACTORY