sstableofflinerelevel — SSTable 오프라인 릴레벨링
sstableofflinerelevel — SSTable 오프라인 릴레벨링
LeveledCompactionStrategy를 사용할 때, 최근 부트스트랩된 노드에서 SSTable이 L0에 쌓여(blocked) 컴팩션이 따라잡지 못하는 경우가 있어요. 이 도구는 SSTable을 가능한 가장 높은 레벨로 올려주는 데 사용합니다.
관련 문서: CASSANDRA-8301
이 방식은 다음과 같아요. SSTable을 마지막 토큰(last token) 기준으로 정렬합니다. 원래의 레벨링이 이렇게 있다고 할 때([ ]는 토큰 경계를 나타내며, 디스크상의 SSTable 크기가 아님에 주의하세요. 모든 SSTable은 같은 크기입니다):
L3 [][][][][][][][][][][]
L2 [ ][ ][ ][ ]
L1 [ ][ ]
L0 [ ]
이것을 L0으로 내린 뒤 마지막 토큰으로 정렬하면 다음과 같이 보입니다(겹침을 보여주기 위해 겹치는 것들은 새 줄에 배치했습니다):
[][][]
[ ][][][]
[ ]
[ ]
...
그런 다음 가장 작은 마지막 토큰부터 반복하면서, 겹침(overlap)을 일으키지 않는 모든 SSTable을 한 레벨에 추가합니다. 원래의 레벨링을 위에서 아래로 재구성하게 되는 셈이에요. SSTable을 레벨에 추가할 때마다 정렬된 목록에서 제거합니다. 정렬된 목록의 끝에 도달하면 하나의 완전한 레벨이 되고, 그 아래 레벨부터 다시 시작합니다.
예상보다 많은 레벨이 나오게 되면, 예상치를 초과하는 모든 레벨을 L0에 둡니다. 예를 들어 원래의 L0 파일은 대부분 다른 많은 SSTable과 겹치므로 대개 자기만의 레벨에 배치됩니다.
이 도구 실행 전에 Cassandra를 반드시 중지해야 해요. 그렇지 않으면 예상치 못한 결과가 발생할 수 있으며, 스크립트는 Cassandra가 정지되었는지 검증하지 않습니다.
본문
기본 사용법은 다음과 같습니다.
sstableofflinerelevel [--dry-run] <keyspace> <table>
드라이 런(dry run) 하기
--dry-run 옵션을 사용하면 현재 레벨 분포와 변경 후 예상되는 레벨을 확인할 수 있어요.
예시:
sstableofflinerelevel --dry-run keyspace eventlog
For sstables in /var/lib/cassandra/data/keyspace/eventlog-6365332094dd11e88f324f9c503e4753:
Current leveling:
L0=2
Potential leveling:
L0=1
L1=1
릴레벨 실행
예시:
sstableofflinerelevel keyspace eventlog
For sstables in /var/lib/cassandra/data/keyspace/eventlog-6365332094dd11e88f324f9c503e4753:
Current leveling:
L0=2
New leveling:
L0=1
L1=1
키스페이스 또는 테이블을 찾을 수 없는 경우
유효하지 않은 키스페이스 또는 테이블을 지정하면 예외가 발생합니다.
예시:
sstableofflinerelevel --dry-run keyspace evenlog
Exception in thread "main" java.lang.IllegalArgumentException: Unknown keyspace/columnFamily keyspace1.evenlog
at org.apache.cassandra.tools.SSTableOfflineRelevel.main(SSTableOfflineRelevel.java:96)