[백엔드 로드맵] Building for Scale 2

Gyubster·2022년 3월 3일
0

백엔드 로드맵

목록 보기
10/11

개인적인 일정들로 공부한 것들을 정리할 시간까지는 없어 포스팅이 조금 늦게 되었다. 그럼 다시 "가상 면접 사례로 배우는 대규모 시스템 설계 기초"를 읽고 알게 된 내용들을 정리해보도록 하겠다.


안정 해시 설계

: 보편적으로 사용하게되는 Scale out 방식의 규모 확장에서는 데이터를 각 서버에 균등하게 분배하는 것이 중요하다. 안정 해시는 이를 위해서 사용되는 대표적인 기술이다.
일반적으로 해시를 이용하는 방법은 해시 값과 서버 인덱스를 이용하는 것이다. 서버 인덱스 = 해시 값 % 서버 수를 통해서 각 값을 계산하고, 각 해시들은 서버 인덱스를 참고하여 각 서버로 할당되는 방식이다. 말을 다시하자면, 서버 인덱스가 1인 해시는 서버 1로 할당을 하고 서버 인덱스가 2인 해시는 서버 2로 할당을 하는 식을 의미한다. 이러한 서버 인덱스에 해시를 할당하는 방식을 이용하게 되면 생기는 문제는 특정 서버가 다운 되었을 때 해시들의 재배치가 효과적으로 일어나기 어렵다는 문제가 있다. 즉, 캐시 미스(cache miss)가 일어난다는 것이다. 이를 해결하기 위해서 안정 해시를 이용해서 캐시의 재배치가 문제 없이 일어나게 한다.
안정 해시는 해시 테이블의 크기가 재조정 될때, k/n개의 키만 재배치 하는 기술을 의미한다. k는 키의 개수이고, n은 슬롯의 개수이다. 이러한 안정 해시의 동작 원리는 해시 공간, 해시 링, 해시 서버, 해시 키, 서버 조회, 서버 제거가 있다. 기본적으로 안정 해시를 구현하게 되면 파티션의 크기를 균등하게 유지하기가 어렵다는 점, 키의 균등 분포가 어렵다는 문제점을 가지고 있다. 따라서, 이를 가상 노드를 통해서 관리할 수 있게 하였다. 예를 들자면, 서버 s0가 s0_0, s0_1, s0_2로 나눠져 균등하게 해시 링안에 존재하게 하여 파티션를 균등하게 유지하고 키를 균등하게 분배가 가능하게 한다.

키-값 저장소 설계

: 키-값 저장소는 비관계형 데이터 베이스이다. 단일 서버로 키-값 저장소를 설계한다고 하면 굉장히 간단하다. 빠른 동작을 위해서 키-값 저장소를 메모리위에 해시 테이블로 저장하는 것이다. 물론, 필요로 하는 키-값 저장소의 필요 용량이 크다면 데이터를 압축 혹은 빈도수가 높은 데이터만 메모리에 두고 나머지를 디스크에 저장하는 방식을 이용하면 된다.
키-값 저장소의 분산 시스템 설계는CAP 정리(Consistency, Availability, Partition Tolerance Theorem)를 이해해야 가능하다. Consistency는 일관성으로 분산 시스템에 접속하는 모든 클라이언트는 어떤 노드에 접속을 하든 같은 데이터를 보아야하는 특성이다. Availability는 분산 시스템에 접속하는 클라이언트는 일부 노드가 장애를 일으켜도 데이터를 받아야된다는 특성이다. Partition Tolerance Tehorem은 두 노드 사이에 통신장애 발생을 의미하는 파티션이 생기더라도 시스템은 계속 동작하여야 된다는 것을 의미한다. 이 기본적인 개념을 통해서 키-값 저장소의 분산 시스템이 설계가 되는데 모든 것을 다 가지고 있는 시스템을 만들기는 어렵다. 따라서, 주로 한가지 특성을 양보(=포기)하게 되는데, 표기할 때 양보하는 특성을 작성하지 않는다. 예를 들어, CA 시스템(P를 포기한 시스템), CP(A를 포기한 시스템) 등이 있고 상황에 맞춰서 해당 시스템을 사용하면 된다.
키-값 저장소와 관련된 핵심 컴포넌트 및 기술은 데이터 파티션(어떻게 데이터를 고르게 분포할 것인가?, 노드드 추가 및 삭제에 대한 데이터의 이동 최소화 => 안정해시로 해결), 데이터 다중화(어떻게 비동기적으로 다른 서버에 데이터를 다중화 할 것인가? => key를 기준으로 시계 방향으로 미리 설정한 N개의 서버에 저장하여 동기화 해결), 데이터 일관성(N=사본 개수, W=쓰기 연산에 대한 정족수, R=읽기 연산에 대한 정족수를 기준으로 일관성의 수준에 따라서 N, W, R의 값을 조정하여 일관성 유지), 일관성 모델(강한 일관성: 모든 읽기 연산이 가장 최근에 갱신된 데이터를 제공, 약한 일관성: 모든 읽기 연산이 가장 최근에 갱신된 데이터를 제공하지 않을 수도 있음, 최종 일관성: 갱신 결과가 모두 동기화 되는 모델), 비일관성 해소 기법(데이터 버저닝: 벡터 시계를 활용하여 데이터들의 갱신 시간을 비교하여 충돌이 일어날시에 이를 해소하여 일관성을 유지하는 기법), 장애 감지(모든 노드에 멀티 캐스팅을 하여 장애 감지 방법 << 분산형 장애 감지 방법, 박동 카운터를 활용하여 다른 노드들에게 계속 갱신되는 박동 카운터를 주기적으로 보내고 이를 확인하여 이상이 있을시에 해당 노드를 offline으로 간주하는 방식), 일시적 장애 처리(정족수를 느슨하게 하여 쓰기 및 읽기 연산을 할 건강한 서버를 해시 링에서 골라서 일시적인 장애 처리를 한다.), 영구 장애 처리(반-엔트로피 프로토콜을 구현하여 사본을 동기화하여 해결, 동기화 하는 과정을 보다 효과적으로 하기 위해서 머클 트리를 이용, 머클 트리를 이용하면 이진 트리로 나눠진 버킷의 root 노드를 비교함으로써 빠르게 데이터가 같은지 아닌지 확인이 가능함.)가 있다.
키-값 저장소의 아키텍처는 1. 클라이언트는 get(key), put(key, value)를 이용해 통신한다. 2. 중재자(coordinator)는 프록시 역할을 하는 노드이다.(중재자를 통해서 get, put 통신을 클라이언트와 한다.) 3. 노드는 안정 해시 위에 존재한다. 4. 노드는 자동으로 추가 및 제거가 가능하고 시스템은 완전히 분산된다. 5. 데이터는 여러 노드에 다중화 된다. 6. 모든 노드가 책임을 지기때문에 SPOF는 존재하지 않는다.

profile
공부하는 예비 개발자

0개의 댓글