SSTable, Bloom Filter, LSM Tree
rate limiter와 key-value store의 설계 진행하면서 아래의 개념들을 순서대로 확인해보았다
- 고가용성 rate limiter가 필요함
- rate limiter에서 사용하는 알고리즘 확인- token bucket
- leaky bucket (queue bucket)
- fixed window counter (단위 시간당 고정된 갯수)
- sliding window log (timestamp 기준으로 deprecate)
- sliding window counter (% 기반으로 count 추정)
 
- counter를 저장하기 위해서 고가용성, 분산 환경의 key-value store가 필요함
- 어떤 Node에 저장될지 결정해야 함 : Consistent Hash
- 고가용성, 데이터 다중화 : Quorum (N,R,W)
- 데이터 다중화 과정에서 동기화를 보장해야 함 : Client Side, Versioning, Vector Clock
- 장애를 탐지해야 함 : 가십 프로토콜
- 일시적인 장애를 감내해야 함 : Quorum (N,R,M)
- 영구적인 장애에서 데이터를 복구해야 함 : HashTable
위 과정까지 진행하면 대부분의 문제를 해결해서 데이터가 메모리 상에서 잘 관리됨을 보장할 수 있다. 다음으로는 메모리와 디스크 사이의 동기화 과정에 대해서 알아보아야 한다.
Bloom Filter
거대한 데이터 셋에서 특정 데이터가 존재하는지 아닌지 찾을 떄 사용한다.
- bloom filter return false : 데이터 셋에 존재하지 않음
- bloom filter return true : 존재할 수도 있고, 존재하지 않을 수도 있음
username을 등록할 때, 이미 해당 username이 이미 존재하는지 확인해야하는 경우가 있다.
이 때 bloom filter가 return false를 한다면, username을 사용할 수 있음이 보장된다.  
bloom filter는 확률에 기반한 접근 방법이라서 정확도가 떨어진다고 볼 수도 있지만,
공간의 제약을 개선해준다는 점에서 유의미한 장점을 가진다.
동작 과정
Bloom Filter는 2가지로 구성된다.
- Hash Function
- a bit array with Length N
ADD
하나의 데이터에 대해서 여러개의 Hash Function을 적용한다.
그리고 각 값을 a bit array의 길이로 moduler를 해서 bit array의 값을 0->1로 변경한다.
이미 1이라면 그대로 둔다.
- arr[func_1(x) % N]=1
- arr[func_2(x) % N]=1
- arr[func_3(x) % N]=1
CHECK
bloom filter에 이미 존재하는지 확인하고 싶은 값 y에 대해서 아래의 값을 확인한다
- arr[func_1(y) % N]=1
- arr[func_2(y) % N]=1
- arr[func_3(y) % N]=1
특징
- Collision이 발생할 수 있는 확률이 존재하기 떄문에 존재하지 않음만 보장할 수 있다.
- 삭제 연산을 지원하지 않는다. 수행하면 다른 key에도 영향이 가기 때문이다.
SSTable
- Sorted Strings Table 
- Apache Cassandra, BigTable에서 사용하는 데이터 저장 포멧 
- SSTable은 Disk에서 데이터를 File에 효율적으로 저장하기 위한 포멧 - 데이터 블록(data blocks): 실제 키–값 쌍이 담긴 압축된 블록
- 인덱스 블록(index blocks): 블록별 최소·최대 키 정보
 
- 전체 데이터가 아닌 일부 데이터만 사용해서 Index 검색을 수행한다 
- 특징 - File로 저장되기 때문에 persistent함
- append only를 지원해서 immutable함 (timestamp가 변경되면서 동일한 데이터가 중복해서 저장될 수 있음)
 
- 전체 데이터셋에 대한 Bloom Filter를 관리하여, 찾는 데이터의 key가 존재하는지 아닌지 확인한다 
- key가 존재한다면 데이터 블록의 최소, 최대 값으로 SSTable을 특정하고, 특정된 디스크를 열어서 Value를 확인한다 
- 데이터가 정렬되어 있음을 가정되어 있기 때문에, 어떤 SSTable에 저장되어있는지 확인이 가능하고, 특정된 디스트 내에서도 빠르게 데이터를 찾을 수 있다. 
- B-Tree는 균형 잡힌 데이터 구조를 지원해서 Sequential, Random Access에서 균형잡힌 성능을 보여주고 
- SSTable은 LSM Tree와 함께 사용되어 Heavy Write 상황에서 적합하다 
LSM Tree
- Log-Structured-Merge Tree
- SSTable, Bloom Filter를 사용해서 데이터를 효율적으로 저장하는 구조
- write에 대한 정보를 먼저 WAL에 저장 
- Memory에 Write 
- 임계치에 도달하면 Memory에서 Disk에 SSTable 구조로 flush 
- compression : 작은 파일로 구성된 SSTable을 하나의 큰 SSTable로 합치기 (Read 및 저장 공간 호율 개선) - SSTable은 immutable이기 때문에 timestamp가 변경되면서 동일한 데이터가 중복해서 저장될 수 있음
- key 정렬
- key에 version이 포함된 경우, 최신 버전만 남기기
- File로 저장하면서 적절한 단계로 SSTable의 Layer를 나누어서 단계적으로 압축해서 저장함
 
- 조회 과정 - Memory
- SSTable에 데이터가 존재하는지 확인 (Bloom Filter)
- 존재한다면 리턴
- 존재하지 않으면 다음 SSTable에서 조회
 
Reference
'DEV > System Design' 카테고리의 다른 글
| Memory와 Disk의 동기화 (SSTable, Bloom Filter) (0) | 2025.05.05 | 
|---|---|
| 키-값 저장소 설계 (0) | 2025.05.05 | 
| 안정 해시 Consistent Hash (0) | 2025.05.04 | 
| 처리율 제한 장치, Rate Limiter (0) | 2025.05.04 | 
| Google File System 뜯어보기 - Memory Mapped I/O (0) | 2025.04.24 |