진행 중 · 2026-09

따로 돌던 수집기 22종을 공통 Airflow 경로로 병합

수동 실행과 상주 컨테이너로 흩어져 있던 수집기를 모노레포 컴포넌트와 Airflow DAG로 옮기고, 옮기면서 드러난 결함을 고쳤습니다.

기간2026-09 ~ (진행 중)
대상 저장소labrador-scrapers · labrador-data-platform · batch-statisticsdb
역할데이터 엔지니어 · 병합 계획과 이관 실행
AirflowKubernetesMySQLPython크롤러

작업 요약

수집기 22종 중 16종 전환 · 라이브러리 통계 스캔 163GB → 11GB

스케줄러 밖에서 돌던 수집기가 22종이었습니다

2026년 9월 기준으로 공통 실행 환경인 labrador-scrapers 밖에서 도는 수집기가 22종이었습니다. OS 배포판 취약점 수집기 10종은 별도 서버에서 docker compose로 손으로 띄웠고, Go·Maven·NuGet·Packagist·RubyGems·CocoaPods 라이브러리 크롤러 6종은 컨테이너 안에서 4시간 루프로 스스로 돌았습니다. 주기를 바꾸거나 멈추려면 서버에 들어가야 했고, 실패해도 알림이 오지 않았습니다.

고객사 내부에 수집 체계를 그대로 세워야 하는 과제가 생기면서 실행 방식을 하나로 맞추는 일이 먼저가 됐습니다. 그래서 데이터 이동이 없는 수집기부터 옮기고, 이관마다 원본 테이블을 동결한 뒤 행 수와 워터마크를 대조하는 순서로 진행했습니다.

배경

수집 결과는 gatheringdb 생태계 테이블과 labradordb 공용 테이블에 나뉘어 쌓였습니다. 통계 툴은 공용 테이블만 세고 있어서, 이관이 끝난 언어의 숫자가 이관 시점에 멈춘 채 석 달 동안 보고되는 일도 있었습니다.

이관 순서와 판단

  1. 현황표

    22종의 위치·실행 방식·상태·이관 여부를 한 표로 정리

  2. 컴포넌트화

    상주 루프와 자체 스케줄을 빼고 1회 실행 유닛으로, 커서는 상태 테이블로

  3. 데이터 이관

    원본 동결 후 전용 테이블에 복사하고 행 수·워터마크·행 단위 diff 대조

  4. 컷오버

    레거시 컨테이너 중지, DAG 활성화, 통계·취약점 매퍼·배포 동기화 설정 재지정

병합 후 실행 구조

전체 구조를 먼저 보고, 크게 열어 세부 내용을 확인하세요.크게 보기ExcalidrawMermaid
별도 서버의 수동 docker compose와 상주 컨테이너에서 돌던 수집기를 labrador-scrapers 컴포넌트 이미지로 옮기고, Jenkins 빌드를 거쳐 Airflow DAG가 KubernetesPodOperator로 실행하며, 결과를 gatheringdb 생태계 테이블에 적재한 뒤 배포 DB로 동기화하고 실패는 Slack으로 알리는 구조
수동 docker compose와 상주 컨테이너로 나뉘어 있던 수집기를 같은 컴포넌트 이미지와 Airflow DAG로 옮기고, 적재 대상을 gatheringdb 생태계 테이블로 모았습니다. Maven DAG 활성화와 npm·pypi 테이블 이관은 아직 대기 상태입니다.

컴포넌트 이미지는 Jenkins가 빌드해 레지스트리에 올리고, Airflow DAG가 KubernetesPodOperator로 실행합니다. 실행 시간이 주기보다 긴 크롤러는 매시 스케줄에 주기 가드를 두어 마지막 실행 기록을 보고 건너뜁니다. 적재는 gatheringdb 생태계 테이블로 모으고, 배포 DB 동기화와 통계는 그 테이블을 읽도록 다시 지정했습니다.

옮기면서 드러난 결함

이관은 오래 돌던 수집기를 처음으로 한 화면에서 보게 만드는 일이기도 했습니다. 아래는 그 과정에서 잡은 것들입니다.

결과

9월 25일 기준입니다. 이관 수는 9월 9일 현황표의 22종을 기준으로 셌습니다.

22종 중 16종 전환OS 취약점 10종·LPP·CocoaPods·RubyGems·NuGet·Packagist·Go. Maven은 복사·검증 후 DAG 활성화 대기
통계 스캔 163GB → 11GBLANGUAGE 조건 제거로 커버링 인덱스 사용, 실패하던 JAVASCRIPT 집계 122초 완료
GOLANG 통계 +1,281,357건6월 30일에 멈춘 1,662,387 → 실측 2,943,744
고스트 DAG 20 → 0활성 DAG 92개 = 파일 92개
Go 적체 421,746건 복구처리 중 상태에 멈춘 작업행을 컷오버 때 reclaim
알림 경로 SlackDAG 53개의 실패 알림이 첫 예외 줄과 로그 링크를 싣고 도착

남은 일과 한계

역할

병합 프로그램의 하위 작업은 전부 제가 맡았습니다. 현황표 작성, 이관 순서와 테이블 위치 결정, 컴포넌트 이식과 DAG 작성, 컷오버 실행과 소비자 재지정까지 했고, 컨테이너 중지·DDL·복사처럼 운영에 손대는 단계는 런북을 쓰고 직접 실행했습니다. 고객사 내부 수집 체계 구축 과제는 동료와 함께 맡았고, 수집 모니터링 화면은 다른 담당자가 만들었습니다.

관련 항목: 12개 라이브러리 크롤러 누락 점검과 Python 전환 · 수집처별 법적·운영 경계 정리 · K8s · Airflow 데이터 수집 플랫폼 운영·장애 대응

근거 자료

아래 기록에 근거해 정리했습니다. 내부 원문 경로를 표시하며, 비공개 원문 파일은 이 페이지에서 제공하지 않습니다.