Open gimmizz opened 11 months ago
https://en.wikipedia.org/wiki/Bloom_filter
Bloom filter는 공간 효율적인 확률론적 데이터구조로, 요소가 집합의 구성원인지 여부를 테스트하는 데 사용된다. false positive는 가능하지만, false negative는 가능하지 않다. 즉 쿼리는 "possibly in set" or "definitely not in set" 반환한다.
[예시] black ip 집합 N=24인 bit array, 2개 hash function
hashFunction_1("192.170.0.1") : 2
hashFunction_2("192.170.0.1") : 6
hashFunction_1("75.245.10.1") : 4
hashFunction_2("75.245.10.1") : 10
hashFunction_1("10.125.22.20") : 10
hashFunction_2("10.125.22.20") : 19
이제 인입되는 IP가 black ip인지 테스트.
1.
hashFunction_1("75.245.10.1") : 4
hashFunction_2("75.245.10.1") : 10
2.
hashFunction_1("75.245.20.30") : 19
hashFunction_2("75.245.20.30") : 23
hashFunction_1("101.125.20.22") : 19
hashFunction_2("101.125.20.22") : 2
집합의 크기가 굉장히 크거나 집합의 속해있는 원소의 크기가 커서 원소가 집합에 속해있는지 정확히 판단하는데 시간이 오래걸리는 경우 이 과정의 전처리 과정으로 Bloom Filter를 이용해서 아예 집합에 속할 일이 없는 원소를 미리 걸러낼 수 있다.
Facebook에서 초기 설계되었으며, 아마존의 분산화된 스토리지 기술과 구글 빅테이블의 replication 기법을 같이 구현하기 위해 SEDA 아키텍쳐를 사용한다.
static
{
stages.put(Stage.MUTATION, multiThreadedConfigurableStage(Stage.MUTATION, getConcurrentWriters()));
stages.put(Stage.READ, multiThreadedConfigurableStage(Stage.READ, getConcurrentReaders()));
stages.put(Stage.REQUEST_RESPONSE, multiThreadedStage(Stage.REQUEST_RESPONSE, FBUtilities.getAvailableProcessors()));
stages.put(Stage.INTERNAL_RESPONSE, multiThreadedStage(Stage.INTERNAL_RESPONSE, FBUtilities.getAvailableProcessors()));
stages.put(Stage.REPLICATE_ON_WRITE, multiThreadedConfigurableStage(Stage.REPLICATE_ON_WRITE, getConcurrentReplicators(), MAX_REPLICATE_ON_WRITE_TASKS));
// the rest are all single-threaded
stages.put(Stage.GOSSIP, new JMXEnabledThreadPoolExecutor(Stage.GOSSIP));
stages.put(Stage.ANTI_ENTROPY, new JMXEnabledThreadPoolExecutor(Stage.ANTI_ENTROPY));
stages.put(Stage.MIGRATION, new JMXEnabledThreadPoolExecutor(Stage.MIGRATION));
stages.put(Stage.MISC, new JMXEnabledThreadPoolExecutor(Stage.MISC));
stages.put(Stage.READ_REPAIR, multiThreadedStage(Stage.READ_REPAIR, FBUtilities.getAvailableProcessors()));
stages.put(Stage.TRACING, tracingExecutor());
}
카산드라와 같은 시스템은 다음 설계 목표를 가진다.
https://cassandra.apache.org/doc/latest/cassandra/architecture/
위 다이어그램에서는 단일 클러스터가 포함된 인스턴스 하나를 보여주지만, 클러스터를 추가하여 데이터를 복제할 수 있음. 이를 통해 데이터 가용성과 내구성이 향상
WashingtonDC#201803061617
https://static.googleusercontent.com/media/research.google.com/ko//archive/bigtable-osdi06.pdf https://cloud.google.com/bigtable/docs/overview?hl=ko
위의 방식으로 했으니 만약 머클루트가 다르면 데이터가 다를 수 밖에 없음 머클트리로 위조된 거래인지 확인하는 법은 다음과 같음
1e3a
와 af3d
뿐반대로 찾아갈때도 유용 (이미지 복사가 안되니 페이지에서 설명)
참고
8/16(수) 휴가라서, 그 다음 스터디 시간에 발표하겠습니다~
SSTable and Log Structured Storage: LevelDB
SSTable: Sorted String Table
SSTable and BigTable: Fast random access?
SSTables and Log Structured Merge Trees
flushed
된다. 이미 키로 정렬된 key-value pair 를 유지하기 때문에, SSTable 세그먼트를 생성하게 되는 것.flush
동안의 write 연산은 새로운 Memtable 에 기록된다.SSTable 에 대한 index 를 유지할 수도 있다.
Merge 가 쉽고 빠르다
Amelia:5000
->Anthony:4000
->Emma:3000
의 순서가 되겠다.LSM & SSTables: Updates, Deletes and Maintenance
tombstone record
가 추가되고, 추후 merge 과정에서 제거된다.SSTables and LevelDB
참고