HBase 는 셀마다 타임스탬프가 다른 여러 버전을 보관한다. 무엇을 남기고 무엇을 지울지는 컬럼 패밀리의 세 속성이 함께 정한다.
| 속성 | 기본값 | 역할 |
|---|---|---|
VERSIONS |
1 | 보관할 버전 수의 상한 |
MIN_VERSIONS |
0 | TTL 이 지나도 남겨 둘 최소 버전 수 |
TTL |
FOREVER | 셀이 만료되는 시간(초) |
MIN_VERSIONS 는 TTL 이 설정돼 있을 때만 의미가 있다. 값이 0 보다 크면, TTL 이 지난 셀이라도 남은 버전 수가 MIN_VERSIONS 미만이 되지 않도록 지우지 않는다.
이 동작이 필요한 이유는 분명하다. TTL 만 걸어 두면 오래 갱신되지 않은 행은 모든 버전이 만료되어 값 자체가 사라진다. 설정값이나 상태값처럼 "최신 값 하나는 반드시 있어야 하는" 데이터라면 곤란하다. MIN_VERSIONS=1 을 주면 아무리 오래돼도 마지막 값 하나는 남는다.
hbase> alter 'config', {NAME => 'cf', TTL => '2592000', VERSIONS => 5, MIN_VERSIONS => 1}
위 설정의 뜻은 "최대 5벌까지 보관하고, 30일이 지난 버전은 지우되, 마지막 한 벌은 남긴다" 이다.
TTL 이 FOREVER 인 상태에서 MIN_VERSIONS 만 올리면 효과가 없다. 지울 이유 자체가 없기 때문이다.
MIN_VERSIONS 는 원인의 하나일 뿐이고, 더 흔한 원인은 컴팩션이다. 순서대로 확인한다.
TTL 이 지나면 셀은 조회 결과에서 즉시 제외된다. 그러나 HFile 에서 실제로 사라지는 것은 major compaction 때다. minor compaction 은 파일을 합칠 뿐 만료된 셀을 걷어 내지 않는다. 따라서 디스크 사용량이 줄지 않는다고 TTL 이 안 먹는 것은 아니다.
hbase> major_compact 'mytable'
hbase> describe 'mytable'
alter 는 컬럼 패밀리 단위다. 패밀리 이름을 잘못 주면 조용히 다른 패밀리에 적용된다.
describe 출력의 MIN_VERSIONS 가 0 이 아니면 그만큼은 영원히 남는다. 전부 지워야 한다면 0 으로 되돌린다.
Put 에 개별 TTL 을 준 셀은 패밀리 TTL 과 별개로 동작한다. 단위가 밀리초라는 점에 주의한다.
VERSIONS 를 크게 잡으면 저장 용량과 스캔 비용이 함께 늘어난다. 이력이 필요 없다면 1 로 둔다.MIN_VERSIONS 를 VERSIONS 보다 크게 줄 수 없다.