사전 분할 개요

이 문서에는 데이터베이스를 사전 분할하는 데 도움이 되는 정보가 포함되어 있습니다.

Spanner는 부하 및 크기 변경에 따라 데이터베이스 분할 및 확장을 관리합니다. 분할 및 병합은 트래픽에 따라 동적으로 이루어집니다. 분할이 더 많은 트래픽을 수신하면 Spanner는 이를 더 작은 범위로 세분화하고 결과 분할을 인스턴스의 다른 사용 가능한 리소스에 재배포합니다. Spanner는 분할에서 지속적으로 트래픽이 적게 수신되면 분할을 병합합니다.

분할은 즉시 이루어지지 않습니다. 분할 및 재균형 조정이 트래픽을 따라잡을 수 없는 경우 분할로 인해 사용 가능한 컴퓨팅 및 메모리 리소스가 소진될 수 있습니다. 이 경우 Spanner의 작업 스케줄러가 추가 요청을 큐에 추가하여 지연 시간이 증가하고 제한 시간 초과 및 트랜잭션 중단이 발생할 수 있습니다.

데이터베이스를 미리 분할하면 Spanner는 예측 가능한 트래픽 증가에 대비할 수 있습니다. 분할 지점을 만들어 데이터베이스를 사전 분할할 수 있습니다.

다음과 같은 시나리오에서는 데이터베이스를 사전 분할하는 것을 고려하세요.

  • 일회성 일괄 로드와 같이 대규모 데이터 세트를 처음으로 Spanner 데이터베이스의 새 테이블 및 색인에 로드하는 경우입니다.
  • 가까운 시일 내에 기존 Spanner 데이터베이스의 트래픽 부하가 증가할 것으로 예상됩니다. 예를 들어 제품 출시 또는 판매 캠페인과 같은 대규모 트래픽 이벤트를 지원해야 할 수 있습니다.

분할 수 확인

노드 당 10개의 분할 지점을 만드는 것이 좋습니다. Spanner는 소규모 인스턴스에 대해 트래픽을 빠르게 분할 및 조정할 수 있으므로 소규모 인스턴스를 미리 분할할 필요가 없습니다.

분할 지점 확인

데이터베이스의 분할 지점을 결정할 때는 다음 사항을 고려하세요.

  • UUID 또는 비트 반전 시퀀스 키를 사용할 때와 같이 트래픽이 키 범위에 고르게 분산된 경우, 후속 트래픽 키 공간을 고르게 분할하는 분할 지점을 선택합니다.

  • 트래픽이 알려진 키 범위 집합에 집중되어 있는 경우 이러한 키 범위를 분할하고 격리합니다.

  • 색인에서 트래픽이 발생할 것으로 예상되는 경우 해당 색인에서 분할 지점을 사용합니다.

  • 분할 지점이 상위 테이블에 추가되면 인터리브 처리된 테이블이 분할됩니다. 인터리브 처리된 테이블의 트래픽이 더 많을 것으로 예상되는 경우 해당하는 인터리브 처리된 테이블에서 분할 지점을 사용해야 합니다.

  • 증가한 트래픽에 비례하여 분할 지점을 스키마 객체에 할당할 수 있습니다.

분할 지점을 결정하기 위한 샘플 워크플로

데이터베이스에 다음 DDL로 정의된 테이블 구조가 있다고 가정합니다.

CREATE TABLE UserInfo (
 UserId INT64 NOT NULL,
 Info BYTES(MAX),
) PRIMARY KEY (UserId);


CREATE TABLE UserLocationInfo (
 UserId INT64 NOT NULL,
 LocationId STRING(MAX) NOT NULL,
 ActivityData BYTES(MAX),
) PRIMARY KEY (UserId, LocationId), INTERLEAVE IN PARENT UserInfo ON DELETE CASCADE;


CREATE INDEX UsersByLocation ON UserLocationInfo(LocationId);

UserIdINT64 공간에서 무작위로 생성된 해시이며, 예상되는 트래픽 증가를 UserInfo 테이블과 인터리브 처리된 테이블에 균등하게 분산하기 위해 100개의 분할 지점을 추가해야 합니다. 분할 지점이 균등하게 분포되어 있으므로 각 분할 지점 간의 행 수 또는 offset을 찾아야 합니다.

offset = UserId 범위의 최댓값/99

그런 다음 테이블 UserInfo의 분할 지점은 UserId의 첫 번째 행 또는 UserId_first에서 결정됩니다. N번째 분할 지점을 결정하려면 다음 계산을 사용하세요.

분할 지점 N: UserId_first + (offset * (N-1))

예를 들어 첫 번째 분할 지점은 UserId_first + (offset * 0)이고 세 번째 분할 지점은 UserId_first + (offset * 2)입니다.

UserLocationInfo 테이블은 UserInfo 테이블의 인터리브 처리된 테이블이므로 UserId 경계에서도 분할됩니다. LocationId 열의 UserLocationInfo 테이블에 분할 지점을 만들 수도 있습니다.

LocationId$COUNTRY_$STATE_$CITY_$BLOCK_$NUMBER 형식을 따르는 경우(예: US_CA_SVL_MTL_1100_7)를 고려해 보세요.

UserId의 경우 LocationId 문자열의 프리픽스를 기반으로 분할을 결정하여 UserId에 대한 UserLocationInfo 테이블을 3가지 서로 다른 분할로 3개 국가에 배치할 수 있습니다.

  • 분할 지점 1: (1000, 'CN')
  • 분할 지점 2: (1000, 'FR')
  • 분할 지점 3: (1000, 'US')

프리픽스만 사용하여 새 분할 지점을 추가할 수 있으며 열 또는 색인의 지정된 형식과 일치시킬 필요가 없습니다. 이 예시에서 분할 지점은 LocationId에 지정된 형식과 일치하지 않으며 $COUNTRY만 프리픽스로 사용합니다.

UsersByLocation 색인을 분할하려면 LocationId 열에 분할 지점을 고르게 분산하거나 트래픽이 증가할 것으로 예상되는 몇 개의 LocationId 열 값을 격리하면 됩니다.

  • 분할 지점 1: 'CN'
  • 분할 지점 2: 'US'
  • 분할 지점 3: 'US_NYC'

트래픽이 더 많이 증가하는 위치에 색인이 생성된 테이블 키 부분을 사용하여 색인을 추가로 분할할 수 있습니다. 예를 들어 CN 위치의 트래픽이 증가할 것으로 예상되는 경우 다음과 같은 분할 지점을 도입할 수 있습니다.

  • 분할 지점 1: 'CN' 및 TableKey: (1000, 'CN')
  • 분할 지점 2: 'CN' 및 TableKey: (2000, 'CN')
  • 분할 지점 3: 'CN' 및 TableKey: (3000, 'CN')

분할 지점 만료

각 분할 지점의 만료 시간을 설정할 수 있습니다. 사용 사례에 따라 예상되는 트래픽 증가가 소멸된 후에 분할 지점이 만료되도록 설정합니다.

기본 만료 시간은 분할이 생성되거나 업데이트된 시점부터 10일입니다. 허용되는 최대 만료 시간은 분할을 만들거나 업데이트한 날로부터 30일입니다.

분할이 만료되면 Spanner에서 분할 관리를 대신하고 더 이상 분할을 볼 수 없습니다. Spanner는 트래픽에 따라 분할을 병합할 수 있습니다.

분할 지점이 만료되기 전에 만료 시간을 업데이트할 수도 있습니다. 예를 들어 증가한 트래픽이 줄지 않았다면 분할 만료 시간을 늘릴 수 있습니다. 분할 지점이 더 이상 필요하지 않으면 즉시 만료되도록 설정할 수 있습니다. 분할 지점의 만료 시간을 설정하는 방법은 분할 지점 만료 방법을 참조하세요.

데이터베이스 사전 분할의 결과

분할 지점을 추가하면 다음과 같은 결과가 발생할 수 있습니다.

  • 지연 시간 변경: 분할 지점을 추가하는 것은 데이터베이스의 트래픽 증가를 시뮬레이션하는 방법입니다. 데이터베이스에 분할이 많을수록 트랜잭션 참여자와 쿼리 분할이 늘어나 읽기 및 쓰기 지연 시간이 영구적으로 증가할 수 있습니다. 또한 읽기 또는 쓰기 요청당 컴퓨팅 및 쿼리 사용량이 증가할 것으로 예상할 수 있습니다.

  • 분할 지점 효율성: 추가된 분할 지점이 유용한지 확인하려면 최소 변경사항에 대한 지연 시간 프로필과 부하 집중에 대한 키 시각화 도구를 모니터링합니다. 부하 집중이 발견되면 분할 지점을 즉시 만료하고 새 지점을 만들 수 있습니다. 분할 지점 만료에 관한 자세한 내용은 분할 지점 만료 방법을 참조하세요. 다음번 분할 추가 반복에서 더 적은 수의 분할을 도입하고 지연 시간 프로필을 관찰하는 것이 좋습니다.

  • 트래픽 증가 후 분할 지점 동작: 추가된 분할 지점은 트래픽 증가가 안정화된 후에 삭제해야 합니다. 분할 배포가 부하 증가 전의 위치로 수렴하지 않을 수 있습니다. 데이터베이스는 트래픽 변경 및 트래픽을 지원하는 데 필요한 분할로 인해 다른 지연 시간 프로필을 선택할 수 있습니다.

사용 사례

게임 회사의 데이터베이스 관리자이고 새 게임 출시로 트래픽이 증가할 것으로 예상한다고 가정해 보겠습니다. 비어 있는 새 테이블에서 트래픽이 발생할 것으로 예상됩니다.

트래픽이 유입될 때 서비스가 중단되지 않도록 하여 지연 시간 또는 오류율에 눈에 띄는 영향을 미치지 않도록 해야 합니다.

이 사용 사례에 대한 다음과 같은 대략적인 사전 분할 전략을 고려해 보세요.

  1. 인스턴스에서 증가한 트래픽을 지원하는 데 필요한 노드 수를 확인합니다. 노드 수를 확인하는 방법은 성능 개요를 참조하세요. 자동 확장 처리를 사용하는 경우 최대 한도 매개변수를 식별한 노드 수로 설정합니다. 또한 최소 제한 매개변수를 (확인한 노드 수/5)로 설정합니다.

  2. 트래픽이 가장 많고 분할 지점을 사용하면 가장 큰 이점을 얻을 수 있는 테이블과 색인을 식별합니다. 현재 데이터를 분석하고 커스텀 분할 지점 또는 균등하게 분산된 분할 지점 중에서 선택합니다.

  3. 예상되는 트래픽 증가 7일 전, 늦어도 12시간 전에는 분할 지점을 만듭니다.

  4. 분할이 생성되었는지 확인합니다. 인스턴스에서 생성된 분할 지점을 보려면 분할 지점 보기를 참조하세요.

주의사항

분할 지점을 만들 때는 다음 주의사항을 고려하세요.

  • 테이블, 색인, 데이터베이스 삭제: 테이블, 색인 또는 데이터베이스를 삭제하기 전에 추가된 모든 분할 지점이 만료되었는지 확인해야 합니다. 분할 만료일을 현재 시간으로 설정하면 이를 수행할 수 있습니다. 인스턴스 수준 할당량을 회수하려면 이 작업이 필요합니다. 분할 지점 만료에 관한 자세한 내용은 분할 지점 만료 방법을 참조하세요.

  • 백업 및 복원 데이터베이스: 추가된 분할은 백업되지 않습니다. 복원된 데이터베이스에 분할을 만들어야 합니다.

  • 비대칭 자동 확장: 비대칭 자동 확장을 사용하는 경우 분할 지점 수를 결정하는 데 사용되는 노드 수는 모든 리전의 최소 노드 수입니다.

  • 스토리지 사용량 측정항목 일시적 증가: 분할 지점을 추가하면 Spanner가 압축을 완료할 때까지 총 데이터베이스 스토리지 측정항목이 일시적으로 증가합니다. 자세한 내용은 스토리지 사용량을 참조하세요. 이는 기존 키 범위가 추가로 분할될 때만 발생하며, 새로운 키 범위가 분할될 때는 발생하지 않습니다.

  • 예상되는 트래픽 증가 7일 전, 늦어도 12시간 전에는 분할 지점을 생성해야 합니다.

사전 분할 한도

데이터베이스를 사전 분할하면 다음과 같은 제한사항이 적용됩니다.

  • 검색 색인을 사전 분할할 수는 없습니다. 기본 테이블만 사전 분할하면 됩니다. 자세한 내용은 검색 색인 샤딩을 참조하세요.

  • 벡터 색인을 사전 분할할 수 없습니다. 벡터 색인에 관한 자세한 내용은 벡터 색인을 참조하세요.

  • 분할 지점의 할당량에 대한 자세한 내용은 할당량 및 한도를 참조하세요.

다음 단계