InfoGrab DocsInfoGrab Docs

슬라이딩 리스트 파티셔닝

요약

슬라이딩 리스트 파티셔닝 전략은 순차적인 숫자 파티션을 생성하고 그 수명 주기를 자동으로 관리하는 동적 파티셔닝 방식입니다. 다른 파티셔닝 전략과 달리 슬라이딩 리스트 파티셔닝은 단순히 증가하는 정수를 파티션 키로 사용하며, 새 파티션을 생성할 시점과 오래된 파티션을 삭제할 시점을 판단하는 사용자 정의 로직을 제공합니다.

설명#

슬라이딩 리스트 파티셔닝 전략은 순차적인 숫자 파티션을 생성하고 그 수명 주기를 자동으로 관리하는 동적 파티셔닝 방식입니다.

다른 파티셔닝 전략과 달리 슬라이딩 리스트 파티셔닝은 단순히 증가하는 정수를 파티션 키로 사용하며, 새 파티션을 생성할 시점과 오래된 파티션을 삭제할 시점을 판단하는 사용자 정의 로직을 제공합니다.

이 전략은 데이터가 처리되었거나 더 이상 필요하지 않게 되면(예: 'X'일 경과 또는 크기가 'X' 바이트 초과) 오래된 파티션을 안전하게 제거할 수 있는, 롤링 윈도우 데이터를 유지해야 하는 테이블에 특히 유용합니다.

워크플로#

파티션 관리를 위한 모델 등록#

GitLab.com에서 파티션은 애플리케이션 시작 시점에 생성되지 않습니다. 파티션은 하루에 여러 번 실행되는 PartitionManagementWorker 가 생성합니다. 슬라이딩 리스트 파티셔닝을 사용하는 모델은 PartitionManagementWorker가 처리할 수 있도록 Gitlab::Database::Partitioning.register_models에도 추가합니다.

파티셔닝 블록 정의#

PartitionManager는 next_partition_if와 detach_partition_if를 사용하여 missing_partitions와 extra_partitions를 각각 결정합니다. 새 파티션을 추가할 시점과 오래된 파티션을 삭제할 시점을 동적으로 결정할 수 있도록 두 블록을 정의합니다.

Note

파티셔닝 블록 안에서 사용하는 필터 조건에 적절한 인덱스가 사용되는지 확인합니다.

예시:

class LooseForeignKeys::DeletedRecord < Gitlab::Database::SharedModel
  include PartitionedTable

  PARTITION_DURATION = 1.day

  partitioned_by :partition, strategy: :sliding_list,
    next_partition_if: ->(active_partition) do
      oldest_record_in_partition = LooseForeignKeys::DeletedRecord
        .select(:id, :created_at)
        .for_partition(active_partition.value)
        .order(:id)
        .limit(1)
        .take

      oldest_record_in_partition.present? &&
        oldest_record_in_partition.created_at < PARTITION_DURATION.ago
    end,
    detach_partition_if: ->(partition) do
      !LooseForeignKeys::DeletedRecord
        .for_partition(partition.value)
        .status_pending
        .exists?
    end
end

이 구성은 다음을 보장합니다.

  • 새 파티션이 매일 생성됩니다.
  • 오래된 파티션은 모든 레코드가 처리된 뒤에만 제거됩니다.
  • 시스템은 보존 로직에 따라 롤링 윈도우 데이터를 유지합니다.

사용하지 말아야 할 경우#

다음과 같은 경우에는 슬라이딩 리스트 파티셔닝을 사용하지 않습니다.

  • 데이터를 영구적으로 보존해야 하는 경우: 시간 기반 또는 범위 파티셔닝을 대신 사용합니다.
  • 단순한 시간 기반 아카이빙: retain_for 옵션과 함께 daily 또는 monthly 전략을 사용합니다.
  • 데이터의 균등한 분산이 우선인 경우: 해시 기반 파티셔닝을 사용합니다.

슬라이딩 리스트 파티셔닝

GitLab v19.5
원문 보기

요약

슬라이딩 리스트 파티셔닝 전략은 순차적인 숫자 파티션을 생성하고 그 수명 주기를 자동으로 관리하는 동적 파티셔닝 방식입니다. 다른 파티셔닝 전략과 달리 슬라이딩 리스트 파티셔닝은 단순히 증가하는 정수를 파티션 키로 사용하며, 새 파티션을 생성할 시점과 오래된 파티션을 삭제할 시점을 판단하는 사용자 정의 로직을 제공합니다.

설명#

슬라이딩 리스트 파티셔닝 전략은 순차적인 숫자 파티션을 생성하고 그 수명 주기를 자동으로 관리하는 동적 파티셔닝 방식입니다.

다른 파티셔닝 전략과 달리 슬라이딩 리스트 파티셔닝은 단순히 증가하는 정수를 파티션 키로 사용하며, 새 파티션을 생성할 시점과 오래된 파티션을 삭제할 시점을 판단하는 사용자 정의 로직을 제공합니다.

이 전략은 데이터가 처리되었거나 더 이상 필요하지 않게 되면(예: 'X'일 경과 또는 크기가 'X' 바이트 초과) 오래된 파티션을 안전하게 제거할 수 있는, 롤링 윈도우 데이터를 유지해야 하는 테이블에 특히 유용합니다.

워크플로#

파티션 관리를 위한 모델 등록#

GitLab.com에서 파티션은 애플리케이션 시작 시점에 생성되지 않습니다. 파티션은 하루에 여러 번 실행되는 PartitionManagementWorker 가 생성합니다. 슬라이딩 리스트 파티셔닝을 사용하는 모델은 PartitionManagementWorker가 처리할 수 있도록 Gitlab::Database::Partitioning.register_models에도 추가합니다.

파티셔닝 블록 정의#

PartitionManager는 next_partition_if와 detach_partition_if를 사용하여 missing_partitions와 extra_partitions를 각각 결정합니다. 새 파티션을 추가할 시점과 오래된 파티션을 삭제할 시점을 동적으로 결정할 수 있도록 두 블록을 정의합니다.

Note

파티셔닝 블록 안에서 사용하는 필터 조건에 적절한 인덱스가 사용되는지 확인합니다.

예시:

class LooseForeignKeys::DeletedRecord < Gitlab::Database::SharedModel
  include PartitionedTable

  PARTITION_DURATION = 1.day

  partitioned_by :partition, strategy: :sliding_list,
    next_partition_if: ->(active_partition) do
      oldest_record_in_partition = LooseForeignKeys::DeletedRecord
        .select(:id, :created_at)
        .for_partition(active_partition.value)
        .order(:id)
        .limit(1)
        .take

      oldest_record_in_partition.present? &&
        oldest_record_in_partition.created_at < PARTITION_DURATION.ago
    end,
    detach_partition_if: ->(partition) do
      !LooseForeignKeys::DeletedRecord
        .for_partition(partition.value)
        .status_pending
        .exists?
    end
end

이 구성은 다음을 보장합니다.

  • 새 파티션이 매일 생성됩니다.
  • 오래된 파티션은 모든 레코드가 처리된 뒤에만 제거됩니다.
  • 시스템은 보존 로직에 따라 롤링 윈도우 데이터를 유지합니다.

사용하지 말아야 할 경우#

다음과 같은 경우에는 슬라이딩 리스트 파티셔닝을 사용하지 않습니다.

  • 데이터를 영구적으로 보존해야 하는 경우: 시간 기반 또는 범위 파티셔닝을 대신 사용합니다.
  • 단순한 시간 기반 아카이빙: retain_for 옵션과 함께 daily 또는 monthly 전략을 사용합니다.
  • 데이터의 균등한 분산이 우선인 경우: 해시 기반 파티셔닝을 사용합니다.