data-tech-newbie / system-design-interview

System Design Interview An Insider’s Guide by Alex Xu - Study
0 stars 0 forks source link

Chapter 6: Design a key-value store #4

Open gimmizz opened 11 months ago

gimmizz commented 11 months ago

8/16(수) 휴가라서, 그 다음 스터디 시간에 발표하겠습니다~

SSTable and Log Structured Storage: LevelDB

https://www.igvita.com/2012/02/06/sstable-and-log-structured-storage-leveldb/

SSTable: Sorted String Table

image

SSTable and BigTable: Fast random access?

SSTables and Log Structured Merge Trees

we also want to support fast random writes. Google 의 BigTable 은 이를 어떻게 구현해냈을까?

SSTable 에 대한 index 를 유지할 수도 있다.

image

Merge 가 쉽고 빠르다

image

LSM & SSTables: Updates, Deletes and Maintenance

SSTables and LevelDB

참고

hyeriful commented 11 months ago

Bloom filter

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
image
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
  1. false-positive
    hashFunction_1("101.125.20.22") : 19 
    hashFunction_2("101.125.20.22") : 2

언제 사용하면 되지?

집합의 크기가 굉장히 크거나 집합의 속해있는 원소의 크기가 커서 원소가 집합에 속해있는지 정확히 판단하는데 시간이 오래걸리는 경우 이 과정의 전처리 과정으로 Bloom Filter를 이용해서 아예 집합에 속할 일이 없는 원소를 미리 걸러낼 수 있다.

matteblack9 commented 11 months ago

Cassandra architecture

Cassandra

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());
}

카산드라와 같은 시스템은 다음 설계 목표를 가진다.

Cassandra의 특징

image image


image

image

image

image

image

image

https://cassandra.apache.org/doc/latest/cassandra/architecture/

jiyoungjha commented 11 months ago

Bigtable: A Distributed Storage System for Structured Data

개요

장점

스토리지 모델

image

row key, column family, column qualifier

셀, 타임스탬프

아키텍처

image

태블릿 서버

태블릿

데이터는 Bigtable 노드 자체에 저장되지 않는다

부하 분산

쓰기 성능 향상을 위한 row key 설계

https://static.googleusercontent.com/media/research.google.com/ko//archive/bigtable-osdi06.pdf https://cloud.google.com/bigtable/docs/overview?hl=ko

Enoch-Kim commented 11 months ago

Merkle tree

구조

5

  1. 각 데이터들을 암호화하여 리프노드를 생성
  2. 인접한 노드들을 암호화하여 부모 노드 생성
  3. 이를 반복하여 루트 노드까지 생성

위의 방식으로 했으니 만약 머클루트가 다르면 데이터가 다를 수 밖에 없음 머클트리로 위조된 거래인지 확인하는 법은 다음과 같음

6

  1. 개인에게는 리프 거래만 가지고 있다고 함 (TX7을 가지고 있다 침)
  2. 위의 TX7이 맞는지 확인하고 싶음 -> 가진게 1e3aaf3d
  3. 위의 검은 노드들을 받아 해시해나가면서 루트까지 검증이 맞는지 확인

반대로 찾아갈때도 유용 (이미지 복사가 안되니 페이지에서 설명)

https://www.banksalad.com/contents/%EC%89%BD%EA%B2%8C-%EC%84%A4%EB%AA%85%ED%95%98%EB%8A%94-%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%EB%A8%B8%ED%81%B4%ED%8A%B8%EB%A6%AC-Merkle-Trees-%EB%9E%80-ilULl

참고