회사에서 발표한 자료를 공유합니다.
원제목: 다이나모: 아마존의 고가용성 키-값 저장소
서비스가 요청의 99.9% 에 대해 300ms 이내에 응답 (일정한 시간 초 내에 응답)
→ constant 한 latency 를 보장하기 위해서는 index로 B tree를 사용하는데 무리가 있다.
디스크 장애가 발생하거나,네트워크 문제가 생기던가,토네이도로 인해 데이터 센터가 망가져도 사용가능해야한다.
→ 고가용성이 매우 중요하다.
→ 다중화가 매우 용이한 구조여야 한다.
→ 다중화 하면서 중요한 데이터 전파, 장애 복구, 정합성 보장 등을 잘 처리해야한다.
pk 접근 하여 읽거나 저장하는 등의 복잡도만 가지고 있고 복잡한 쿼리나 RDBMS에서 제공하는 조인, pk 쿼리등 관리 기능을 사용하지는 않는다.
→ index 를 hash 로 써보면 좋지 않을까?
데이터 정합성은 엄격하지 않아도 되고, 1초 이내에 맞춰지면 된다.
hash(key) % len(node)
→ 가상 노드 도입으로 해결
→ 고르게 분산 할 수 있다. (뭉칠 가능성이 줄어든다)
→ 성능에 맞게 가상 노드 갯수를 조절하여 성능에 맞는 부하를 줄 수 있다.
CAP 이론
)Quorum (정족수) 뜻
replica 끼리 일관성을 보장하기 위한 read/write 설정
N=3, R=2, W= 2
(N, R, W) 설정은 많은 다이나모 인스턴스에서 일반적으로 (3, 2, 2)으로 사용된다. 이 값은 SLA에서 요구하는 수준의 성능, 내구성, 일관성, 가용성을 충족하기 위한 것이다.
약한 일관성 보장을 사용하면 장애가 없는 상황에서도 꽤 자주 사용자가 의도치 않게 업데이트 되지 않은 상황을 경험하게 됨
상황 1
상황 2
- 서버 1 에서 john → johnSanFancisco , 서버 2에서 john→johnNewyork 을 한 순간
- → conflict 라서 둘 중 하나를 포기하여야 한다.
→ 만약 set , array 라면 더 복잡해진다.
다음 실험에서, 장바구니 서비스에 반환된 버전의 개수는 24시간 동안 집계되었다. 이 기간 동안 요청의 99.94%는 단 하나의 버전을 응답받았다. 요청의 0.00057%는 두 개의 버전을 받았고, 요청의 0.00047%는 3개 버전, 요청의 0.00009%는 4개 버전을 받았다. 이는 버전 분기가 거의 일어나지 않음을 보여준다.
노드가 죽었다가 다시 살아났을때, 모든 사본을 다 옮기는 일은 오래 걸린다.
레플리카 사이의 불일치를 빠르게 감지하기 위해, 그리고 전송 데이터의 양을 최소화하기 위해 머클 트리를 사용하여 비교한다.
머클 트리는 리프 노드가 개별 키에 대한 값의 해시인 해시 트리이다.
storage를 어떻게 머클 트리로 유지하지?
key space가 1-12 까지 라면
1단계
2단계
각 key의 value 를 hash 하여 값을 계산한다.
3단계
4단계