SNR#3466 전문 인덱스 자동 병합 기능 추가

버전: 4.0.2609.0

전문(full-text) 인덱스는 일 단위 파티션마다 여러 세그먼트로 나뉘어 쌓입니다. 검색할 때 세그먼트를 각각 읽어야 하므로 파티션에 세그먼트가 많아질수록 응답 시간과 메모리 사용량이 늘어났고, 지금까지는 운영자가 수동 명령으로만 세그먼트를 병합할 수 있었습니다.

이제 더 이상 변경되지 않는 안정 상태의 인덱스 파티션을 시스템이 자동으로 식별해, 운영 부하가 적은 시간대(기본값 새벽)에 하나의 병합 인덱스로 통합합니다. 이 기능은 기본으로 활성화되어 있어 별도 조치 없이 동작하며, 업그레이드 전에 쌓인 과거 파티션도 오래된 것부터 점진적으로 병합됩니다. 즉시 병합 실행(전체 또는 테이블 단위), 병합 취소, 진행 상황 조회 명령을 제공하며 활성화 여부, 스케줄, 사이클당 작업량 상한을 설정할 수 있습니다. 병합 진행 상황과 테이블별 병합 상태는 쿼리로도 확인할 수 있습니다.

병합 인덱스는 데이터와 같은 수명주기를 따릅니다.

  • 이중화 구성에서는 스탠바이 노드로 자동 복제되며, 매일 실행되는 정합성 검증이 양쪽 노드의 인덱스를 대조해 누락된 인덱스를 복구하고 남은 파일을 정리합니다.
  • 보관 정책에 따라 티어를 이동(롤오버)할 때 인덱스도 함께 이동하며, 병합이 예정된 파티션은 병합이 끝날 때까지(기본값 최대 7일) 이동을 보류합니다.
  • 데이터를 삭제(purge)하면 인덱스도 함께 삭제됩니다.

수동 병합 도구

로그프레소 셸의 logpresso.compactIndex 명령으로 기존 배치 인덱스 파티션의 세그먼트를 병합 인덱스 형식으로 변환할 수 있습니다.

logpresso.compactIndex <테이블명> <인덱스명> <시작일(yyyy-MM-dd)> [종료일(yyyy-MM-dd)]
  • 테이블명·인덱스명과 함께 변환할 날짜 범위(시작일, 종료일, 모두 포함)를 지정합니다. 시작일만 지정하면 그 날짜의 파티션이, 종료일까지 지정하면 그 사이의 파티션이 대상이 됩니다.
  • 변환 후에도 기존 전문 검색 쿼리를 문법 변경 없이 그대로 사용할 수 있습니다.
  • 이름 변경(rename)을 지원하지 않거나 비용이 큰 오브젝트 스토리지 환경에서는 자동으로 복사 방식으로 전환합니다.
  • 이미 병합된 파티션이나 필요한 파일이 없는 파티션은 사유와 함께 건너뜁니다.
  • 데이터가 실시간으로 색인되고 있는(활성 상태인) 파티션에는 병합을 실행할 수 없습니다. 이런 파티션은 건너뛰고 사유를 출력하며, 해당 파티션이 유휴 상태로 전환된 뒤 다시 시도해야 합니다.
  • 인덱스 자동 병합이 활성화된 환경에서는 logpresso.compactIndex가 자동 병합과 같은 파티션을 동시에 병합할 위험이 있으므로, 수동 병합에는 logpresso.mergeIndexTable 명령 사용을 권장합니다.

병합 인덱스 메타데이터 조회

인덱스를 병합한 뒤에는 메타데이터 조회 명령어로 병합된 인덱스의 용량과 세부 정보를 확인할 수 없었습니다. 이제 병합 인덱스의 디스크 사용량과 세그먼트 정보, 검색어(term) 정보를 기존 메타데이터 조회 명령어로 함께 확인할 수 있습니다.

  • system-index-disk-usages 명령어의 type 필드에 병합 인덱스를 나타내는 merged_fulltext 값이 추가되었습니다. 병합 인덱스가 있는 파티션은 기존 fulltext, bloomfilter 레코드와 함께 merged_fulltext 레코드가 반환됩니다.
  • system-index-blocks 명령어는 일반 세그먼트와 병합된 세그먼트를 하나의 조회 결과로 함께 반환합니다. blockoffset, blocklimit 옵션은 각 파티션의 일반 세그먼트와 병합 세그먼트를 합친 블록 스트림을 기준으로 적용됩니다(파티션마다 각각 적용됩니다).
  • system-indices 명령어의 storage_consumption 필드(verbose=t)가 병합 인덱스 디렉터리의 용량까지 포함해 계산하도록 개선되어, 인덱스가 실제로 사용하는 디스크 용량을 더 정확하게 확인할 수 있습니다.
system-index-disk-usages table=SONAR_EVENTS
| search type == "merged_fulltext"

system-index-blocks table=SONAR_EVENTS index=default_idx blocklimit=100

함께 적용된 변경 사항: 종료 시 인덱스 처리 방식 개선과 인덱스 생성 작업 도입

소나를 종료할 때 온라인 인덱스를 즉시 정리해 종료 시간을 줄였습니다. 기존에는 소나가 종료될 때 적재 중인 테이블마다 스토리지와 온라인 인덱스의 메모리 버퍼를 각각 디스크에 기록해, 적재 부하가 큰 환경에서는 종료가 오래 걸렸습니다. 이제 종료할 때 온라인 인덱스의 메모리 버퍼를 디스크에 기록하지 않고 정리하며, 빠질 수 있는 역인덱스 구간은 다음 세 경로로 채웁니다.

  • 자동 실행: 매일 05:03에 최근 7일(기본값) 범위에서 그저께 이전 파티션을 대상으로 인덱스 생성 작업을 실행합니다.
  • era 전환 후속 인덱싱: 같은 날짜에서 파티션 era(세대 번호)가 바뀌면 이전 era 파티션에서 빠진 인덱스 구간을 채웁니다.
  • 수동 실행: completeIndex 스크립트로 생성 작업을 직접 실행할 수 있습니다.

생성 작업 대상에서는 당일과 어제 파티션, 현재 쓰기 중인 파티션, 이미 병합 포맷으로 전환된 파티션을 제외합니다. 과거에 확인된 부작용을 피하고 자동 병합으로 줄인 디스크 입출력이 다시 늘어나지 않도록 하기 위해서입니다. 생성 작업이 도는 중에 인덱스 자동 병합이 같은 파티션을 병합해도, 기록하기 직전에 다시 확인하므로 이전 형식의 인덱스가 다시 만들어지지 않습니다. 이때 채우지 못한 구간은 다음 생성 작업에서 처리하며 검색 결과에는 영향이 없습니다. 블룸필터의 임시 세그먼트 생성 작업은 인덱스 생성 작업(05:03) 이후인 05:13에 실행됩니다.

생성 작업 대상 기간은 index_completer_max_period 설정(기본값 7, 0으로 설정하면 비활성)으로 조정할 수 있습니다. 별도 조치 없이 업그레이드 후 적용되며, 종료 직후부터 다음 생성 작업이 실행되기 전까지는 일부 파티션의 인덱스에 빠진 구간이 남을 수 있습니다. 수동 실행(completeIndex)에서도 당일과 어제 파티션은 대상에서 제외되며, D일 파티션은 D+2일 05:03부터 생성 작업 대상이 됩니다.

함께 적용된 변경 사항: 롤오버의 파티션 분할 기준

인덱스 병합과 파티션 경계를 맞추기 위해, 롤오버가 파티션 경계를 새로 긋는 주기를 하루 한 번으로 통일했습니다. 이전에는 롤오버가 실행될 때마다 경계를 그어, 하루에 롤오버가 여러 번 도는 환경에서 같은 날짜의 파티션이 잘게 쪼개졌습니다. 이번 변경으로 하루 안에 롤오버가 반복되어도 파티션이 추가로 나뉘지 않습니다.

다만 디스크가 실제로 가득 차서 실행되는 응급 롤오버는 예외로, 진입할 때 한 번 경계를 긋습니다. 적재 중인 파티션은 경계를 긋기 전에는 이동 대상이 되지 않아, 대량 백필이나 유입 급증으로 당일 데이터가 디스크를 채운 경우 공간을 비우지 못하고 적재가 멈출 수 있기 때문입니다. 보관 용량 초과(소프트 쿼터)로 실행되는 일반 롤오버는 예외가 아닙니다.

함께 적용된 변경 사항: 이중화 롤오버 대기 한계

이중화 구성에서 파티션이 큰 경우 스탠바이 노드의 롤오버가 응답 대기 한계에 걸려 실패하던 문제를 해결했습니다. 이 대기 한계를 다른 복제 통신과 분리해 넉넉하게 늘렸으며, 파티션이 더 큰 환경에서는 설정으로 조정할 수 있습니다.

확인·조치 사항

  • 인덱스 저장 경로가 확장 속성(xattr)을 지원하지 않는 파일 시스템이면 자동 병합이 동작하지 않습니다. 이 경우 수동 병합 명령은 사용할 수 있으며, 자동 병합이 동작하지 않는다는 사실은 로그로 안내됩니다.
  • 사이클당 작업량 상한(index_freeze_marker_max_merge_mb_per_run)은 기본적으로 꺼져 있습니다. 대량 적재 환경에서는 설정을 권장합니다. 이 상한을 이미 켜 두었고 병합 주기도 기본값을 쓰고 있었다면, 하루 병합 회차가 4회에서 2회로 줄어 하루 처리량도 절반이 됩니다. 상한값을 올리거나 병합 시각을 늘려 잡으세요.
  • 병합이 실행되는 시각이 티어 이동(롤오버) 시각과 겹치면 그날 이동이 다음 주기로 밀릴 수 있습니다. 롤오버 시각을 바꿔 쓰는 환경에서는 두 시각이 겹치지 않는지 확인하세요.
  • 파일 시스템 WORM 영역을 데이터 직접 복사(direct copy) 대상 티어로 사용하는 환경에서는 인덱스 병합을 권장하지 않습니다. 해당 영역은 덮어쓰기·삭제가 불가능해 병합 결과물을 다시 쓰거나 정리할 수 없습니다.