참고
키-값 저장소 설계
NOTE
키-값 저장소를 직접 설계해본다!
최종 아키텍쳐
요구사항에 따른 기술사용
•
키-값 쌍의 크기는 10kb 이하이다.
•
큰 데이터를 저장할 수 있어야 한다.
•
높은 가용성을 제공해야 한다. 따라서 시스템은 설사 장애가 있떠라도 빨리 응답해야 한다.
•
높은 규모 확장성을 제공해야 한다. 따라서 트래픽 양에 따라 자동적으로 서버 증설/삭제가 이루어져야 한다.
•
데이터 일관성 수준은 조정이 가능해야 한다.
•
응답 지연시간(latency)이 짧아야 한다.
단일 키-값 저장소
NOTE
가장 직관적인 방법으로 key-value 쌍을 메모리에 해시테이블로 저장하는 것이다!
•
빠른 속도를 보장하긴 하지만, 모든 데이터를 한 메모리 안에 두는 것이 불가능할 수 있다.
•
이에 대한 개선책
◦
데이터 압축(compression)
◦
자주 쓰이는 데이터만 메모리에 두고, 나머지는 디스크에 저장하기.
•
하지만 단일 서버는 결국 한계가 있으므로, 분산 키-값 저장소를 설계해보자!
분산 키-값 저장소
CAP 정리
NOTE
3가지를 모두 만족시킬 수 없다. (2가지를 충족시키는것이 최선)
•
Consistency (일관성)
◦
분산 시스템에 접속하는 모든 클라이언트는 어떤 노드에 접속했느냐에 관계없이, 언제나 같은 데이터를 봐야한다.
•
Availability (가용성)
◦
분산 시스템에 접속하는 클라이언트는 일부 노드에 장애가 발생해도, 항상 응답을 받을 수 있어야 한다.
•
Partition tolerance (분할 내구성)
◦
파티션은 두 노드 사이에 통신 장애가 발생하였음을 의미한다.
◦
파티션 감내는 네트워크에 파티션이 생기더라도 시스템은 계속 동작하여야 한다는 의미이다.
▪
분할된 네트워크 환경에서 동작하는 시스템에서 두 네트워크가 단절되거나 네트워크 데이터의 유실이 있어도 정상적으로 동작해야 함이라는 의미
3개의 서버중 하나의 서버에서 문제를 일으킨다.
•
CP 시스템
◦
일관성과 파티션 감내를 지원하는 구조
◦
서버간 데이터 불일치 위험이 있더라도 계속해서 읽기 연산을 허용한다.
◦
가용성을 희생한다.
•
AP 시스템
◦
가용성과 파티션 감내를 지원하는 구조
◦
서버간 데이터 불일치 문제를 피하기 위해 나머지 서버에서도 쓰기 연산을 중단시킨다.
◦
데이터 일관성을 희생한다.
•
CA 시스템
◦
일관성과 가용성을 지원하는 구조
◦
그러나 통상 네트워크 장애는 피할 수 없는 일로 여겨지므로, 분산 시스템은 반드시 파티션 문제를 감내할 수 있도록 설계해야 한다. ( 실제 설계상에서 거의 존재하지 않음 )
데이터 파티션
NOTE
대규모 애플리케이션의 데이터를 1대의 서버가 아닌, 파티션으로 분리해 여러 대의 서버로 저장하는 방식!
데이터를 파티션으로 나눌때 고려되는 문제를 안정 해시를 사용해서 해결할 수 있다.
•
데이터를 여러 서버에 고르게 분산할 수 있는가?
◦
가상노드의 수를 조정해서 가능
•
노드가 추가되거나 삭제될 때 데이터의 이동을 최소화할 수 있는가?
◦
안정 해시는 추가/삭제 단계에서 이동을 최소화할 수 있다.
데이터 다중화
NOTE
높은 가용성과 안정성을 위해 데이터를 N개의 서버에 비동기적으로 다중화해야 한다!
키의 시계 방향으로 링을 순회하면서 만나는 첫 N개의 서버에 데이터 사본을 저장!
•
가상 노드를 사용한다면 선택한 N개의 노드가 실제 물리 서버보다 작을 수 있다.
•
이 문제를 피하려면 노드를 선택할 때 같은 물리 서버를 중복 선택하지 않도록 해야 한다.
데이터 일관성 - 정족수 합의
NOTE
여러 노드에 다중화된 데이터는 적절한 동기화가 되어야 한다!
서버 3대가 동기화를 하는 과정
•
N
◦
사본 개수
•
W
◦
쓰기 연산에 대한 정족수
◦
쓰기 연산이 성공한 것으로 간주되려면 적어도 W개의 서버로부터응답을 받아야 한다.
•
R
◦
읽기 연산에 대한 정족수
◦
읽기 연산이 성공한것으로 간주되려면 적어도 R개의 서버로부터 응답을 받아야 한다.
•
R = 1, W = N (빠른 읽기 연산에 최적화된 시스템)
•
W = 1, R = N (빠른 쓰기 연산에 최적화된 시스템)
•
W + R > N (강한 일관성이 보장된다)
•
W + R ≤ N (강한 일관성이 보장되지 않는다)
일관성 모델
NOTE
데이터의 일관성의 수준을 결정하는데 종류가 다양하다!
•
강한 일관성
◦
모든 읽기 연산은 가장 최근에 갱신된 결과를 반환한다.
◦
클라이언트는 절대 낡은 데이터를 보지 못한다.
•
약한 일관성
◦
읽기 연산은 가장 최근에 갱신된 결과를 반환하지 못할 수 있다.
•
최종 일관성
◦
약한 일관성에 속하며, 갱신 결과가 모든 사본에 반영이 되는 모델.
비 일관성 해소 기법 - 데이터 버저닝
NOTE
최종 일관성 모델을 따르는 경우 일관성이 깨질 수 있는데 이때 versioning, vector clock을 사용한다!
D3와 D4에 대해서 충돌을 해소해줘야 한다.
•
버저닝
◦
데이터 변경마다 데이터의 새로운 버전을 만든다.
◦
각 버전의 데이터는 불변하다.
•
벡터 시계
◦
서버 1,2가 같은 키값에 대해 서로 다른 값을 가지고 있다면 어떻게 충돌을 피하는가?
◦
벡터시계를 통해 어떤 버전이 선행,후행인지 판단해서 해결한다.
◦
충돌에 대해서 감지할 수 만 있으며, 충돌 해소를 위해서는 다른 옵션이 추가되어야 한다.
◦
버전 벡터 노드수가 늘어남에 따라 연산에 드는 비용이 늘어난다.