타임스탬프 경계

소개

Spanner에서 읽기 전용 트랜잭션 또는 단일 읽기 호출로 데이터를 읽을 때 타임스탬프 경계를 설정하여 Spanner에서 데이터를 읽을 타임스탬프를 선택하는 방식을 지정합니다.

타임스탬프 경계를 설정하는 이유는 무엇일까요? 데이터베이스가 지리적으로 분산되어 있고(즉, 멀티 리전 인스턴스 구성을 사용하여 Spanner 인스턴스를 만든 경우) 애플리케이션에서 데이터를 읽을 때 일부 비활성을 허용한다면 강력 읽기 대신 비활성 읽기를 실행하여 지연 시간상의 이점을 얻을 수 있습니다. (읽기에서 이러한 읽기 유형에 대해 자세히 알아보세요.)

타임스탬프 경계 유형

타임스탬프 경계 유형은 다음과 같습니다.

  • 강력(기본값): 최신 데이터를 읽습니다.
  • 제한된 비활성: 경계 이후의 데이터 버전을 읽습니다.
  • 완전 비활성: 정확한 타임스탬프의 데이터 버전을 읽습니다. 과거의 특정 시점을 나타내지만 아직 지나지 않은 시간의 타임스탬프를 지정할 수도 있습니다. 미래의 타임스탬프를 지정하면 Spanner는 해당 타임스탬프가 될 때까지 기다렸다가 읽기를 처리합니다.

참고:

  • 이러한 타임스탬프 경계 모드를 사용하는 읽기는 읽기-쓰기 트랜잭션에 속하지 않지만 동시 읽기-쓰기 트랜잭션의 커밋 대기를 차단할 수 있습니다. 제한된 비활성 읽기는 차단을 방지하기 위해 타임스탬프를 선택하려고 시도하지만 그래도 차단될 수 있습니다.

  • 비활성 읽기(즉, 제한된 비활성 또는 완전 비활성 유형을 사용하는 읽기)는 비활성 간격이 길수록 성능이 좋습니다. 성능상의 이점을 얻으려면 비활성을 10초 이상 사용합니다.

  • Spanner는 이전 버전의 데이터를 읽을 수 있는 가장 이른 시간을 지정하는 데이터베이스의 earliest_version_time를 추적합니다. 가장 초기 버전 시간 이전의 타임스탬프에서는 읽을 수 없습니다.

Spanner 타임스탬프 경계 유형은 아래에 자세히 설명되어 있습니다.

Strong

Spanner는 강력 읽기를 위한 경계 유형을 제공합니다. 강력 읽기에서는 읽기를 시작하기 전에 커밋한 모든 트랜잭션의 영향을 확인할 수 있습니다. 또한 단일 읽기 결과로 가져오는 모든 행은 서로 일관됩니다. 읽기의 일부에서 트랜잭션을 관찰하면 읽기의 모든 부분에서 트랜잭션을 확인합니다.

강력 읽기는 반복할 수 없습니다. 동시 쓰기가 있을 경우 연속된 두 번의 강력 읽기 전용 트랜잭션은 일관되지 않은 결과를 반환할 수 있습니다. 읽기 간 일관성이 필요하면 같은 트랜잭션 또는 정확한 읽기 타임스탬프에서 읽기를 실행해야 합니다.

제한된 비활성

Spanner는 제한된 비활성을 위한 경계 유형을 제공합니다. 제한된 비활성 모드를 사용하면 사용자가 제공한 비활성 경계에 따라 Spanner에서 읽기 타임스탬프를 선택할 수 있습니다. Spanner는 비활성 경계 내에서 최신 타임스탬프를 선택하여 차단하지 않고 사용할 수 있는 가장 가까운 복제본의 읽기를 실행할 수 있습니다.

가져온 모든 행은 서로 일관됩니다. 읽기의 일부에서 트랜잭션을 관찰하면 읽기의 모든 부분에서 트랜잭션을 확인합니다. 제한된 비활성 읽기는 반복할 수 없습니다. 두 번의 비활성 읽기는 같은 비활성 경계를 사용하더라도 다른 타임스탬프를 실행할 수 있으므로 일관되지 않은 결과를 반환합니다.

제한된 비활성 읽기는 대등한 완전 비활성 읽기보다 일반적으로 약간 느립니다.

완전 비활성

Spanner는 완전 비활성을 위한 경계 유형을 제공합니다. 이러한 타임스탬프 경계는 사용자가 지정한 타임스탬프에서 읽기를 실행합니다. 타임스탬프의 읽기에서는 전체 트랜잭션 내역의 일관된 프리픽스를 확인할 수 있습니다. 이러한 읽기는 읽기 타임스탬프보다 적거나 같은 커밋 타임스탬프의 모든 트랜잭션으로 수행한 수정 사항을 관찰하고 큰 커밋 타임스탬프의 트랜잭션에서 수행한 수정 사항은 관찰하지 않습니다. 또한 읽기 타임스탬프보다 적거나 같은 커밋 타임스탬프를 할당할 수 있는 모든 충돌 트랜잭션이 완료될 때까지 차단합니다.

이 타임스탬프는 완전 Spanner 커밋 타임스탬프 또는 현재 시간에 비교해 비활성으로 표현할 수 있습니다.

이러한 모드에서는 타임스탬프를 선택하는 '협상 단계'가 필요하지 않습니다. 따라서 제한된 방식을 사용하는 동등한 비활성 동시 실행 모드보다 약간 빠르게 실행됩니다. 반면에 제한된 비활성 읽기는 대개 좀 더 최신 결과를 반환합니다.

최대 타임스탬프 비활성

Spanner는 지속적으로 백그라운드에서 삭제되거나 덮어쓴 데이터를 가비지 컬렉션하여 저장공간을 확보합니다. 이 프로세스를 버전 GC라고 합니다. 버전 GC는 데이터베이스의 version_retention_period을 지나 만료되면 버전이 복원되며, 기본값은 1시간이지만 최대 1주까지 구성할 수 있습니다. 이 제한은 실행하는 중에 타임스탬프가 너무 오래되어 버리는 진행 중인 읽기 또는 SQL 쿼리에도 적용됩니다. 읽기 타임 스탬프가 너무 오래된 읽기 및 SQL 쿼리는 실패하고 FAILED_PRECONDITION 오류가 표시됩니다. 단, 파티션 토큰이 포함된 파티션 읽기/쿼리는 세션이 활성 상태를 유지하는 동안 만료된 데이터의 가비지 컬렉션을 방지합니다.