Redshift 주요 기능 및 성능 개선

안녕하세요 오늘은 베스핀글로벌 Devops 정경희님이 작성해 주신 Redshift 주요 기능 및 성능 개선에 대해 알아보겠습니다. 궁금하신 부분이 있으시면 댓글을 달아주세요 🙂

AGENDA

01. Redshift Overview

02. Redshift Cluster Architecture

03. Data Load/Unload

04. Distribution Style

05. Sort Key

06. Compression Encoding

07. Vacuum / Deep Copy

08. WLM

09. Concurrency Scaling

10. Redshift Spectrum

11. Tip

1. Redshift Overview

페타 바이트 규모의 완전 관리 형 데이터웨어 하우스
  • OLAP(Online Analytical Processing)에 적합
  • MVCC(Multi version concurrency control) 지원
  • PostgreSQL 기반, 표준 SQL 사용
  • Amazon Redshift JDBC 또는 ODBC 드라이버 지원 (권장)

* PostgreSQL과의 주요 차이점

https://docs.aws.amazon.com/ko_kr/redshift/latest/dg/c_redshift-and-postgres-sql.html

성능 관련 주요 기능
  • MPP (Massively Parallel Processing) 아키텍처
    • 다수의 노드를 통해 병렬 처리
  • Columnar storage
    • 스토리지 I/O 최소화
  • Data compression
    • 스토리지 I/O 최소화
  • Query optimizer
    • MPP & 열 기반 쿼리 옵티마이저
  • Result caching
    • 쿼리 결과를 리더 노드의 메모리에 캐시

2. Redshift Cluster Architecture

MPP 기반 아키텍처
  • Leader Node
    • SQL 엔드 포인트
    • 메타데이터 저장소
    • 병렬 SQL 쿼리 코디네이터
    • 쿼리 실행 옵티마이저
  • Compute Node
    • 로컬 컬럼 기반의 스토리지
    • 컴퓨팅 최적화(DC), 스토리지 최적화(DS)
    • 데이터 로드, 백업 및 복원 주체
    • 여러 개의 슬라이스로 구성 (슬라이스 별 독립적인 워크로드를 병렬로 실행)

3. Data Load

COPY 명령을 사용하여 데이터 로드
  • S3, DynamoDB, EC2, EMR로부터 데이터 로드 가능
  • 다양한 포맷 지원 (CSV, JSON, ORC, Avro, Parquet 등)
  • 압축된 파일 지원 (gzip, lzop, bzip2, zstd)
성능 향상 방법
  • 압축된 파일 사용
  • 파일 수는 클러스터 총 슬라이스 수의 배수

    select count(*) as number_of_slices from stv_slices;

  • 파일 사이즈는 1MB-1GB 사이로 균일하게
copy venue from 's3://mybucket/venue'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '|';

Data Unload

  • UNLOAD 명령을 사용하여 S3로 데이터 언로드
  • 클러스터의 슬라이스 수에 따라 여러 파일에 병렬 처리 (기본)
  • PARALLEL OFF 옵션 사용 시 직렬 처리
  • CSV, PARQUET 포맷으로 출력 지원
  • 파일 압축 지원 (gzip, bzip2, zstd)
unload ('select * from venue')
to 's3://mybucket/tickit/unload/venue_'

iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';

venue_0000_part_00

venue_0001_part_00

venue_0002_part_00

venue_0003_part_00

4. Distribution Style

테이블에 지정된 Distribution Style에 따라 테이블 데이터는 Node, Slice로 분산

  • Distribution Key
    • 키로 지정된 컬럼 값에 따라 Slice로 데이터 분산 (DIST KEY는 하나만 지정 가능)
    • 자주 변경되거나, 조인에 사용되는 테이블에 적합
    • DIST KEY로 적합한 컬럼 : 조인 컬럼 (Merge Join), 높은 카디널리티를 가진 컬럼,  group by 조건에서 사용되는 컬럼
    • DIST KEY로 적합하지 않은 컬럼 : Where 절에서 사용되는 컬럼 (특히 equal 비교 컬럼), 데이터 몰림 컬럼
  • All
    • 전체 테이블의 복사본이 모든 노드로 분산
    • 데이터 변경이 적고, 조인이 필요한 dimension 테이블에 적합
    • 중간 테이블 사이즈에 적합 (작은 사이즈 테이블은 재분산 비용이 적기 때문에, 이점이 크지 않음)
  • Even
    • 라운드 로빈 방식으로 분산
    • 테이블이 조인에 참여하지 않을 때 적합
    • 적당한 DIST KEY가 없을 때에도 적합
  • Auto (Default)
    • 테이블 데이터를 기반으로 최적의 분산 스타일을 할당
create table sales(
    salesid integer not null,

    listid integer not null,

    sellerid integer not null,

    buyerid integer not null,

    eventid integer not null encode mostly16,

    dateid smallint not null

)

diststyle key

distkey(listid);

   

5. Sort Key

Redshift는 Column데이터를 1MB Block에 저장
  • Zone Maps
    • 각 1MB Block 내에 존재
    • Block 내 MIN 및 MAX 값에 대한 정보를 저장
    • 스캔 시 빠르게 Skip 처리가 가능
    • 정렬된 데이터의 경우 효율성 향상
Slice 내에서 데이터는 sort key 기반으로 정렬 / 테이블 스캔 시 전체 블록 읽는 것을 피할 수 있음
  • COMPOUND SORTKEY
    • 선언한 순서에 따라 순차적으로 정렬되어 저장 (WHERE절에서 순서 지켜서 쿼리)
    • Join, Group by, Order by에 효과적
  • INTERLEAVED SORTKEY
    • 정렬 키에 똑같은 가중치를 부여
    • 컬럼 순서에 상관없이 일관성 있는 조회 가능
    • VACUUM REINDEX 필요
  • SORTKEY AUTO
    • 자동 테이블 최적화를 사용하여 정렬 키를 선택
create table sales(
    salesid integer not null,

    listid integer not null,

    sellerid integer not null,

    buyerid integer not null,

    eventid integer not null encode mostly16,

    dateid smallint not null

)

distkey(listid) compound sortkey(listid,sellerid);

6. Compression Encoding

압축을 통해 스토리지 사용량 및 I/O 최소화
  • CTAS
    • CTAS문으로 테이블 생성 시 자동으로 압축 인코딩 적용
  • COPY 시 COMPUPDATE 옵션
    • COMPUPDATE ON 옵션 사용
    • 옵션 생략하면, 빈 테이블에 COPY시 적용됨
  • ANALYZE COMPRESSION
    • 대상 테이블에 ANALYZE COMPRESSION문 사용 시 컬럼별 최적의 압축 인코딩 반환
    • 자동으로 적용되지 않으며, 테이블 새로 생성하거나 ALTER TABLE문으로 수동 적용 필요
    • 테이블 배타적 잠금으로 동시 읽기/쓰기 제한되므로 유의
    • SORT KEY 컬럼에 압축 인코딩 적용 시 유의
create table product(
    product_id int encode raw,

    product_name char(20) encode bytedict

);

 

7. Vacuum / Deep Copy

테이블 데이터 정렬 및 고스트 행 제거
  • Vacuum
    • VACUUM명령을 사용하여 테이블 정렬 및 삭제 된 블록 제거
    • FULL, SORT ONLY, DELETE ONLY, REINDEX 옵션 제공
    • 백그라운드에서 자동으로 실행
  • Deep Copy
    • 새로 생성한 테이블에 데이터를 복사하면서 정렬
    • Vacuum에 비해 속도가 빠른 장점
    • 동시 업데이트 지원 안됨

8. WLM (Workload Management)

  • 사용 목적에 따라 별도의 쿼리 대기열(Queue) 구성
    • 우선 순위, 동시성 확장 모드, 쿼리 모니터링 규칙 등 설정 가능
    • 사용자 그룹 및 쿼리 그룹에 따라 쿼리를 대기열에 할당
  • 자동 WLM
    • 쿼리 동시성 및 메모리가 자동으로 할당
  • 수동 WLM
    • 쿼리 동시성 및 메모리 할당 값을 지정
    • 기본 동시성 5, 최대 50
  • SQA (Short Query Acceleration)
    • 장기 쿼리로 인해 대기하지 않도록 단기 쿼리 전용 큐에서 실행

9. Concurrency Scaling

동시 읽기 쿼리의 증가를 처리하는데, 필요한 추가 클러스터를 자동으로 확장
  • 기본적으로 동시성 확장은 비활성화
  • max_concurrency_scaling_clusters 1 ~ 10
  • 초당 온디맨드 요금 발생
  • 메인 클러스터 사용 시 24시간마다 1시간 Credit 누적 (최대 30시간, Credit내 무료 사용 가능)
  • 일별, 주별, 월별 사용 한도를 생성하여 제어 가능
  • 해당 한도에 도달하면 Amazon Redshift가 자동으로 조치 (예: 로깅, 알림 또는 추가 사용 비활성화)

10. Redshift Spectrum

데이터 적재 없이 S3로부터 바로 쿼리 가능
  • 메인 클러스터와 독립적인 전용 Redshift 서버에 상주
  • 스캔한 byte 수에 대해 비용이 부과 (TB당 5 USD)
  • 자주 액세스하지 않는 데이터는 S3에 저장하여, 스토리지 비용 절감
성능 향상 및 비용 절감 방법
  • 압축된 파일 사용
  • Parquet 또는 ORC와 같은 컬럼 형식 파일 사용
  • 쿼리에서 사용하는 컬럼을 최소화
  • 다수의 파일, 64MB~1GB 파일 크기로 균일하게 저장
  • 파티셔닝으로 스캔 데이터 제한

11. Tip !

쿼리 실행 계획
  • EXPLAIN 명령 사용
  • cost, distribution, join 유형으로 쿼리 평가
  • ANALYZE로 통계 데이터 업데이트 
->  XN Hash Join DS_BCAST_INNER  (cost=112.50..3272334142.59 rows=170771 width=84)
        Hash Cond: ("outer".venueid = "inner".venueid)
        ->  XN Hash Join DS_BCAST_INNER  (cost=109.98..3167290276.71 rows=172456 width=47)
              Hash Cond: ("outer".eventid = "inner".eventid)
              ->  XN Merge Join DS_DIST_NONE  (cost=0.00..6286.47 rows=172456 width=30)
                    Merge Cond: ("outer".listid = "inner".listid)
                    ->  XN Seq Scan on listing  (cost=0.00..1924.97 rows=192497 width=14)
                    ->  XN Seq Scan on sales  (cost=0.00..1724.56 rows=172456 width=24)
스토리지 I/O 최소화 => 성능 최적화
  • 데이터 압축, 최적의 압축 인코딩 적용
  • 데이터 스큐 최소화 (dist style, dist key)
  • 미정렬 데이터 최소화 (sort key, vacuum)
단일 트랜잭션에서 여러 단계 수행 (커밋 비용이 높기 때문에)
BEGIN;
INSERT INTO LOGS (…) VALUES (…);
DELETE FROM LOGS WHERE dts < ‘2021-01-01’;
…
COMMIT;
CREATE TABLE ~ BACKUP NO 옵션: 스냅샷 백업 시 제외
ALTER TABLE APPEND (전체 데이터 복사): CREATE TABLE AS 또는 INSERT INTO보다 빠름

운영 관련 Tip

쿼리 취소: CANCEL/ABORT, PG_TERMINATE_BACKEND
시스템 테이블 (https://docs.aws.amazon.com/ko_kr/redshift/latest/dg/cm_chap_system-tables.html)

자주 조회하는 시스템 테이블

Amazon Redshift에서 제공하는 스크립트 및 유틸리티 활용

https://github.com/awslabs/amazon-redshift-utils

감사합니다 🙂

Written by 정 경희 /Kyunghee Jung

Project Engineer

Leave a Comment