Search

데이터 플랫폼 설계와 구축 - 8장 스키마 관리

제목
작성일
Tag

8.1 스키마 관리가 필요한 이유

데이터 웨어하우스는 정형화된 스키마 정의가 필수
소스의 스키마가 변경되면 수집이나 적재가 중단되고 웨어하우스 구조 수정이 필요 → 웨어하우스는 스키마 변경하느라 몇시간씩 걸리기도함
대기업에서는 스키마 업데이트 작업 계획해 스키마 변경 요청 프로세스에 따라 진행
스타트업 등 소규모 조직에서는 내버려두다가 문제 생길때 조치 취하는 형식
→ 보통 사용자들이 문제를 인지하고 보고하기 때문에 사용자 불만이 큼
어떤 스키마 변경 처리 작업도 상당한 수작업을 동반

8.1.1 기존 데이터 웨어하우스 아키텍처의 스키마 변경

단일 파일 기반 데이터 소스를 사용하는 데이터 웨어하우스의 경우:
소스 파일 → 랜딩 테이블에 데이터 적재
스키마 불일치 시 적재 실패하고 랜딩 테이블 수정 필수
수집 중단 → 수정 → 프로세스 재개를 반복하게 됨

8.1.2 스키마 온 리드 방식(Schema-on-read)

하둡의 등장과 함께 도입된 개념
파일 시스템은 파일 내부 구조에 신경쓰지 않기 때문에 수집 프로세스가 업스트림 스키마 변경에 회복력을 가지고 있음
파일 시스템에서는 데이터를 적재할때가 아닌 처리하기 시작할때 스키마가 필요하기 때문
이 방식은 스키마 관리 문제를 수집 단계에서 변환단계로 한단계 내려보내지만, 결국 데이터 처리를 위해서는 최신 스키마가 필요

8.2 스키마 관리 방식

앞선 7장에서 알아봤듯이 메타데이터 계층은 스키마 변경관리를 도와주는 역할로 메타데이터 계층 중 하나가 스키마 레지스트리
스키마 레지스트리는 스키마 저장소로 데이터 소스별 전체 스키마의 모든 버전 포함
스키마 변경문제를 사전에 대비하는 두가지 방안
스키마를 계약으로 다루거나
플랫폼에서 스키마 관리를 수행

8.2.1 스키마를 계약(Contract)으로 다루기

애플리케이션 개발자가 애플리케이션에서 생성하는 데이터의 스키마 관리를 책임지도록 함
스키마는 데이터 생성자와 소비자 간 계약으로 간주
중앙 저장소에 모든 스키마를 저장하고 데이터 소비자는 최신 스키마 버전을 가져와 사용
자동화된 호환성 검사와 보호 로직 필요
전제조건
높은 수준의 개발 프로세스 성숙도
스키마 변경 사항마다 상호호환성 확인을 개발자가 수행
서드파티 데이터 소스의 데이터 소유자가 누구인지 명확해야함
SaaS 서비스는 관리 통제권이 사용자에게 있지 않기때문에 스키마 변경에 대한 책임을 개발자가 담당하는 것이 어려움

8.2.2 데이터 플랫폼의 스키마 관리

데이터 플랫폼은 내부 데이터 소스와 서드파티 데이터 소스의 통합지점이므로 스키마를 중앙에서 관리하기 용이함
스키마 변경시 호환성 문제 있을경우 데이터 변환 파이프라인이 가장 먼저 감지
장점
회복력있는 ETL 구현
최신화된 스키마 카탈로그 유지
스키마 변경 이력으로 파이프라인 디버깅과 트러블슈팅 용이
스키마 관리 모듈
공통 데이터 변환 파이프라인에 스키마 관리 모듈 추가해 스키마 관리
스키마가 레지스트리에 없는 경우
1.
수신 데이터에서 스키마 추론 → 스키마 버전 1로 등록
스키마가 레지스트리에 있는 경우
1.
레지스트리로부터 현재 버전 스키마 가져옴
2.
수신 데이터로부터 추론한 스키마와 비교
3.
호환성 판단 후 신규 스키마 버전 레지스트리에 게시

8.2.3 스키마 변경 모니터링

자동화가 되어있어도 논리 오류까지 감지할 순 없음
예시
컬럼명이 바뀌었을때 자동으로 디폴트 0 값 넣는 파이프라인 (today_amount → today_total 로 변경)
today_amount 으로 총 판매액을 계산하고 있다면 판매액이 0으로 표기됨
이와 같은 사항은 수작업으로 처리해야함
스키마 변경 이벤트에 대한 모니터링과 알람 시스템이 필요한 이유

8.3 스키마 레지스트리 구현

다양한 데이터 소스로부터 온 데이터를 처리하려면 스키마에 속성명, 데이터 타입, 디폴트 값 정의 필요

8.3.1 아파치 아브로 스키마

자체 스키마로 데이터 표현
기본 데이터 타입(strings, integers, floats, null 등)부터 복잡한 데이터 타입(records, arrays, enums 등) 지원
관계형 DB부터 복잡한 JSON까지 모든 데이터 표현 가능
사람이 쉽게 읽을 수 있어 수작업으로 정의 가능
스키마 진화를 지원하여 변경 이력 추적 가능
JSON 형식으로 저장되어 JSON 지원 데이터베이스라면 어디든 저장 가능

8.3.2 스키마 레지스트리 솔루션

데이터 카탈로그(AWS Glue, GCP, Azure)
스키마 저장은 가능하지만 버전관리, 검색, 게시 기능이 제한적
각 클라우드의 고유 스키마 표현 방식으로 변환 필요
컨플루언트 스키마 레지스트리
대부분의 기능 제공 (버전관리, Avro 지원, API 지원)
스키마 진화 규칙 지원으로 기존 파이프라인 보호
컨플루언트 커뮤니티 라이선스로 배포(일반적인 오픈소스 라이선스와 다름)

8.3.3 메타데이터 계층의 스키마 레지스트리

API 레이어를 통해 데이터 플랫폼 내 파이프라인, 외부 팀과 툴에서 사용 가능
다양한 툴들과 스키마 레지스트리 간 상호작용하는 방식
스키마 레지스트리 주요 기능
데이터 소스의 현재 스키마 버전 확인
신규 스키마 생성 및 기존 데이터 소스에 새 버전 추가
스키마 레지스트리에 저장할 속성
ID - 스키마의 식별자 (동일 스키마 여러 버전이 있을 수 있으므로 고유값 아님)
버전 - 스키마 버전, ID와 함께 사용해 고유 키 형성
스키마 - 아브로 스키마 정의를 저장하는 텍스트 속성
created_at, updated_at

8.4 스키마 진화 시나리오

스키마 변경의 일반적인 예
신규 컬럼 추가
기존 컬럼 삭제
컬럼명 변경
컬럼 타입 변경
스키마 변경의 두가지 유형
이전 버전 호환성 유지형: 최신 버전으로 이전 데이터 읽기 가능
이후 버전 호환성 유지형: 이전 버전으로 이후 데이터 처리 가능

8.4.1 스키마 호환성 규칙

컬럼 추가 & 삭제
신규 컬럼 추가 시 Avro는 디폴트 값을 자동 적용
이후 버전 호환성시 신규 컬럼 무시 가능
파이프라인이 바로 v2로 전환하지 않고 v1 스키마로 처리하면 신규 컬럼을 무시하고 없는 것처럼 데이터를 계속 읽음
→ 아브로의 호환성 기능은 이런식으로 스키마 변경에 유연하게 대응이 가능
컬럼명 변경
신규 컬럼 추가 및 기존 컬럼 삭제 방식으로 처리
호환성은 컬럼 추가 & 삭제와 동일
디폴트 값 있으면 이전/후 버전 모두 호환가능, 디폴트값 없으면 모두 호환 불가
컬럼 타입변경
아브로는 특정 데이터 타입을 호환 가능한 다른 데이터 타입으로 “승격”하도록 지원
손실되지 않는 방향으로 승격 가능
long > int 64비트에서 32비트이므로 불가
int > long 가능

8.4.2 스키마 진화와 데이터 변환 파이프라인

공통 데이터 변환 파이프라인
특정 컬럼이나 특정 타입을 필요로 하지 않아 스키마 변경에 강한 회복력유지
비즈니스 로직 변환 파이프라인
특정 컬럼에 종속되어 있어 컬럼 삭제 또는 변경 시 오류 발생 가능
디폴트 값으로 일부 회피 가능하지만 완벽하지 않음
예시 - col1 고유값 기준으로 col2의 합계를 계산하는 파이프라인이 있을 때:
스키마가 v2로 변경되면서 col3가 새로 추가되고 col2가 삭제된 경우, 새로운 데이터는 더 이상 col2 값을 포함하지 않으므로 기존 파이프라인이 오류 발생.
만약 col2에 디폴트 값이 있다면, 누락된 컬럼 대신 디폴트 값을 이용하여 파이프라인이 계속 동작.
그러나 디폴트 값이 없으면, 파이프라인은 스키마 v1을 기준으로 동작하기 때문에, 새 데이터에서 col2 컬럼을 찾지 못해 장애가 발생.
스키마 변경 유형별 호환성 정리
스키마 변경
이전 버전 호환성 유지
이후 버전 호환성 유지
변환에 대한 안전성 여부
디폴트 값이 있는 컬럼 추가
디폴트 값이 없는 컬럼 추가
아니요
디폴트 값이 있는 컬럼 삭제
예. 이전 버전 사용시
디폴트 값이 없는 컬럼 삭제
아니요
아니요
디폴트 값이 있는 컬럼면 변경
예. 이전 버전 사용시
디폴트 값이 없는 컬럼명 변경
아니요
아니요
아니요
컬럼 타입 변경
때때로
때때로
때때로
이처럼 스키마 변경에 회복력있는 파이프라인을 유지할 순 있지만, 비즈니스 로직 계산에 논리적 오류까지 없애주진 못하므로 알람 설정이 중요.
신속하게 파이프라인 검토해 변경 작업 진행해야함

8.5 스키마 진화와 데이터 웨어하우스

테이블은 스키마를 반드시 사전 정의해야하고 여러 버전의 스키마가 있을 수 없음
스키마 변경시 테이블 스키마 수정이 필수
테이블 스키마는 변경사항 모두 누적해야하며 되돌릴 수 없는 변경사항은 적용하면 안됨
컬럼 삭제나 컬럼 명 변경시 똑같이 삭제 처리하면 안됨
외부 스키마 레지스트리와 통합 불가
테이블 스키마 최신으로 유지 자동화
스키마 레지스트리에 버전별 스키마 이용해 데이터 웨어하우스 테이블 정의를 업데이트할 SQL문 자동 생성
아브로 데이터 타입을 데이터 웨어하우스에 매핑하는 사용자 정의 개발 필요
테이블이 작은 경우 변경보다 기존 테이블 삭제하고 신규 스키마로 신규 테이블 생성해 마이그레이션하는게 더 빠를 수 있음

8.5.1 클라우드 데이터 웨어하우스의 스키마 관리 기능

AWS 레드시프트 - postgreSQL RDBMS 기반
테이블 스키마 미리 정의 필요
ALTER TABLE 명령으로 테이블 수정기능 제공
테이블 락 때문에 읽기/쓰기 쿼리 불가능
데이터 소비자는 스키마 변경이 끝날때까지 기다려야 함
컬럼 기반 데이터베이스로 컬럼 추가 삭제는 빠른편
컬럼 타입 변경하면 데이터 변환 필요
GCP 빅쿼리
특정 포맷(Avro, Parquet, JSON) 자동 스키마 추론
신규 컬럼 추가만 지원 - 기존 파일의 스키마 기반으로 자동으로 수행
ALTER TABLE SQL 지원하지 않아 컬럼명 변경, 삭제, 컬럼 타입 변경 불가능
신규 테이블을 신규 스키마로 만들어서 마이그레이션 하는 방법이 있지만 큰 테이블의 경우 읽기 비용 많이 나옴