슬라이딩 리스트 파티셔닝
슬라이딩 리스트 파티셔닝 전략은 순차적인 숫자 파티션을 생성하고 해당 수명 주기를 자동으로 관리하는 동적 파티셔닝 접근 방식입니다. 다른 파티셔닝 전략과 달리, 슬라이딩 리스트 파티셔닝은 단순히 증가하는 정수를 파티션 키로 사용하고 새 파티션을 만들 시점과 이전 파티션을 삭제할 시점을 결정하는 커스텀 로직을 제공합니다.
설명#
슬라이딩 리스트 파티셔닝 전략은 순차적인 숫자 파티션을 생성하고 해당 수명 주기를 자동으로 관리하는 동적 파티셔닝 접근 방식입니다.
다른 파티셔닝 전략과 달리, 슬라이딩 리스트 파티셔닝은 단순히 증가하는 정수를 파티션 키로 사용하고 새 파티션을 만들 시점과 이전 파티션을 삭제할 시점을 결정하는 커스텀 로직을 제공합니다.
이 전략은 데이터가 처리되었거나 더 이상 필요하지 않은 후(예: 'X'일 이후 또는 크기가 'X' 바이트 초과) 이전 파티션을 안전하게 제거할 수 있는 롤링 윈도우 데이터를 유지해야 하는 테이블에 특히 유용합니다.
워크플로우#
파티션 관리를 위한 모델 등록#
Gitlab.com에서 파티션은 애플리케이션 시작 시 생성되지 않으며, 하루에 여러 번 실행되는
_PartitionManagementWorker_에 의해 생성됩니다. 슬라이딩 리스트 파티셔닝을 사용하는 모델은
PartitionManagementWorker가 처리할 수 있도록 Gitlab::Database::Partitioning.register_models에도
추가해야 합니다.
파티셔닝 블록 정의#
PartitionManager는
next_partition_if와 detach_partition_if를 사용하여 missing_partitions와 extra_partitions를 각각 결정합니다.
새 파티션을 추가할 시점과 이전 파티션을 삭제할 시점을 동적으로 결정할 수 있도록 블록을 정의합니다.
파티셔닝 블록 내에서 사용되는 필터 조건에 적절한 인덱스가 사용되고 있는지 확인하세요.
예시:
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전략을 사용합니다. - 균등한 데이터 분산이 우선순위인 경우: 해시 기반 파티셔닝을 사용합니다.
