규모 있게 Airflow를 운영하면서 얻은 레슨들 쇼피파이에서는 약 1만개 이상의 DAG들이 실행되고 있고, 한 시점에 평균적으로 약 400개의 task들이 실행될만큼 Airflow를 매우 규모있
규모 있게 Airflow를 운영하면서 얻은 레슨들 쇼피파이에서는 약 1만개 이상의 DAG들이 실행되고 있고, 한 시점에 평균적으로 약 400개의 task들이 실행될만큼 Airflow를 매우 규모있게 사용을 하고 있습니다. 테크 블로그에서는 이렇게 규모있게 Airflow를 운영하면서 쇼피파이 엔지니어링 팀이 얻은 6가지 교훈들과 이에 대한 해결책들을 제시해주고 있습니다. 교훈들과 해결책들을 간단히 요약해봤습니다 1. Cloud 스토리지를 사용하면 파일 acceess가 느릴 수 있습니다 - Airflow는 내부적으로 워크플로우를 최신으로 유지하기 위해 짧은 주기로 반복적으로 DAG 디렉토리에 있는 파일들을 읽고 파싱하는 작업을 합니다. - 처음에 쇼피파이 엔지니어링 팀은 GCS를 DAG스토리지로 사용했고, GCSFuse로 파일이 모든 워커들과 스케줄러에 동일하게 유지되도록 했습니다. 하지만, 각 pod마다 bucket을 mount해야했기 때문에 파일을 읽는 볼륨이 매우 컸습니다. - 그래서, Kubernetes cluster안에 NFS를 설치해서 문제를 해결했습니다. - NFS 서버를 read-write-many volume으로 워커들과 스케줄러에 mount했고, 커스텀 스크립트로 이 volume과만 GCS가 싱크할 수 있도록 구현했습니다. 2. Metadata의 Volume이 커지면 Airflow 운영을 저하시킬 수 있습니다 - Metadata가 많아질수록, Web UI 로딩 시간이 길어지고 Airflow 업그레이드시에 migration이 오래 걸릴 수 있습니다. - 쇼피파이 엔지니어링 팀은 retention 기간을 28일로 두고, 그 전 metadata는 삭제하도록 구현했습니다. 3. DAG들을 여러 유저들이나 팀이 같이 사용하기 어려울 수 있습니다 - 쇼피파이에서는 각 프로젝트 혹은 repo에서 하나의 Airflow로 배포하는 형식이었습니다. 이런 구조에서는 어떤 DAG가 장애가 났을때 빠르게 오너를 찾기 어려웠습니다. - 그래서 하나의 YAML manifest 파일을 만들고 각 팀이나 유저마다 namespace를 만들어서 활용할 수 있도록 했습니다. - 파일의 설정을 보고 오너가 누구이고 source github repository는 어디인지 쉽게 알 수 있었습니다. 4. DAG author들이 너무 많은 파워를 가지고 있습니다 - 각 DAG author들이 직접 DAG를 작성하고 올릴 수 있게 하면서 모든 권한을 author들이 갖게 되었습니다. 권한의 관리가 필요했습니다. - 그래서, DAG policy를 구현했고 Airflow manifest를 통해 각 namespace에서 constraint를 만족하는 DAG들만 만들 수 있도록 했습니다. 그 외에는 에러를 raise하게 했습니다. 5. 작업이 일관되게 잘 분배되도록 보장하는 것이 어렵습니다 - 유저가 직접 DAG들을 생성하다보면 Airflow scheduler에 overload를 줄 수 있는 상황이 발생합니다. - 예를 들어, DAG들 중에 한시간 주기마다 실행되어야 하지만 꼭 0분에 실행되어야 하는 이유는 없는 경우가 있습니다. 이때 따로 분배를 해주지 않는다면 대부분의 DAG들이 0분에 몰려서 실행되도록 구성되는 경우가 많습니다. - 그래서 쇼피파이 엔지니어링 팀은 모든 자동으로 생성된 DAG들에 대해서 결정론적으로 랜덤한 schedule 주기를 갖도록 구현했습니다. 6. 자원 경합하는 경우가 많습니다 - 경합을 줄이기 위한 방법 중 하나는 pool을 사용하는 것입니다. Pool은 주어진 task들의 concurrency를 제한할 수 있습니다. - Priority weight를 사용해서 task에게 우선순위를 부여할 수 있습니다. 자원 경합의 직접적인 해결책이 아닐 수도 있긴 하지만, latency가 중요한 task들이 우선순위 낮은 task들보다 더 빠르게 실행될 수 있도록 도움을 줄 수 있습니다. - 다른 환경에서 task를 실행시키고 싶을때는 다른 queue를 생성해서 사용할 수 있습니다. 더 자세한 내용들은 쇼피파이의 테크 블로그 글을 참고해주세요