분산 스타일
분산 스타일
테이블을 만들 때 어떤 **분산 스타일(distribution style)**을 고르느냐에 따라 데이터가 클러스터의 어느 슬라이스에 놓일지가 정해져요. 이 선택은 쿼리 성능과 저장 공간, 로드 시간, 유지보수까지 두루 영향을 줘요. 처음에는 개념이 다소 추상적으로 느껴질 수 있는데, 데이터가 노드들에 어떻게 나뉘어 있느냐가 조인과 집계 성능을 가르는 핵심이에요. 그래서 각 테이블에 맞는 분산 스타일을 고르는 일이 웨어하우스 튜닝의 중요한 축이 돼요.
출처: https://docs.aws.amazon.com/redshift/latest/dg/t_Distributing_data.html
노드와 슬라이스, 그리고 데이터 재분배
Amazon Redshift 클러스터는 여러 노드의 집합이에요. 각 노드는 자기 운영체제와 메모리, 디스크를 따로 갖고 있어요. 그중 하나는 리더 노드로, 데이터 분산과 쿼리 처리 작업을 컴퓨트 노드에 배분하는 역할을 하고, 나머지 컴퓨트 노드가 실제 작업 자원을 제공해요. 컴퓨트 노드의 디스크 저장 공간은 여러 슬라이스로 나뉘는데, 슬라이스 개수는 노드 크기에 따라 정해져요. 모든 노드는 데이터를 슬라이스에 최대한 고르게 나눠 갖고 병렬 쿼리를 돌려요.
테이블에 데이터를 로드하면 분산 스타일에 따라 각 노드 슬라이스로 행이 나뉘어 들어가요. 그리고 쿼리를 실행할 때는 옵티마이저가 이 쿼리를 가장 잘 수행하려면 데이터 블록이 어디 있어야 하는지 판단해서, 실행 중에 데이터를 실제로 옮겨요. 이를 데이터 재분배라고 해요. 특정 행을 조인에 필요한 노드로 보내거나, 테이블 전체를 모든 노드에 브로드캐스트하는 방식으로 이뤄져요.
예상치 못하게 자주 일어나는 재분배는 쿼리 계획 비용의 상당 부분을 차지하고, 그 과정에서 생기는 네트워크 트래픽은 다른 데이터베이스 작업까지 느리게 만들 수 있어요. 그래서 처음부터 데이터를 알맞은 위치에 두는 게 중요해요.
데이터 분산의 두 가지 목표
분산 스타일을 고르는 기준은 크게 두 가지 목표로 정리할 수 있어요.
첫째, 클러스터의 노드들 사이에 워크로드를 고르게 나눈다. 특정 노드에 데이터가 몰리면(스큐) 그 노드만 더 많은 일을 해야 해서 쿼리 성능이 떨어져요.
둘째, 쿼리 실행 중 데이터 이동을 최소화한다. 조인이나 집계에 참여하는 행들이 미리 같은 노드에 나란히(collocated) 놓여 있으면, 쿼리 실행 시점에 옵티마이저가 재분배할 데이터가 줄어들어요.
이 두 목표를 밸런스 있게 맞추는 게 키예요. 각 테이블에 맞는 분산 스타일을 골라 데이터 분산을 고르게 만들면 전체 시스템 성능이 크게 좋아질 수 있어요.
한 가지 짚고 넘어갈 점은, 신규 테이블은 보통 DISTSTYLE AUTO로 만드는 걸 권장한다는 거예요. AUTO를 쓰면 Amazon Redshift의 자동 테이블 최적화가 데이터 크기에 맞춰 분산 스타일을 직접 선택해 줘서, 처음부터 수동으로 고르는 고민을 덜 수 있어요.