[Conference] 토스 SLASH23
SLASH 23 후기 :
은행 데이터플랫폼 오픈소스로 전환하기
1. SLASH 23
1.1. 참석 계기
- 토스 유튜브를 구독하고 있어서 바로 SLASH 23 홍보 영상을 보게 되었고, 바로 참석 신청을 했다.
- 개인적으로 토스의 SLASH는 문제 정의부터 해결까지 전반적인 과정을 공유해줘서 현업 개발자로서 문제 해결 과정을 엿볼 수 있어 좋다.
- 해당 포스팅은 토스 SLASH 23의 데이터 엔지니어 세션 중에서 은행 데이터플랫폼 오픈소스로 전환하기를 다루며, 정보 구조화 및 공유를 목적으로 작성한다.
1.2. 데이터 엔지니어 세션
2. 은행 데이터플랫폼 오픈소스 전환하기
2.1. 문제 인식
1) 시스템 구조
- 초기에 타 은행 시스템 구조와 동일
- 계정계 : 은행의 거래 데이터를 다루는 시스템 (입금, 출금, 외환 등)
- 채널계 : 비대면 채널들을 관리하는 시스템 (모바일 뱅킹, 인터넷 뱅킹)
- 정보계 : 고객의 거래 데이터를 가지고 통계 및 분석하는 영역
- 토스뱅크 플랫폼
- 계정계 : Oracle → 정보계(Oracle Exa)
- 채널계 : Kafka, MySQL, Tibero, MongoDB → 정보계(Hadoop)
- 정보계 : Hadoop(분석) ↔ Oracle Exa(단위업무)
- Kafka의 로그 데이터 분석, CSS Feature 관리 업무와 같은 빅데이터 영역을 위해 Hadoop 도입
- 보고서나 단위 업무 처리 시 Oracle Exa에서 진행
2) 문제점
- 불필요한 데이터 이동 발생
- 보고서나 단위 업무 처리 시 Hadoop 데이터를 Oracle Exa로 보내야 함
- 대용량 데이터 처리 시스템 2개 존재
3) 개선 방안
- 대용량 데이터 처리 시스템을 Hadoop 하나로 통일
- 동일 용량 대비 구축 비용이 Hadoop이 Oracle Exa보다 10배 이상 저렴
- Oracle Exa의 정보계성 단위 업무들을 Hadoop으로 이관
4) 도전 과제
- 가능성 : 기존 플랫폼을 무엇으로, 어떻게 대체할 것인가?
- Oracle Exa, Scheduler, CDC 와 같은 여러 기술 컴포넌트 포함
- 정합성 : 옮기면서 정합성을 어떻게 맞출 것인가?
- 은행은 한국은행, 금감원과 같이 대외기관에 공시/보고 의무 있음
- 기존 시스템과 동일한 값임을 어떻게 보장해야 할지 중요
- 효용성 : Oracle 비용 절감 효과보다 옮기는데 발생한 비용이 더 큰가?
2.2 가능성
1) 대체 오픈 소스
- 기존에 사용했던 솔루션들을 오픈 소스로 대체한다.
솔루션 | 오픈 소스 | |
---|---|---|
Scheduler | Scheduler Solution | Airflow |
Storage | Oracle | HDFS/KUDU |
Query Engine | Oracle Query Engine | Impala/Spark |
ETL | ETL Solution | Sqoop |
CDC | Oracle Golden Gate | Debezium |
- Airflow & Github
- 토스뱅크의 많은 서비스들은 k8s 에서 돌림
- Helm chart를 통해 설치가 쉽고, Scale Out 이 쉬움
- 코드로 파이프라인 작성이 가능하기에 코드 검색이 쉬움
- Custom Operator 작성이 쉬움
- HDFS & KUDU
- Oracle과 달리 HDFS는 PK, Secondary Index가 지원되지 않음
- PK를 위해 KUDU 사용 (대부분의 DW는 PK만으로도 충분)
- Impala & Spark
- 표준 Ansi SQL 기반 SQL 문법 제공
- Impala : 쿼리 결과를 변수에 담아 다음 쿼리에 이용하는 로직 구현 어려움
- Spark : Java, Python 등의 언어로 로직 작성 가능하기에 자유도 높음
- Ranger로 접근 제어
- Sqoop
- ETL 솔루션 : DB 부하를 적게 주기 위해 파일 기반으로 추출
- ETL 오픈 소스 : Query 기반으로 추출하기에 자유도는 높지만 DB 부하가 상대적으로 큼
- 추출할 데이터 Query에 맞게 Table도 Indexing 처리 필요
- Debezium
- 지원 DB가 MySQL, Oracle, MongoDB 등 다양하며 안정성 높음
- Debezium으로 Oracle CDC 구축 방안
- Logminer : 무료, 성능 및 안정성 낮음
- XStream API : 유료, 퍼포먼스 좋고, 2.8배 정도의 Throughput 차이
- 라이브 환경에서 Log Switch가 DEV 환경보다 더 빈번하기에 20배 이상의 차이
2) ETL과 CDC 작업
- ETL과 CDC 작업 시 서비스 DB에 부하를 줄 수 있음
- Read Only Slave DB에서 ETL 작업
- 계정계의 Oracle은 BCV DB에서 ETL 작업
- Update 되는 테이블에 대해 updated_at 필드 추가해서 업데이트된 데이터만 ETL 해갈 수 있도록 구성
3) Airflow 선후행
- Batch Job 을 Bit Operator 통해 선후행 설정
- 다른 DAG의 Task들과 선후행 지정 시 Trigger가 아닌 Sensor 사용
- 월별 작업이 일별 작업 완료 후에 실행되어야 함
- Airflow에서 제공하는 ExternalTaskSensor 상속받아 Sensor 새로 생성
- 선행 작업의 DAG 실행 시간(schedule interval) 변경되면 후행으로 잡은 Task Sensor의 execution date function도 전부 바꿔야 함 (관리 포인트)
- Sensor 생성 시 Time Range를 일, 시간 단위 등으로 time slice 값 넣도록 하고, time slice 안에 실행된 선행의 Task 가 있다면 Sensor가 OK하도록 구현
- 이기종 간 Scheduler 가 존재
- 기존의 Scheduler의 모든 작업을 Airflow로 옮길 수 없었기 때문에 2개 존재
- DB/File을 이용해 선행 작업 완료 시 Sync, Sensing 구현
2.3. 정합성
1) 기존 Flow
- 원천 DB → 정보계
- Oracle 정보계 : 원천 ETL → 공통 마트 → 리스크 마트 → 보고서 마트
- Hadoop 정보계 : 원천 ETL → 공통 마트
2) 원천 ETL
- 원천 DB에서 ETL 시 Snapshot 으로 수행하므로 정합성 검증 필요 없음
3) 마트 이관
- 공통 마트 영역을 Hadoop으로 이관
-
Oracle에 적재된 공통 마트 영역 ETL → Hadoop에 적재
- Hadoop에서 만든 마트와 정합성 체크하는 Batch 생성
- 주기적으로 실행해서 1-2주 정도 데이터가 틀리지 않았다는 것 확인
- Hadoop에서 만든 공통 마트 → Oracle로 ETL하는 Batch 생성
- 후행에 걸린 마트(리스크 마트 등)는 Hadoop에서 건너온 공통 마트 참조
- 문제 없으면 선행으로 돌던 Oracle 배치 삭제
- 같은 방법으로 리스크 마트도 수행
- Oracle의 리스크 마트 → Hadoop에 적재
- Hadoop에서 정합성 Batch 주기적으로 실행
- 문제 없으면 Oracle로 ETL 하는 Batch 생성
- 후행에 걸린 마트(보고서 마트)는 Hadoop에서 건너온 리스크 마트 참조
- 문제 없으면 선행으로 돌던 Oracle 배치 삭제
- 같은 방법으로 보고서 마트도 수행
- 모든 이관 작업 완료 시, Oracle Exa 비움
4) 정합성 Batch
-
Spark의 union, row count 활용
- Hadoop에서 만든 마트 = new_df
- Oracle에서 넘긴 마트 = org_df
new_df = new_df.dropDuplicates() new_df.count = new_df.count() org_df.count = org_df.count() ... total_df = new_df.unionByName(org_df, allowMissingColumns=True) total_df = total_df.dropDuplicates() total_df_count = total_df.count() ... if total_df_count != new_df_count: print("Different Data!") elif total_df_count != org_df_count: print("Different Data!")
2.4. 효용성
1) Impala 활용 시 어려움
- Oracle에서 지원되는 Syntax가 Impala에서 지원되지 않음
- Impala에서 암시적 형 변환이 지원 X
- Oracle에서 Decimal 데이터 → Cast 로 직접 변경해야 함
-
, to_date, to_char 함수 지원 X - Rollup, Cube, Merge Into 함수 지원 X (Impala v3.2)
- Impala에서 암시적 형 변환이 지원 X
2) Spark 활용
- Spark SQL Syntax는 Oracle과 유사한 Syntax를 제공
- 암시적 형 변환 지원 O
- Cast 필요 없음, 소수점 처리 방식도 유사
- Oracle 문법 대부분 지원 O
- 단, Merge Into의 경우 Hudi, Delta Lake, Iceberg와 같은 차세대 DW 오픈소스 도입 필요
- 암시적 형 변환 지원 O
3) 이관 후 성능 향상
- Long Running Query 시간 단축
- 일 수신계약 집계 작업 Query : 17분 → 4분
- 월 대외보고서 지표 집계 작업 Query : 31분 → 1분
- 자금 만기 CF 산출 내역 Query : 41분 → 1분
- 업무 단위별 시간 단축
- 신용리스크 마트 : 67분 → 37분
- ALM 마트 : 100분 → 54분
- 공통 마트 : 40분 → 1분
- 월 보고서 마트 : 88분 → 14분
- 대략 5.3배 성능 향상
4) 이관 후 운영 편의성 증가
- 재수행 자동화
- 기존 Scheduler의 경우 재작업 불가
- 직접 작업자가 선행 Job 재수행 → 선행 Job 끝나는 것 확인 후에 후행 Job 재수행
- Airflow의 경우 재수행 DAG 작성해서 원하는 시기에 재수행 가능
- start_date, end_date
- max_active_run, concurrency
- 중복 ETL 요청 감소
- 정보계를 Hadoop으로 통합하면서 ETL 요청 필요 없음
- 코드 가독성 및 검색 용이
- Github 하나의 Repo에 Schedule 코드, Program 코드 등 모여있음
2.5. 보안 / 컴플의 요건 고려
1) 전자금융감독규정 제 29조
- 프로그램 등록, 변경, 폐기 내용의 정당성에 대해 제 3자의 검증을 받을 것
- Airflow 의 Batch 프로그램도 해당됨
- 배포 전 : 제 3자 검증을 받아야 함
- 배포 시 : 서비스 책임자의 승인이 필요함
- 기존 Airflow 의 Helm Chart
- git-sync가 주기적으로 코드 가져감
- Master Branch를 막고 PR을 통해 Merge 시 제 3자 검증 가능
- 하지만 제 3자 검증 완료 시 바로 배포되어서 서비스 책임자 승인 불가
- GoCD Pipeline + Helm Chart
- 제 3자 검증, 서비스 책임자 검증, 배포 이력 관리 용도로 사용
- git-sync의 auto polling 기능 끄고 GoCD에서 제 3자, 서비스 책임자 검증 완료 시 Agent에서 git-sync 수동 호출
2) 전자금융감독규정 제 30조
-
일괄작업은 책임자의 승인을 받은 후 수행할 것
-
Heimdall 웹 서비스 개발
- 일괄 배치 작업 통제해주는 서비스
- Airflow에서 관리자 권한 전부 회수하고, Heimdall에서 Airflow DAG의 on/off 요청
- Airflow 코드 배포 → Heimdall에 일괄배치 승인 요청 → 책임자 승인 → Heimdall DB에 승인 내역 기록 → DAG 스케쥴 on
3) Sentry에서 Ranger로
- 기존에 Impala는 Sentry를 활용해 접근 제어
- Impala 4.x 버전부터 미지원, 관리 부족 등으로 Ranger로 변경
- Ranger의 장점
- Hadoop 에코시스템 사용자별 접근 제어 기능
- 권한별 / 테이블별 컬럼 마스킹, 해싱 기능
- 권한별 테이블 데이터 Filter 기능 (특정 컬럼만 접근)
- Hadoop 컴포넌트 Audit 로그 제공
2.6. 토스뱅크 데이터팀의 방향성
- 차세대 DW 시스템
- Hudi, Iceberg 도입 준비
- CDC 시스템 고도화
- MongoDB와 같은 NoSQL DB의 CDC 개발 예정
- 시스템 전환
- Attic Project(Retired) 된 Sqoop 대체할 Nifi 도입 준비
3. 생각
- 은행 플랫폼 전환은 전자금융감독규정에 따라 더 엄격하고 정확하게 진행해야 한다는 것을 알았고, 그 중에서도 정합성과 승인 절차가 핵심인 것 같다.
- 대용량 처리 플랫폼을 하나로 통합하면, 비용과 성능 상 큰 이점을 가진다는 것을 느꼈다.
- 데이터 마이그레이션 시 정합성 보장에 union, row count를 활용했는데 다른 방법이 있는지 더 찾아봐야겠다.
- 요즘 대부분의 회사가 클라우드 전환을 하고 있어서 오픈 소스 전환 사례를 찾기 힘들었는데, 흥미로운 시간이었고 문제 해결을 위해 최적의 방법을 찾는 과정에 얼른 참여하고 싶다.