Airflow 메타 DB를 SQLite에서 MySQL로 전환

2sky·2026년 2월 5일

AirFlow

목록 보기
7/8

1. 왜 이 작업을 하게 되었나

Airflow를 처음 구성할 때는 메타 DB로 SQLite를 사용했다.

설정이 간단했고, 빠르게 환경을 띄울 수 있었기 때문이다.

초기에는 DAG 수도 적고 실행 빈도도 낮아 큰 문제를 느끼지 못했다.

하지만 DAG 수가 늘고, 실행 빈도가 증가하면서 다음과 같은 문제가 반복적으로 발생했다.

  • Scheduler가 예고 없이 종료됨
  • DAG 실행 상태가 UI에 반영되지 않음
  • 동시에 여러 DAG이 실행될 경우 불안정해짐
  • 특히 pandas 기반의 메모리 사용량이 큰 작업이 실행될 때 Scheduler가 자주 종료됨

처음에는 작업 코드의 문제라고 생각했다.

하지만 동일한 코드라도 DAG가 겹쳐 실행되는 상황에서만 문제가 발생했다.

이 시점부터 Airflow를 단순한 실험 도구가 아니라

운영 환경에서 신뢰하고 사용해야 하는 스케줄러로 쓰고 있다는 신호라고 판단했고,

가장 먼저 메타 DB부터 정리하기로 했다.


2. 문제의 원인: SQLite의 한계

Airflow의 메타 DB에는 다음과 같은 컴포넌트들이 동시에 접근한다.

  • Scheduler
  • Webserver
  • Worker (LocalExecutor 기준)

이 컴포넌트들은 지속적으로 다음 작업을 수행한다.

  • DAG Run 상태 write
  • Task Instance 상태 update
  • Heartbeat 기록

SQLite의 구조적 한계

SQLite는 파일 기반 DB이며 single-writer 모델을 가진다.

  • 하나의 write 트랜잭션이 발생하면 → DB 파일 전체가 lock됨
  • 다른 write 요청은 → 대기하거나 실패

즉, 여러 프로세스가 동시에 상태를 기록하는 Airflow 구조와는 맞지 않는다.

그 결과 write lock 경합이 발생했고,

Scheduler heartbeat가 실패하면서 프로세스가 종료되는 현상이 반복되었다.


3. 해결 방향

해결 방향은 단순했다.

  • 메타 DB를 서버형 DB로 변경
  • 동시 write를 안정적으로 처리할 수 있는 구조로 전환

회사에서 이미 표준 DB로 MySQL을 사용하고 있었기 때문에,

추가적인 운영 부담 없이 MySQL을 메타 DB로 선택했다.


4. MySQL 기반 메타 DB 구성 (docker-compose)

메타 DB 이관을 위해 최소한의 구성으로 docker-compose를 구성했다.

4.1 MySQL 서비스

mysql:
image:mysql:8.0
container_name:mysql
restart:unless-stopped
environment:
MYSQL_ROOT_PASSWORD:rootpw
MYSQL_DATABASE:airflow
MYSQL_USER:airflow
MYSQL_PASSWORD:airflowpw
ports:
-"3306:3306"
volumes:
-./mysql:/var/lib/mysql
  • Airflow 전용 DB 생성
  • 데이터 유실 방지를 위한 volume 마운트
  • binlog 등 불필요한 설정은 제외한 최소 구성

4.2 Airflow Webserver

airflow-webserver:
image:airflow-webserver:2.8
depends_on:
-mysql
environment:
-AIRFLOW__CORE__EXECUTOR=LocalExecutor
-AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=mysql+mysqlconnector://airflow:airflowpw@mysql:3306/airflow
-AIRFLOW__CORE__LOAD_EXAMPLES=False
command:airflowwebserver

핵심 설정은 한 줄이다.

AIRFLOW__DATABASE__SQL_ALCHEMY_CONN

SQLite 대신 MySQL을 메타 DB로 사용하도록 지정한다.


4.3 Airflow Scheduler

airflow-scheduler:
image:airflow-scheduler:2.8
depends_on:
-mysql
environment:
-AIRFLOW__CORE__EXECUTOR=LocalExecutor
-AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=mysql+mysqlconnector://airflow:airflowpw@mysql:3306/airflow
command:airflowscheduler

Webserver와 Scheduler가 동일한 메타 DB를 바라보도록 설정했다.


5. 적용 결과

메타 DB를 MySQL로 전환한 이후 다음과 같은 변화가 있었다.

  • Scheduler 비정상 종료 현상 사라짐
  • 동시 DAG 실행 시에도 안정적으로 동작
  • UI 상의 DAG / Task 상태 갱신 지연 해소
  • 재실행, catchup 시 신뢰도 향상

즉, 성능 튜닝이 아니라 안정성 문제가 해결되었다.


6. 느낀 점

이 작업을 통해 명확히 느낀 점은 다음이다.

  • Airflow에서 메타 DB는 단순한 설정 요소가 아니다
  • 운영 환경에서는 SQLite는 선택지가 아니다
  • 문제를 DAG 코드에서 찾기 전에, 플랫폼 구성부터 점검해야 한다

Airflow를 “돌아가게 만드는 것”과
“안정적으로 운영하는 것”은 완전히 다른 문제
였다.


7. 정리

  • SQLite는 실험 환경에는 적합하지만 운영 환경에는 부적합
  • Airflow 메타 DB는 동시 write를 전제로 설계되어야 함
  • MySQL 이관은 가장 먼저 해야 할 운영 안정화 작업 중 하나

이후에는 데이터 처리 파이프라인 자체에서도

재실행과 멱등성을 고려한 구조를 설계하게 되었고,

그 내용은 별도의 글로 정리할 예정이다.


한 줄 요약

Airflow 운영에서 메타 DB는 옵션이 아니라 전제 조건이다.

profile
하늘하늘한 하늘

0개의 댓글