데이터 중심 애플리케이션 설계 - 6장

공상현 (Kong Sang Hyean)·2024년 6월 17일
0

K DEVCON DDIA STUDY

목록 보기
6/12

😊 Go to Learn이란?

K-devcon에서 주최하는 멘토링 프로그래밍으로 각 분야에서 전문가이신 멘토분들의 멘토링을 통하여 약 2-3달간 진행하는 프로그램입니다.

Go to Learn 1기 같은 경우 Flutter, Back-end, Full-stack, Writing 등 여러가지 주제가 담긴 멘토링 프로그램이 있었습니다.

그 중 Back-end를 중심으로 진행하는 DDIA 프로그램 같은 경우 데이터 중심 애플리케이션 설계라는 책을 매주 1장 씩 정독하고 요약하면서 괸련된 이야기를 논의하면서 진행하고 있습니다.

K-devcon 이란? : IT 정보를 공유하거나 위에서 설명한 Go to Learn 스터디 및 밋업을 개최하는 활동을 하고있는 IT 커뮤니티입니다.
K-devcon 홈페이지 바로가기


📖 6장 요약 및 정리

파티셔닝

데이터 파티셔닝의 주 이유는 확장성이다. 따라서 대용량 데이터셋이 여러 디스크에 분산 될 수 있고 질의 부하는 여러 프로세서에 분산 될 수 있다.

파티셔닝과 복제은 보통 함꼐 적용하여 각 파티션의 복사본을 여러 노드에 저장한다. 따라서 파티션의 복제도 동일하게 적용이 되어진다.

샤딩

데이터셋이 매우 크거나 질의 처리량이 매우 높아 데이터를 파티션으로 쪼개는 작업이다.

키-값 데이터 파티셔닝

파티셔닝의 목적은 데이터와 질의 부하를 노드 사이의 고르게 분산시키는 것이다. 만일 파티셔닝이 고르게 이루워지지 않는다면 균형하지 않은 파티션은 쏠렸다고 말한다.

극단적으로 부하가 놓은 파티션을 핫스팟이라고 한다.

  • 핫스팟을 회피하는 단순한 방법은 할당한 노드를 무작위로 선택하는 것이다.
  • 위 보다 더 좋은 방법으로는 키-값 데이터 모델을 활용하는 방법이다.

키 범위 기준 파티셔닝

각 파티션에 연속된 범위의 키를 할당하는 방법이다. 각 파티션의 경계를 알아 어느 파티션에 속하는지 확인할 수 있다.

각 파티션의 경계는 수동으로 선택하거나 데이터베이스에서 자동으로 선택할 수 있다.

단, 특정한 접근 패턴이 핫스팟을 유발 할 수 있다는 단점이 존재한다. 위의 문제를 회피하기 위하여 첫번째 요소를 타임스탬프가 아닌 다른 것을 골라야한다.

키의 해시값 기준 파티셔닝

좋은 해시 함수는 균일하게 분산되게 한다. 파티셔닝용 해시 함수는 암호적으로 강력할 필요가 없다.

해시값 파티셔닝은 키를 파티션 사이에 균일하게 분산시키기 좋은 기법이다. 단 범위 질의를 효율적으로 실행할 수 없다는 단점이 있다.

일관성 해싱은 CDN 같은 인터넷 규모의 캐시 시스템에서 부하를 균등하게 분산시키는 방법이다.

복합 기본키를 지정하여 키의 첫 부분만 해싱을 적용해 파티션 결정에 사용하고 남은 컬럼은 연쇄된 색인으로 사용하는 방법이 있다.

파티셔닝과 보조 색인

보조 색인은 특정한 값이 발생한 항목을 검색하는 수단으로 활용한다. 보조 색인은 데이터 모델링에 매우 유용하며 검색 서버에 많은 활용을 주고있다.

문서 기준 보조 색인 파티셔닝 (지역 색인)

필터링 등의 목적으로 원하는 필드 및 칼럼에 보조 색인을 만드는 방법이다. 이러한 방법을 사용하면 파티션이 독립적으로 동작하게 된다.

문서 ID에 작업을 하지 않는다면 동일한 파티션에 저장되리라는 보장이 없다. 따라서 모든 파티션으로 질의를 보내 얻은 결과를 모두 모아야한다.

  • 이러한 방법으로 질의를 보내는 방법을 스캐더/개더 라고 한다.

용어 기준 보조 색인 파티셔닝 (전역 색인)

모든 파티션의 데이터를 담당하는 전역 색인을 만들 수도 있다. 이런 식의 색인을 용어 기준으로 파티셔닝 되었다라고 말한다.

문서 파티셔닝에 비해 읽기가 효율적이지만 쓰기가 느리고 복잡하다. 대개 비동기로 갱신된다.

파티션 재균형화

시간이 지나면 데이터베이스에 변화가 필히 생기는데 변화가 생기면서 다른 노드로 옮기는 과정을 재균형화라고 한다.

  • 재균형화 후 부하가 노드들 사이에 균등해야한다.
  • 재균형과 도중에도 읽쓰기 요청을 받아야한다.
  • 부하 최소화를 위하여 노드들 사이에 데이터가 필요 이상으로 옮겨져서는 안된다.

해시값에 모드 N 연산을 실행하는 방법은 노드의 개수가 변경될 경우 또 다시 재균형화하는 문제점을 가지고 있다. 따라서 필요 이상으로 데이터가 이동될 수도 있다.

완전 자동 재균형화와 완전 수동 재균형화 사이에 중간 지점이 있다. 완전 자동화의 경우 다음과 같은 단점이 존재한다. 따라서 재균형화 과정에 사람이 개입하는게 좋을 수 있다.

  • 예측하기 어렵다.
  • 주의 깊게 처리하지 않으면 노드에 과부화가 걸릴 수 있다.
  • 자동 장애 감지와 조합되면 위험해질 수 있다.

파티션 개수 고정

파티션을 노드의 갯수보다 많이 만들고 각 노드에 여러 파티션을 할당하는 방법이다. 클러스터에 노드가 추가된다면 새 노드는 파티션이 다시 균일하게 분배할 때 까지 몇 개 뺏어 올 수 있다.

파티션은 노드 사이에 통째로 이동하기만 한다. 변경점은 어떤 파티션이 어느 노드에 할당되는 것 밖에 없다.

처음 설정된 파티션의 개수를 설정할 때 충분히 높은 값으로 선택해야하지만 너무 큰 수를 선택하면 역효과가 발생 할 수도 있다.

동적 파티셔닝

파티션 경계를 동적으로 만드는 방법이다. 크기가 설정된 값보다 넘어서면 2개로 쪼개 원래의 파티션의 절반 정도의 데이터가 포함되게 한다. 그 반대의 작업도 이루어진다. (B 트리와 유사한 방법이다.)

동적 파티셔닝은 전체 데이터 용량에 맞추어 조정된다는 이점이 있다. 또한 오버헤드도 작다.
사전 정보가 없으므로 시작할 때 파티션이 하나로 시작하게 된다. 위 문제를 완화하기 위하여 사전 분할을 설정한다.

노드 비례 파티셔닝

노드 당 할당하는 파티션의 개수를 고정하는 방법이다. 위의 방법은 개별 파티션의 크기가 상당히 안정적으로 유지되게 만들 수 있다.

새 노드가 추가된다면 고정된 개수의 파티션을 무작위로 선택한 뒤 분할한 뒤 그 절반을 새 노드에 할당하게 만든다.

파티션 경계를 무작위로 선택하려면 해시 기반 파티셔닝을 사용해야한다.

요청 라우팅

서비스 찾기는 클라이언트에서 요청을 보내려고 할 때 어느 노드로 접속하면 좋을지 정하는 문제이다.

  • 위의 핵심 문제는 라우팅 결정을 내리는 구성요소가 노드에 할당된 파티션의 변경 사항을 어떻게 아는지에 대한 문제이다.
  • 많은 분산 데이터 시스템은 별도의 코디네이션 서비스를 사용한다. (주키퍼 / 몸고스 / 가십 프로토콜 등)

분석용으로 자주 사용하는 대규모 병렬 처리는 관계형 보다 복잡한 질의를 지원한다. 위의 복잡한 질의들을 여러 실행 단계와 파티션으로 분해하여 병렬적으로 실행하게 만든다.


😉 필자의 생각

6장에서는 복제에 이어 데이터를 분산 처리해주는 파티셔닝에 대한 이야기를 주로 데이터를 어떠한 방식으로 나누면 효율적인지 설명해주는 장이었다.

특히 이번 6장 같은 경우 5장에서 설명되었던 데이터의 복제와 연계되어서 설명되는 내용들이 자주 보였던 것 같았다. 예를 들어 리더 팔로우 복제 알고리즘에서 사용되었던 해시를 데이터 파티셔닝을 진행 할 때도 활용된다는 사실을 알 수 있었다.

또한 이번 장 같은 경우 해싱 및 재균형화와 관련하여 좀 더 자세한 예시가 필요 하였기 때문에 해당 장을 읽은 뒤 가상 면접 사례로 배우는 대규모 시스템 설계 책 내에 있는 안정 해시 설계 및 키-값 저장소 설계 파트와 병행하면서 읽어보았다. 가상 노드를 활용한 핫스팟 문제를 해결하는 방법 등 실전에서 어떻게 이용하면서 어느 제품에 사용되었는지 알 수 있었던 시간이었다.

마지막으로 파티션 재균형화 마지막 설명에서 가급적 수동으로 운영할 때도 있다는 점을 논의 하였었는데 아무리 재균형화가 자동화되는 기능이 들어있다 할 지라도 인프라 관리 내에서 예측할 수 없는 트래픽 및 분야라면 가급적으로 수동으로 관리해야 한다는 이야기를 들었었던 논의 주제였다.

profile
개발자 같은 거 합니다. 1인분 하는 개발자로서 살아갈려고 노력 중입니다.

0개의 댓글