01. Amazon Redshift ?
Amazon Redshift 는?
-
AWS 클라우드에서 완벽하게 관리되는 페타바이트급 데이터 웨어하우스 서비스입니다.
-
데이터 웨어하우스는 노드라는 컴퓨팅 리소스의 모음으로, 노드는 클러스터라는 그룹을 구성합니다.
-
클러스터 – Amazon Redshift 데이터 웨어하우스의 핵심 인프라 구성 요소는 클러스터입니다.
-
클러스터는 하나 이상의 컴퓨팅 노드로 구성됩니다. 컴퓨팅 노드는 컴파일된 코드를 실행합니다.
-
클러스터에 두 개 이상의 컴퓨팅 노드가 제공된 경우 추가 리더 노드가 컴퓨팅 노드를 조정합니다.
-
리더 노드는 비즈니스 인텔리전스 도구 및 쿼리 편집기와 같은 애플리케이션과의 외부 통신을 처리합니다.
-
-
클라이언트 애플리케이션은 리더 노드와만 직접 상호작용합니다.
-
데이터베이스 – 클러스터에는 하나 이상의 데이터베이스가 포함되어 있습니다.
-
사용자 데이터는 컴퓨팅 노드에 있는 하나 이상의 데이터베이스에 저장됩니다.
-
SQL 클라이언트는 리드 노드와 통신하고, 리더 노드는 이어서 컴퓨팅 노드와 쿼리 실행을 조정합니다.
-
Redshift의 일반적인 데이터 처리 흐름
-
Datashare를 사용하여 Redshift 클러스터에서 읽기용으로 라이브 데이터를 비교적 안전하고 쉽게 공유합니다.
-
Redshift Spectrum 을 사용하여 데이터를 Redshift 테이블에 로드 하지 않고도 S3 파일에서 데이터를 쿼리합니다.
-
연합 쿼리를 사용하여 RDS 및 Aurora 또는 S3와 같은 관계형 데이터베이스의 데이터를 Redshift DB 데이터와 Join 합니다.
-
SageMaker Autopilot과 함께 작동하여 최상의 모델을 자동으로 얻고 Redshift에서 예측 함수를 사용할 수 있도록 합니다.
데이터 웨어하우스 시스템 아키텍처
리더 노드
-
클라이언트 프로그램과 일어나는 통신을 비롯해 컴퓨팅 노드와 일어나는 모든 통신을 관리합니다.
-
구문을 분석하여 데이터베이스 작업, 특히 복잡한 쿼리의 결과를 얻는데 필요한 단계를 연이어 실행하기 위한 실행 계획을 작성합니다.
-
작성된 실행계획에 따라 코드를 컴파일하여 컴퓨팅 노드로 배포한 후 데이터 구간을 각 컴퓨팅 노드로 할당합니다.
컴퓨팅 노드
-
리더 노드는 실행 계획을 구성하는 개별 요소마다 코드를 컴파일하여 각 컴퓨팅 노드에 할당합니다.
-
그러면 컴퓨팅 노드가 컴파일 코드를 실행한 후 최종 집계를 위해 중간 결과를 리더 노드에 다시 보냅니다.
-
각 컴퓨팅 노드마다 전용 CPU와 메모리, 그리고 내장 디스크 스토리지가 따로 있으며, 이는 노드 유형에 따라 결정됩니다.
노드 조각
-
컴퓨팅 노드는 다수의 조각으로 분할됩니다.
-
분할된 조각은 다시 각각 노드의 메모리 및 디스크 공간으로 할당되고, 여기에서 노드에 할당되는 워크로드를 처리합니다.
-
리더 노드는 조각에 대한 분산을 관리하면서 쿼리 워크로드 또는 기타 데이터베이스 작업 워크로드를 각 조각으로 할당합니다.
-
각 조각은 병렬 방식으로 실행되어 작업을 완료합니다.
대용량 병렬 처리
-
대용량 병렬 처리(MPP)는 아무리 복잡한 쿼리라고 해도 빠른 속도로 실행하여 대용량 데이터를 처리할 수 있습니다.
-
다수의 컴퓨팅 노드가 각 노드의 코어마다 전체 데이터를 분할하여 쿼리 실행하면서 최종 집계에 이를 때까지 모든 쿼리를 처리합니다.
열 기반 데이터 스토리지
-
데이터베이스 테이블 정보를 열 기반 방식으로 저장하기 때문에 디스크 I/O 호출 및 로드해야 하는 데이터 크기가 감소합니다.
-
열이 적절하게 정렬되면 쿼리 프로세스가 대용량의 데이터 블록 하위 집합을 빠르게 필터링할 수 있습니다.
쿼리 옵티마이저
-
쿼리 실행 엔진은 MPP를 인식하고 열 기반 데이터 스토리를 활용하는 쿼리 옵티마이저를 통합합니다.
-
다중 데이블 조인, 하위 쿼리 및 집계를 포함하는 복잡한 분석 쿼리를 처리하기위한 중요한 향상 및 확장을 구현합니다.
결과 캐싱
-
쿼리 실행 시간을 줄이고 시스템 성능을 항상시키기 위해 특정 형식의 쿼리 결과를 리드 노드의 메모리에 캐시합니다.
-
사용자가 쿼리하면, 결과 캐시에 유효한 항목 검색하여 찾을시 캐시된 결과를 사용하고 쿼리는 실행하지 않습니다.
노드 유형 정보
-
vCPU는 각 노드의 가상 CPU 수입니다.
-
RAM은 각 노드의 메모리 크기(GiB)입니다.
-
노드당 기본 조각은 클러스터를 생성하거나 클래식 크기 조정으로 크기를 조정할 때 컴퓨팅 노드가 분할되는 조각 수입니다.
-
탄력적 크기 조정을 사용하여 클러스터 크기를 조정할 경우 노드당 조각 수가 변경될 수 있습니다.
-
탄력적 크기 조정 후에도 클러스터의 모든 컴퓨팅 노드에 있는 총 조각 수는 동일하게 유지됩니다.
02. TABLE DISTSTYLE
데이터 분산 목적
-
데이터를 테이블에 로드할 때는 테이블 생성 시 선택한 배포 스타일에 따라 테이블의 행을 컴퓨팅 노드 및 조각으로 분산시킵니다.
-
워크로드를 클러스터 노드에 균일하게 분산시킵니다. 만약 불균일 분산시 해당 노드가 더 많은 일을 해 쿼리성능을 떨어 뜨립니다.
-
쿼리 실행시 데이터 이동을 최소화 하려면 조인 또는 집계에 참여하는 행이 같은 노드에 있어야 데이터 재분산 시킬 필요가 없습니다.
-
테이블 마다 최적의 분산 스타일을 선책해야만 데이터 분산 밸런스를 맞춰 전체적인 시스템 성능을 크게 높일 수 있습니다.
데이터 재분산
-
테이블에 데이터를 로드하면 테이블의 배포 스타일에 따라 테이블 행을 각 노드 조각으로 분산시킵니다.
-
옵티마이저가 쿼리 계획에 따라 최적의 쿼리 실행을 위한 데이터 블록 위치를 결정합니다.
-
쿼리가 실행되는 동안 데이터가 물리적으로 이동되거나 재배포됩니다.
-
재분산에는 조인을 위해 특정 행을 노드로 전송하거나, 혹은 전체 테이블을 모든 노드로 브로드캐스팅하는 작업이 포함될 수 있습니다.
데이터 재분산 종류
-
ALL
-
EVEN
-
KEY
AUTO 분산
-
테이블 데이터의 크기를 기반으로 최적의 배포 스타일을 할당합니다.
-
예로 처음에 작은 테이블에 ALL 분산을 할당한 다음 테이블이 더 커지면 EVEN 배포로 변경합니다.
EVEN 분산
-
리드 노드는 특정 열 값에 상관없이 행을 라운드 로빈 방식으로 조각에 분산시킵니다.
-
EVEN 배포는 테이블이 조인에 참여하지 않는 경우 적합하며, KEY 배포와 ALL 배포 사이에 명확한 선택이 없는 경우도 적합합니다.
KEY 분산
-
행이 열 1개의 값에 따라 분산됩니다. 리더 노드는 일치하는 값을 동일한 노드 조각에 할당합니다.
-
조인 키를 기준으로 분산시키면 리더 조인 열의 값에 따라 행을 조각에 공동 배치하기 때문에 열이 일치 하는 물리적으로 함께 저장됩니다.
ALL 분산
-
전체 테이블의 복사본이 모든 노드로 분산됩니다.
-
EVEN 분산이나 KEY 분산은 테이블 행의 일부를 각 노드에 할당하는 반면 ALL 분산은 테이블이 참여하는 조인마다 모든 행을 배치합니다.
-
ALL 분산은 필요한 스토리지를 클러스터 노드 수와 곱하기 때문에 다수의 데이터를 테이블에 삽입, 수정 시 더 많은 시간이 걸립니다.
03. SORT KEY
SORT KEY란?
-
열 기반 데이터를 1MB 디스크 블록에 저장합니다.
-
각 블록의 최소 값과 최대 값은 메타데이터로 저장됩니다.
-
쿼리가 범위 제한 조건절을 사용하는 경우에는 쿼리 프로세서가 테이블 스캔 도중 최소/최대 값을 사용하여 블록을 건너 뛸 수 있습니다.
-
복합 키는 정렬 키를 정의할 때 나열되는 모든 열로 구성되며, 나열 순서를 다릅니다.
-
복합 정렬 키는 조인 작업과 GROUP BY 및 ORDER BY 작업, 그리고 PARTITION BY를 사용하는 원도우 함수의 속도를 높이는 효과가 있음.
-
이미 데이터가 로드되어 정렬까지 마친 테이블에 행을 추가하면 미정렬 영역이 증가하여 성능에 커다란 영향을 미칩니다.
INTERLEAVEL SORT KEY (인터리브 정렬 키)
-
각 열, 즉 열의 하위 집합에 똑같은 가중치를 부여합니다.
-
다수의 쿼리가 다른 열을 필터로 사용하는 경우에는 인터리브 정렬 키를 통해 쿼리의 성능을 높일 수 있는 경우가 종종 있습니다.
-
인터리브 정렬키를 사용하여 향상되는 성능 이점과 로드 및 정리 시간이 늘어나는 문제를 서로 비교하여 검토해야 합니다.
04. SCAN
TABLE DISTSTYLE ALL
-
DISTSTYLE ALL TABLE 조회
-
4개 Node에 모든 데이터 저장되어 있고, 그중 특정 1 Node만 읽는다.
TABLE DISTSTYLE EVEN
-
DISTSTYLE EVEN TABLE 조회
-
4개 Node에 ¼식 데이터 저장되어 있어 모든 Node 읽어 처리한다.
TABLE DISTSTYLE KEY
-
DISTSTYLE KEY TABLE 조회
-
4개 Node에 KEY 별로 데이터 저장되어 있어 모든 Node 읽어 처리한다.
COMPOUND SORT KEY
-
ZONE MAP 에서 BLOCK 당 최소, 최대 값 정보 저장 해당 정보 이용하여 필요한 BLOCK만 읽어 효율성이 높아진다.
-
DISTSTYLE ALL 이라도 전체를 다 읽지 않아 I/O 효율이 높으나, 입력 수정 시 정렬이 필요하여 쓰기 효율은 떨어진다.
INTERLEAVED SORT KEY
-
WHERE 절에서 1개 이상의 정렬 키를 기준으로 필터링하여 선택의 폭이 매우 제한적인 쿼리를 실행할 때 효과 적입니다.
-
테이블이 슬라이스당 여러 개의 1MB 블록을 요구할 만큼 충분히 클때 가장 효과적입니다.
05. JOIN
DS_DIST_ALL_NONE
-
DISTSTYLE ALL TABLE이 Inner Join 으로 검색시 나타난다.
-
4개 Node에 모든 값이 있는 Table Join으로 네트워크 부담 없이 각노드에서 Join후 Leader Node에 결과값 전달한다.
DS_DIST_NONE
-
DISTSTYLE KEY TABLE이 각각 같은 KEY로 Join시 나타난다.
-
4개 Node에 KEY값이 같은 Table이 한 Node에 분배되어 있어 각각 Node에만 Join 후 Leader Node에 전달한다.
DS_DIST_OUTER
-
DISTSTYLE KEY 타입, EVEN 타입 Table Join 나타난다.
-
4개 Node에 Outer로 선정된 EVEN 타입 Table이 모드 노드에 재분배한 후 Join하여 결과를 Leader Node에 전달한다.
DS_DIST_BOTH
-
DISTSTYLE EVEN 타입 2 Table Join 나타난다.
-
4개 Node에 각각 EVEN Table로 각각 노드에 모든 Table을 재분배한 후 Join하여 결과를 Leader Node에 전달한다.
-
가장 비효율이 큰 작업으로 튜닝에 대상이 된다.
06. 성능
인스턴스 & 노드별 SQL 성능
-
TEST 결과는 첫번째 쿼리 결과를 버리고 두번째 결과를 가지고 측정하였습니다.
-
ms단위 입니다.
인스턴스 & 노드별 Join 방법 및 비용
-
인스턴스&노드 수 차이로 비용은 크게 차이 나지 않습니다.
-
Join 방법 (재분배)에 가장 큰 영향을 받습니다.
07. 성능 TEST 상세
Table DML
-
각 Table에 1억건 INSERT
Table Count
-
Table 건수 확인
SQL & EXPLIN
-
COUNT
-
ALL & ALL
-
DS_DIST_ALL_NONE
SQL & EXPLIN
-
COUNT
-
EVEN & EVEN
-
DS_DIST_BOTH
SQL & EXPLIN
-
COUNT
-
KEY & KEY
-
DS_DIST_NONE
SQL & EXPLIN
-
GROUP
-
ALL & ALL
-
DS_DIST_ALL_NONE
SQL & EXPLIN
-
GROUP
-
EVEN & EVEN
-
DS_DIST_BOTH
SQL & EXPLIN
-
GROUP
-
KEY & KEY
-
DS_DIST_NONE
SQL & EXPLIN
-
GROUP
-
ALL & EVEN
-
DS_DIST_ALL_NONE
SQL & EXPLIN
-
GROUP
-
ALL & KEY
-
DS_DIST_ALL_NONE
SQL & EXPLIN
-
GROUP
-
EVEN & KEY
-
DS_DIST_OUTER
08. 주의 사항
지원되지 않는 PostgreSQL 주요 기능
-
Index
-
Constraints
-
Sequences
-
Triggers
-
Partition
-
상세 정보 https://docs.aws.amazon.com/ko_kr/redshift/latest/dg/c_unsupported-postgresql-features.html
지원되지 않는 PostgreSQL 주요 Data Type
-
JSON
-
BIT, BIT VARYING
-
Arrays
-
XML
-
상세 정보 https://docs.aws.amazon.com/ko_kr/redshift/latest/dg/c_unsupported-postgresql-datatypes.html
상세한 정보 감사합니다.
감사히 잘 읽었습니다.
책 한 권을 다 본 느낌이네요.
몇 번 더 찾아뵙겠습니다.