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

요약

  • 트랜잭션의 완화된 격리 수준 중 하나인 직렬성 스냅숏 격리에 대해 이해하게 됨.
    • 직렬성 격리와 좋은 성능을 공존할 수 있는 방법임.
    • 낙관적 동시성 제어 기법으로 볼 수 있고, 스냅숏 격리를 기반으로 함.
  • SSI 는 쓰기 스큐를 처리하기 위해 뒤처진 전제에 기반한 결정 을 이용한다.
    • 오래된 MVCC 읽기 감지
    • 과거의 읽기에 영향을 미치는 쓰기 감지
  • 직렬성 스냅숏 격리는 트랜잭션 상세 동작 추적시 오버헤드 발생함.
    • 2단계 잠금과 달리 잠금을 기다리지 않아도 되기에 빠름
    • 단일 CPU 코어 처리량에도 제한되지 않으므로 여러 파티션으로부터 읽고 쓸 수 있음.

메모

직렬성 스냅숏 격리(SSI)

  • 직렬성 격리와 좋은 성능을 공존할 수 있는 방법임
  • 이 알고리즘 (Serializable Snapshot Isolation, SSI)은 최근에 등장함.
    • 오늘날에 SSI는 단일 노드 데이터베이스(포스트그레스큐엘)와 분산 데이터베이스(파운데이션DB) 모두에 사용됨.
    • 역사가 짧지만, 미래에 새로운 기본값이 될 정도로 충분히 빨라질 가능성이 있음.

비관적 동시성 제어 대 낙관적 동시성 제어

  • 2단계 잠금은 비관적 동시성 제어 메커니즘임.
    • 트랜잭션을 기다린다.
  • 반대로 직렬성 스냅숏 격리낙관적 동시성 제어 기법임.
    • 트랜잭션을 기다리지 않도록 허용한다.
  • 예비 용량이 충분하고 트랜잭션 경쟁이 너무 심하지 않으면 낙관적 동시성 제어 기법이 비관적 동시성 제어보다 성능이 좋은 경향이 있음.
  • SSI 는 스냅숏 격리를 기반으로 하므로, 모든 읽기는 데이터베이스의 일관된 스냅숏을 보게됨.
    • 낙관적 동시성 제어 기법과 크게 다른 점임.

뒤처진 전제에 기반한 결정

  • 쓰기 스큐의 경우 스냅숏 격리하에서는 트랜잭션이 커밋되는 시점에 원래 질의의 결과가 더이상 최신이 아닐 수 있음.
    • 도중에 데이터가 변경됐을 수 있음. ex) 호출 대기 의사 수
  • 트랜잭션은 어떤 전제를 기반으로 어떤 동작을 한다.
    • 즉, 트랜잭션에서 실행하는 질의와 쓰기 사이에는 인과적 의존성이 있을 지도 모름.
    • 트랜잭션이 뒤처진 전제를 기반으로 동작하는 상황을 감지하고 그런 상황에서는 트랜잭션을 어보트 시켜야 함.
  • 데이터베이스가 질의 결과가 바뀌었는지 알려면 다음 두 가지 상황을 고려해야 함.
    • 오래된 MVCC 객체 버전을 읽었는지 감지하기
    • 과거의 읽기에 영햐을 미치는 쓰기 감지하기

오래된 MVCC 읽기 감지하기

  • 트랜잭션 MVCC 가시성 규칙에 따라 다른 트랜잭션의 쓰기를 무시하는 경우를 추적해야 함.(p263 예시 참고)
    • 트랜잭션이 커밋하려고 할 때, 데이터베이스는 무시된 쓰기 중에 커밋된 게 있는지 확인해야하고, 커밋된 게 있다면 트랜잭션은 어보트되야 함.
    • SSI는 불필요한 어보트를 피해서 일관된 스냅숏에서 읽으며 오래 실행되는 작업을 지원하는 스냅숏 격리의 특성을 유지한다.

과거의 읽기에 영향을 미치는 쓰기 감지하기

  • 트랜잭션이 데이터베이스에 쓸 때, 영향받는 데이터를 최근에 읽은 트랜잭션이 있는지 색인에서 확인해야 함.
    • 영향받는 키 범위에 쓰기 잠금을 획득하는 거랑 비슷한 동작이지만, 읽는 쪽에서 커밋될 때까지 차단하지 않음.
    • 즉, 트랜잭션이 읽은 데이터가 더 이상 최신이 아니라고만 트랜잭션에게 알려줄 뿐임.
  • p264 예시 참고

직렬성 스냅숏 격리의 성능

  • 데이터베이스가 트랜잭션의 동작을 매우 상세하게 추적하면 어보트돼야 하는 트랜잭션을 정확히 판별할 수 있음.
    • 하지만 기록 오버헤드가 심해질 수 있음.
  • 직렬성 스냅숏 격리는 2단계 잠금과 비교해서, 잠금을 기다리느라 차단될 필요가 없는 점이 이점이었음.
  • 순차실행과 비교하면 직렬성 스냅숏 격리는 단일 CPU 코어 처리량에 제한되지 않음.
    • 즉, 데이터가 여러 장비에 걸쳐서 파티셔닝돼 있더라도 트랜잭션은 직렬성 격리를 보장하면서 여러 파티션으로부터 읽고 쓸 수 있음.

댓글

Designed by JB FACTORY