새소식

DataBase/Redshift

AWS Redshift 개념과 구조

  • -

RedShift란

AWS에서 제공하는 서버리스 형태의 완전 관리형 데이터 웨어하우스로 페타바이트 급 확장이 가능하며 컬럼 포맷을 통해 데이터를 저장해 더 나은 I/O 효율성을 제공합니다. PostgreSQL 기반이며 대규모 병렬 처리, 데이터 압축을 통해 효율적인 데이터 저장 및 최적의 쿼리 성능을 가져올 수 있습니다.

 

구조

Redshift 아키텍처

 

클러스터

클러스터는 하나 이상의 컴퓨팅 노드로 구성됩니다. 클러스터에 두 개 이상의 컴퓨팅 노드가 프로비저닝 될 경우 리더 노드가 컴퓨팅 노드를 관리하고 외부 통신을 처리합니다.

 

리더 노드

리더 노드는 엔드포인트로써 클라이언트와 통신을 처리하고 컴퓨팅 노드를 관리합니다. 리더 노드는 쿼리 수행의 중추 역할을 하는데 쿼리가 수행되면 실행 계획을 생성하고 컴파일한 후 이를 컴퓨팅 노드에 전달합니다. 리더 노드는 메타 데이터만 관리하고 테이블에 데이터가 저장될 때 컴퓨팅 노드에 분할하여 저장합니다. 그렇기 때문에 쿼리 수행 시 전체 컴퓨팅 노드에 컴파일된 코드를 전달하는 것이 아니라 쿼리에 필요한 데이터를 가지고 있는 노드에만 전달합니다.

이때 전체 컴퓨팅 노드에 컴파일된 코드를 전달하는 것이 아니라 쿼리에 필요한 데이터를 가지고 있는 노드에만 전달합니다. 이는 리더 노드의 경우 메타 데이터만 관리하고 데이터 저장은 컴퓨팅 노드에 분할되기 때문입니다.

 

컴퓨팅 노드

컴퓨팅 노드는 리더 노드로 부터 전달된 쿼리 문을 실행하는 역할로 쿼리 문에 필요한 데이터가 여러 노드에 분할되어 있을 경우 각 각의 컴퓨팅 노드들은 쿼리 결과를 리더 노드로 전달합니다. 컴퓨팅 노드는 다수의 슬라이스로 분할되고 각 슬라이스는 노드의 메모리 및 디스크 공간을 할당받습니다. 리더 노드를 통해 각 슬라이스에 데이터가 배포되고 수행될 쿼리 또한 할당됩니다. 이 때 슬라이스는 병렬로 작업을 처리합니다. Redshift의 경우 RDBMS의 클러스터 인덱스는 존재하지 않습니다. 대신 하나의 컬럼을 배포 키로 지정할 수 있는데 이 키에 따라 행이 노드 슬라이스에 분산되어 저장됩니다.

 

기능

Redshift의 성능 향상을 위한 기능은 아래와 같습니다.

  • 대용량 병렬 처리
  • 열 기반 데이터 스토리지
  • 데이터 압축
  • 쿼리 옵티마이저
  • 캐싱
  • 컴파일 코드

옵티마이저, 캐싱, 컴파일은 RDBMS와 유사하므로 설명을 생략하고 병렬처리, 열 기반 스토리지, 데이터 압축에 대해 알아보겠습니다.

 

대용량 병렬 처리

다수의 컴퓨팅 노드가 노드의 코어마다 전체 데이터를 분할하여 동일하게 컴파일된 쿼리를 실행한 후 결과를 집계합니다. Redshift는 데이터를 병렬로 처리할 수 있도록 테이블을 행을 노드로 분산합니다. 이 떼 적절한 배포 키를 선택하여 데이터 분산을 최적화하여 노드 간 데이터 이동을 최소화할 수 있습니다.

 

열 기반 스토리지

RDBMS와 DW의 가장 큰 차이점은 바로 스토리지 구성 방법입니다. 일반적인 RDBMS의 경우 행 기반으로 블록에 행 단위로 저장됩니다. 만약 레코드의 크기가 블록보다 클 경우 각 행마다 여러개의 블록이 필요할 수 있어 디스크 공간이 비효율적으로 사용될 수 있습니다. OLTP 애플리케이션의 경우 쿼리 수행 시 블록의 모든 행에 대한 열을 읽어야 하는 경우가 자주 발생하며 이 때 성능을 향상시키기 위해 인덱스, 파티셔닝 등 다양한 보조 기능을 사용합니다.

행 기반 스토리지

 

반면 열 기반 스토리지는 각 열이 물리적 블록 집합으로 구성됩니다. 따라서 쿼리에 필요한 열만 읽으면 되기 때문에 행 기반 스토리지에 비해 디스크 I/O가 적으며 읽기 전용 쿼리에 대해 I/O 효율이 높습니다. 행, 열이 많아질수록 스토리지 효율성이 더욱 커지며 실제 쿼리 실행시에도 전체 열이 아닌 특정 열을 가져오는 경우가 많습니다.

 

열 기반 스토리지

예시로 컬럼이 100개인 테이블에서 5개의 컬럼을 조회할 때 열 기반 스토리지는 레코드가 1억이든 10억이든 5%의 데이터를 조회하지만 행 기반 스토리지는 모든 100개의 열이 포함된 모든 블록을 같이 읽어와야만 합니다.

 

데이터 압축

열 기반의 스토리지를 사용함으로써 블록 집합 내의 블록은 동일한 데이터 형식을 사용하기 때문에 효율적인 압축을 통해 저장되는 데이터 크기를 줄일 수 있습니다. 이는 스토리지 공간을 절약함과 동시에 스토리지에서 읽어오는 데이터 크기를 줄여 디스크 I/O를 감소시키고 메모리에 저장할 때도 효율적입니다.

(일반적인 RDBMS의 블록 크기는 2~32KB 인 반면 Redshift는 1MB 크기의 블록을 사용합니다.)

 

 

 

참고

https://docs.aws.amazon.com/ko_kr/redshift/latest/dg/c_redshift_system_overview.html

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.