블룸 필터
블룸 필터 (Bloom Filters)
읽기 경로에서 Cassandra는 디스크의 데이터(SSTable)와 RAM의 데이터(memtable)를 병합해요. 요청된 파티션에 대해 모든 SSTable 데이터 파일을 확인하지 않기 위해, Cassandra는 블룸 필터(bloom filter)라는 데이터 구조를 사용해요.
출처: Bloom Filters
본문
블룸 필터는 확률적 데이터 구조로, Cassandra가 다음 두 상태 중 하나를 판단하게 해 줘요.
- 해당 파일에 데이터가 확실히 존재하지 않는다.
- 해당 파일에 데이터가 아마 존재한다.
블룸 필터는 주어진 SSTable에 데이터가 존재한다는 것을 보장할 수는 없지만, 더 많은 RAM을 소비하도록 허용하면 블룸 필터를 더 정확하게 만들 수 있어요. 운영자는 bloom_filter_fp_chance를 0과 1 사이의 float로 조정해 테이블별로 이 동작을 튜닝할 수 있어요.
bloom_filter_fp_chance의 기본값은 LeveledCompactionStrategy를 사용하는 테이블의 경우 0.1이고, 그 외 모든 경우 0.01이에요.
블룸 필터는 RAM에 저장되지만 오프힙(offheap)으로 저장돼요. 따라서 운영자는 최대 힙 크기를 선택할 때 블룸 필터를 고려하지 않아야 해요. 정확도가 높아질수록(bloom_filter_fp_chance가 0에 가까워질수록) 메모리 사용량은 비선형적으로 증가해요. bloom_filter_fp_chance = 0.01인 블룸 필터는 bloom_filter_fp_chance = 0.1인 동일한 테이블보다 약 3배 많은 메모리가 필요해요.
bloom_filter_fp_chance의 일반적인 값은 보통 0.01(1%)에서 0.1(10%) 사이의 오탐(false-positive) 확률이에요. 이 범위에서 Cassandra가 SSTable을 스캔했는데 행이 디스크에 없는 것을 발견하게 될 수 있어요. 이 파라미터는 사용 사례에 따라 튜닝해야 해요.
- RAM이 많고 디스크가 느린 사용자는 과도한 IO 연산을 피하기 위해
bloom_filter_fp_chance를 더 낮은 숫자(예: 0.01)로 설정하는 것이 유리해요. - RAM이 적고 노드가 더 조밀하거나 매우 빠른 디스크를 가진 사용자는 과도한 IO 연산을 감수하면서 RAM을 아끼기 위해 더 높은
bloom_filter_fp_chance를 허용할 수 있어요. - 읽기가 드물거나 전체 데이터셋을 스캔해서만 읽는 워크로드(예: 분석 워크로드)에서는
bloom_filter_fp_chance를 훨씬 높은 숫자로 설정하는 것이 허용돼요.
변경하기 (Changing)
블룸 필터 오탐 확률은 DESCRIBE TABLE 출력에서 bloom_filter_fp_chance 필드로 볼 수 있어요. 운영자는 ALTER TABLE 문으로 값을 변경할 수 있어요.
ALTER TABLE keyspace.table WITH bloom_filter_fp_chance=0.01
단, 이 변경이 즉시 적용되지는 않는다는 점을 알아야 해요. 블룸 필터는 파일이 쓰일 때 계산되고 SSTable의 Filter 컴포넌트로 디스크에 저장돼요. ALTER TABLE 문을 실행하면 디스크의 새 파일은 새 bloom_filter_fp_chance로 쓰이지만, 기존 SSTable은 컴팩션될 때까지 수정되지 않아요. bloom_filter_fp_chance 변경을 즉시 적용해야 한다면 nodetool scrub 또는 nodetool upgradesstables -a를 사용해 SSTable 재작성을 트리거할 수 있어요. 둘 다 디스크의 SSTable을 재구축하며, 그 과정에서 블룸 필터를 재생성해요.