Database/Cassandra

[Cassandra] Compression Configuration

bisi 2020. 6. 3. 11:59

Compression

카산드라는 기본적으로 테이블당 어떻게 압축할지 옵션을 제공한다. 

압축은 chunk_length_in_kb을 사용하면  SSTable을 압축하면서 디스크의 사이즈를 감소 시킨다.

 

카산드라 SSTable은 불변(immutable)하는 속성을 가지기때문에 SSTable이 쓰여질때 압축을 위한 CPU 비용이 필요하다. 후속으로 업데이트 되는 데이터는 다른 SSTable에 쓰여진다. 

그래서 카산드라는 데이터를 업데이트 할 때, 다시 압축을 풀 필요거나, 오버라이트 하거나 다시 압축할 필요가 없다. 

오직 읽을때 카산드라는 디스크에서 압축 청크(덩이리)를 찾고 압축 해제한 다음나머지 읽기 경로(디스크, 멤브럴의 데이터의 병합, 읽기 복구)를 진행합니다.

 

압축 알고리즘은 3개의 영역에서 주고 받는다.

 

  • 압축 속도(Compression) : 압축 알고리즘이 얼마나 압축을 빨리하는지를 의미한다. 데이터를 디스크 쓰기 전에 압축해야 하므로 플러시 및 압축 경로에서 중요하다. 
  • 압축 해제 속도(Decompression) : 압축 알고리즘이 데이터를 압축 해제하는 속도이다. 디스크에서 데이터를 전체 청크로 읽은 후 압축을 풀어야 데이터를 반환할 수 있으므로 읽기와 압축 경로에서 중요하다. 
  • 비율(Ratio) : 압축되지 않은 데이터의 비율을 의미한다. 카산드라는 일반적으로 압축되지 않은 크기에 대한 디스크의 데이터 크기로 측정한다. 예를 들어 비율은 0.5 크기의 데이터가 압축되지 않은 데이터 크기의 50%임을 의미한다. 테이블 당 비율을 nodetool tablestats의 SSTable Compression Ratio 항목에서 확인가능하다. 

 

 

카산드라는 기본적으로 이 영역에서 다른 상충 관계를 만드는 압축과 관련된 5가지 알고리즘을 제공한다. 압축 알고리즘 벤치마킹은 많은 요소 ( 압축 수준, 입력 데이터의 압축성, 기본 프로세스 클래스 등의 알고리즘 매개 변수 등)에 따라 달라 지지만, 다음 표는 응용 프로그램의 요구 사항에 따라 사용함으로 커스터마이징이 가능하다. 

아래는 압축 옵션에 따른 성능 표이다. (A가 상대적으로 좋은것, F가 상대적으로 안 좋은것을 의미한다.)

 

Compression Algorithm Cassandra Class Compression Decompression Ratio Cassandra Version
LZ4 LZ4Compressor A+ A+ C+ >=1.2.2
LZ4HC LZ4Compressor C+ A+ B+ >=3.6
Zstd ZstdCompressor A- A- A+ >=4.0
Snappy SnappyCompressor A- A C >=1.0
Deflate(zlib) DeflateCompressor C C A >=1.0

 

일반적으로 중요한 어플리케이션(대기시간 또는 처리량)의 성능을 말할땐, LZ4 선택이 가장 좋다. 왜냐하면 CPU 주기당 우수한 비율을 얻기 때문이다. 카산드라의 압축옵션의 기본값도 LZ4이다. 

 

그러나 저장공간이 중요한 어플리케이션(Disk footprint)은 Zstd 옵션이 좋다. 이 옵션은 LZ4보다 상당한 추가 공간을 얻을 수 있기때문이다.

 

Snappy는 이전 버전과의 호환성을 위해 유지되는 것이며, LZ4 옵션이 전형적으로 선호된다. 

Deflate는 이전 버전과의 호환성을 위해 유지되는 것이며, Zstd 옵션이 전형적으로 선호된다. 

 

Configuring Compression

 

압축은 테이블당 환경설정이 가능하다. CREATE TABLE, ALTER TABLE 명령어로 사용 가능하다. 

아래 3가지 옵션으로 압축 성능을 관리한다.

기본 옵션

  • class (기본값 : LZ4Compressor) : 클래스를 사용하여 압축 옵션을 설정할 수 있다. 빠른 압축은 LZ4Compressor와 SnappyCompressor이다. 그리고 압축 비율이 좋은것은 ZstdCompressor 과 DeflateCompressor이다.
  • chunk_length_in_kb (기본값 : 16KiB): 압축 청크 당 데이터의 킬로바이스 수를 지정한다. 여기서 큰 단점은 청크 크기가 클수록 압축 알고리즘에 더 많은 컨텍스트를 제공하고 비율을 개선하지만 디스크를 역 직렬화하고 더 읽기 위해서는 읽기가 더 필요하다는 것이다.
  • crc_check_chance (기본값 : 0.1): 카산드라가 데이터 손상을 방지하기 위해 읽기 중에 각 압축 청크의 체크섬을 확인할 가능성을 결정한다. 성능 문제임을 나타내는 증상이 없다면 카산드라의 데이터 손상에대한 유일한 보호 기능이므로 이 기능을 끄지 않는 것이 좋다. 

 

기본 옵션외에 LZ4Compressor, ZstdCompressor는 추가적인 옵션을 제공한다.

 

LZ4Compressor

  • lz4_compressor_type (기본값 : fast)  high(일명 LZ4HC) 비율 버전 또는 fast(일명 LZ4) 버전을 사용할지 정해야한다. high모드는 configuraable 레벨을 지원하여, 운영자가 lz4_high_compressor_level옵션을 통해 성능 <-> 비율 트레이드 오프를 조정할 수 있습니다 . 참고로 4.0 위에서는 Zstd을 사용하는 것이 바람직 할 수있다.
  • lz4_high_compressor_level  (기본값 : 9 ) : 1~17까지 숫자로 구성한다. 압축을 하는데 얼마나 많은 시간을 CPU에서 보내는지 에 대한 수치이다. 일반적으로 로우 레벨에서는 속도가 빠르고 압축 비율이 낮고, 하이 레벨에서는 속도가 느리고 압축비율을 크게 증가한다. 

ZstdCompressor

compression_level  (기본값 : 3 ) : -131072 ~ 22까지 숫자로 구성한다.  압축을 하는데 얼마나 많은 시간을 CPU에서 보내는지 에 대한 수치이다. 일반적으로 로우 레벨에서는 속도가 빠르고 압축 비율이 낮고, 하이 레벨에서는 속도가 느리고 압축비율을 크게 증가한다. 20~22는 울트라 레벨로 불리고 사용할땐 메모리를 많이 사용하기 때문에 주의해서 사용해야한다. 기본값은 3이고 Deflate를 사용하면 가장 좋은 선택이고, 1은 LZ4에 좋은 선택이다. 

 

적용 예시 

CREATE TABLE keyspace.table (id int PRIMARY KEY) WITH compression = {'class': 'LZ4Compressor'};
ALTER TABLE keyspace.table WITH compression = {'class': 'LZ4Compressor', 'chunk_length_in_kb': 64, 'crc_check_chance': 0.5};

아래와 같이 압축 비활성화도 가능하다. (enabled : false)

ALTER TABLE keyspace.table WITH compression = {'enabled':'false'};

 

그러나 압축 변경이 즉각적으로 변경되는 것은 아니다. SSTable을 쓸 때 데이터가 압축되고 SSTable을 변경할 수 없으므로 테이블이 압축될 때까지 압축이 수정되지 않는다. ALTER TABLE을 통해 수정된 압축 옵션은 다음 압축이 일어날 때까지 바로 수정되지 않는다. 만약 즉시 압축 옵션을 즉시 적용하고 싶다면 nodetool scrub 이나 nodetool upgradesstables -a명령어를 활용하면 된다.

 

 

 

참고사이트 

https://cassandra.apache.org/doc/latest/operating/compression.html