책 리뷰/가상 면접 사례로 배우는 대규모 시스템 설계 기초
가상 면접 사례로 배우는 대규모 시스템 설계 기초 - 6장
eess
2024. 9. 4. 17:01
🔖 6장 : 키-값 저장소 설계
읽은 날짜 : 2024.09.04
지은이 : 알렉스 쉬
출판사 : 인사이트
기억하고 싶은 내용
키-값 저장소
- 비 관계형 데이터베이스
- 고유 식별자를 키로 가져야 하고, 값은 키를 통해서만 접근할 수 있다.
- 키는 짧을수록 좋고, 값은 무엇이든 된다.
- e.g. AWS DynamoDB, Redis, Cassandra, BigTable
단일 서버 키-값 저장소
- 가장 직관적인 방법은 키-값 전부를 메모리에 해시 테이블로 저장하는 것.
- 메모리의 한계를 해결하기 위해 아래와 같은 방법이 있지만, 서버 한 대로 부족할 때가 도래한다.
- 데이터 압축
- 자주 쓰이는 데이터만 메모리에 두고 나머지는 디스크에 저장
분산 키-값 저장소
- 키-값 쌍을 여러 서버에 분산시킨다.
- 분산 시스템을 설계할 때 CAP 정리를 이해해야 한다.
CAP 정리
- 데이터 일관성(Consistency), 가용성(Availablility), 파티션 감내(Partition Tolerance theorem)의 세 가지 요구사항을 동시에 만족하는 분산 시스템을 설계하는 것은 불가능하다는 정리.
- 어떤 두 가지를 충족하면 나머지 하나는 반드시 희생된다.
- 데이터 일관성 : 분산 시스템에 접속하는 모든 클라이언트는 어떤 노드에 접속하더라도 언제나 같은 데이터를 봐야 한다.
- 가용성 : 분산 시스템에 접속하는 클라이언트는 일부 노드에 장애가 발생해도 항상 응답을 받아야 한다.
- 파티션 감내 : 네트워크에 파티션(두 노드 사이의 통신 장애)이 생기더라도 시스템은 계속 동작해야 한다.
- 실세계 시스템에서 네트워크 장애는 피할 수 없으므로 분산 시스템은 파티션 감내를 반드시 충족하도록 설계되어야 한다. 따라서 CP, AP 시스템은 있지만 CA 시스템은 존재하지 않는다.
이상적인 상태 vs 실세계의 분산 시스템
- 이상적인 환경이라면 네트워크 파티션은 절대 발생하지 않고, 복제(replica) 노드에 데이터를 복제하여 보관한다.
- 실세계에서는 파티션을 피할 수 없으며, 데이터 일관성과 가용성 중 하나를 선택해야 한다.
- 데이터 일관성 선택 : n1, n2에 대해 쓰기 연산을 중단해야 하는데, 그러면 가용성이 깨진다.
- 은행권 시스템은 데이터 일관성을 더 중요하게 생각해서 상황이 해결될 때까지 오류를 반환한다.
- 가용성 선택 : n1, n2에 대해 읽기/쓰기 연산을 모두 허용하고, 파티션 문제가 해결된 후 새 데이터를 n3에 전송한다.
- 데이터 일관성 선택 : n1, n2에 대해 쓰기 연산을 중단해야 하는데, 그러면 가용성이 깨진다.
키-값 저장소의 핵심 시스템 컴포넌트
1. 데이터 파티션
- 데이터를 작은 파티션으로 분할한 후 여러 대의 서버에 저장한다.
- 파티션 단위로 나눌 때 고려해야 할 점 :
- 데이터를 여러 서버에 고르게 분산할 수 있는가
- 노드가 추가되거나 삭제될 때 데이터의 이동을 최소화할 수 있는가
- 안정 해시(consistent hash)를 활용하여 파티션을 나눈다.
- 서버와 키를 해시 링에 배치하고, 키가 링을 시계 방향으로 순회하다 만나는 첫 번째 서버가 해당 키-값 쌍을 저장할 서버다.
- 안정 해시를 사용하여 데이터를 파티션하면 좋은 점 :
- 시스템 부하에 따라 서버가 자동으로 추가되거나 삭제되도록 만들 수 있다.
- 각 서버 용량에 맞게 가상 노드의 수를 조정할 수 있다.
2. 데이터 다중화
- 데이터를 여러 개의 서버에 비동기적으로 다중화(replication)해야 한다.
- 어떤 키를 해시 링 위에 배치 후 시계 방향으로 순회하다가 만나는 첫 N개 서버에 데이터 사본을 저장한다. (N은 튜닝 가능한 값)
3. 데이터 일관성
- 여러 노드에 다중화된 데이터는 적절히 동기화가 되어야 한다.
- 정족수 합의(Quorum Consensus) 프로토콜을 사용하여 읽기/쓰기 연산 모두에 일관성을 보장할 수 있다.
- N : 사본 개수
- W : 쓰기 연산에 대한 정족수. 중재자가 최소한 W개의 서버로부터 쓰기 연산이 성공했다는 응답을 받아야 한다.
- R : 읽기 연산에 대한 정족수. 중재자가 최소한 R개의 서버로부터 읽기 연산이 성공했다는 응답을 받아야 한다.
- 중재자는 클라이언트와 노드 사이에서 프록시(proxy) 역할이다.
- N, W, R을 정하는 방법 ➡️ 요구되는 일관성 수준에 따라 조정한다.
- R = 1, W = N : 빠른 읽기 연산에 최적화된 시스템
- W = 1, R = N : 빠른 쓰기 연산에 최적화된 시스템
- W + R > N : 강한 일관성이 보장됨
- W + R ≤ N : 강한 일관성이 보장되지 않음
4. 일관성 모델
- 데이터 일관성의 수준을 결정한다.
- 강한 일관성
- 모든 읽기 연산은 가장 최근에 갱신된 결과를 반환한다.
- 모든 사본에 현재 쓰기 연산의 결과가 반영될 때까지 해당 데이터에 대한 읽기/쓰기를 금지하는 것
- 고가용성 시스템에는 적합하지 않다.
- 약한 일관성
- 읽기 연산은 가장 최근에 갱신된 결과를 반환하지 못할 수 있다.
- 결과적 일관성
- 약한 일관성의 한 형태로, 갱신 결과가 결국에는 모든 사본에 반영되는 모델.
- 다이나모, 카산드라 같은 저장소가 채택한 모델이다.
- 쓰기 연산이 병렬적으로 발생하면 일관성이 깨질 수 있는데, 이는 클라이언트가 데이터의 버전 정보를 활용해 일관성이 깨진 데이터를 읽지 않도록 한다.
5. 데이터 불일치 해소 기법 : 데이터 버저닝
6. 장애 처리
- 장애 감지
- 일시적 장애 처리
- 영구 장애 처리
- 데이터 센터 장애 처리
7. 시스템 아키텍처 다이어그램
8. 쓰기 경로
9. 읽기 경로
오늘 읽은 소감
궁금한 내용 & 잘 이해되지 않는 내용
정족수 합의(Quorum Consensus) 프로토콜
정족수
- 분산 시스템에서 어떤 작업을 수행하기 위해 필요한 최소한의 노드 수
- 쓰기 정족수(Write Quorum, W) : 데이터 쓰기 작업이 성공하기 위해 응답이 필요한 노드의 최소 수
- 읽기 정족수(Read Quorum, R) : 데이터 읽기 작업이 성공하기 위해 응답이 필요한 노드의 최소 수