어흥

[대규모 시스템 설계] 6. 키-값 저장소 설계 - 3 본문

개발/대규모 시스템 설계

[대규모 시스템 설계] 6. 키-값 저장소 설계 - 3

라이언납시오 2023. 8. 17. 15:40
728x90
반응형

장애 처리

우선 장애 감지와 장애 해소 전략을 살펴보자

 

장애 감지

분산 시스템에선 한 대 서버가 "서버 A 다운"이라고 말해도 서버 A를 장애처리 하지 않는다. 보통 2 대 이상의 서버가 같이 서버 A의 장애를 보고해야 처리한다. 노드간 멀티캐스팅 채널을 구축하는것이 서버 장애를 감지하는 가장 쉬운 방법이지만 서버가 많을때는 비효율적이다.

멀티캐스팅 채널 구축

 

가십 프로토콜(Gossip Protocol) 같은 분산형 장애 감지를 채택하는 것이 나으며 동작원리는 다음과 같다

Gossip Protocol

- 각 노드는 멤버십 목록을 유지. 멤버십 목록은 멤버ID와 그 박동 카운터 쌍의 목록

- 각 노드는 주기적으로 자신의 박동 카운터를 증가

- 각 노드는 무작위로 선정된 노드들에게 주기적으로 자기 박동 카운터 목록을 보냄

- 박동 카운터 목록을 받은 노드는 멤버십 목록을 최신 값으로 갱신

- 어떤 멤버의 박동 카운터 값이 일정 시간 동안 갱신되지 않으면 해당 멤버는 장애 상태인것으로 간주

 

위 사진에서 S0는 S2의 장애를 감지하고 S2 노드를 포함하는 박동 카운터 목록을 무작위로 선택된 다른 노드들에게 전달한다. 그리고 노드 S2의 박동 카운터가 오랫동안 증가되지 않음을 발견한 모든 노드는 해당 노드를 장애 노드로 표시

 

일시적 장애 처리

가십 프로토콜로 장애를 감지한 시스템은 가용성을 보장하기 위해 조치를 취해야 한다. 엄격한 종족수(strict quorum) 접근법은 데이터 일관성을 지키기 위해 읽기와 쓰기 연산을 금지해야 하기 때문에 느슨한 정족수(sloppy quorum) 접근법을 취한다.

이 접근법은 조건을 완화하여 가용성을 높인다. 정족수 요구사항을 강제하는 대신, 쓰기 연산을 수행항 W개의 건강한 서버읽기 연산을 수행할 R개의 건상한 서버를 해시 링에서 선택. 이때 장애 상태인 서버는 무시.

네트워크나 서버 문제로 장애 상태인 서버로 가는 요청은 다른 서버가 잠시 처리 + 그동안 발생한 변경사항은 해당 서버가 복구됐을 때 일괄 반영하여 전달 → 데이터 일관성 보존

이를 위해 임시로 쓰기 연산을 처리한 서버에는 그에 관한 단서를 남기는데 이런 방식을 단서 후 임시 위탁 기법(hinted handoff)이라고 부른다

 

영구 장애 처리

영구적인 노드의 장애 상태는 반-엔트로피(anti-entropy) 프로토콜을 구현하여 사본들을 동기화한다.

반 엔트로피 프로토콜은 사본들을 비교하여 최신 버전으로 갱신하는 과정을 포함. 사본 간 일관성이 망가지는 상태를 탐지하고 전송 데이터의 양을 줄이기 위해 머클(Merkle) 트리를 사용. 머클 트리는 각 노드에 그 자식 노드들에 보관된 값의 해시를 레이블로 붙여두는 트리. 해시 트리를 사용하면 대규모 자료 구조의 내용을 효과적이면서 보안상 안전한 방법으로 검증 가능.

 

색칠된 부분: 데이터가 망가져서 일관성이 보장되지 않는 해시값

머클 트리의 비교는 루트 노드의 해시값부터 시작해서 자식 노드 해시값을 비교해서 다른 해시값을 가진 버킷을 찾아서 동기화한다

 

데이터 센터의 장애는 정전, 네트워크 장애, 자연재해 등 다양한 이유로 발생하는데 이를 대응하기 위해선 데이터를 여러 데이터 센터에 다중화 한다.

 

시스템 아키텍처 다이어그램

아키텍처의 주된 기능은 다음과 같다

- 클라이언트는 키-값 저장소가 제공하는 2가지 단순한 API, get(k), put(k,v)와 통신

- 중재자는 클라에게 키-값 저장소에 대한 프락시 역할을 하는 노드

- 노드는 안정 해시의 해시 링 위에 분포

- 노드를 자동으로 추가 또는 삭제할 수 있도록, 시스템은 완전히 분산

- 데이터는 여러 노드에 다중화된다

- 모든 노드가 같은 책임을 진다 → SPOF(Singe Poing Of Failure)는 존재X

 

완전히 분산된 설계를 채택했으므로 모든 노드는 아래의 기능을 가져야 한다

 

쓰기 경로

쓰기 요청이 특정 노드에 전달 될 때, 카산드라(Cassandra) 사례

1. 쓰기 요청이 커밋 로그 파일에 기록된다

2. 데이터가 메모리 캐시에 기록된다

3. 메모리 캐시가 가득찼거나 사전에 정의된 임계치에 도달하면 데이터는 디스크에 있는 SSTable에 기록된다. SSTable(Sorted-String Table)은 <키,값>의 순서쌍을 정렬된 리스트 형태로 관리하는 테이블

 

읽기 경로

1. 데이터가 메모리 캐시에 있는지 검사. 없으면 2번으로

2. 데이터가 메모리에 없으므로 블룸 필터(어느 SSTable에 찾는 키가 있는지 알아낼 효율적인 방법)를 검사

3. 블룸 필터를 통해 어떤 SSTable에 키가 보관되어 있는지 확인

4. SSTable에서 데이터를 가져온다

5. 해당 데이터를 클라에게 반환한다

 

목표/문제 기술
대규모 데이터 저장 안정 해시를 사용해 서버들에 부하 분산
읽기 연산에 대한 높은 가용성 보장 데이터를 여러 데이터센터에 다중화
쓰기 연산에 대한 높은 가용성 보장 버저닝 및 벡터 시계를 사용한 충돌 해소
데이터 파티션 안정 해시
점진적 규모 확장성 안정 해시
다양성 안정 해시
조절 가능한 데이터 일관성 정족수 합의
일시적 장애 처리 느슨한 정족수 프로토콜과 단서 후 임시 위탁
영구적 장애 처리 머클 트리
데이터 센터 장애 대응 여러 데이터 센터에 걸친 데이터 다중화

 

이번 장은 배웠던게 많았던 만큼 복습을 여러번 해야 할 것 같다...!

728x90
반응형
Comments