[Prefect] Prefect 서버 custom Postgres RDS 세팅 (not cloud)

홍성환·2021년 10월 30일
3
post-thumbnail

1. Intro

  • prefect clound는 run당 돈을 과금하는데 이게 헤비하게 사용하면 생각보다 부담이 될 수 있다
  • hourly 잡이면 효율적으로 쓸 수 있을 것 같은데, minutely job이 run당 과금 방식의 한계로 인해 상당히 돈이 아까워 진다.
  • 돈을 한푼이라도 아끼려면 cloud를 쓰는 대신에 UI 서버를 직접 띄워야 하는데 띄울 때 들어간 삽질 및 팁을 공유하고자 한다.

2. Postgres SQL

  • prefect을 운영하기 시작하면 수많은 flow들이 생기게되고 관련 로그 및 실행 설정들이 저장되게 된다.
  • 이 정보들은 제일 왼쪽 RDS에 저장된다.
  • prefect를 처음 실행(prefect server start)를 6개의 docker container가 뜨는데 그 중 하나가 postgres SQL server이다
  • 이 docker container 내부에 있는 RDS 서버로 모든 정보가 저장되게 된다.

3. Using Custom DB

prefect 서버가 죽거나 사라져도, RDS만 다시 잘 지정해줘서 띄우면 서버가 죽기 직전 상태로 돌아갈 수 있다!
RDS만 남아 있으면 괜찮다.

  • prefect의 모든 상태 정보는 RDS에 저장된다. 떄문에 UI 서버가 죽더라도 DB서버만 살아 있으면 모든 상태가 초기 상태로 돌가지는 않는다.
  • 이런 이유 때문에 prefect server start 를 통해 뜨는 docker container SQL 서버가 아닌 직접 운영 중이거나 관리하려고 만든 RDS를 쓰고 싶은 필요성이 생기게 된다.
  • prefect server start 로 실행한 서버가 죽거나 문제가 생기더라도 RDS를 잘 유지하면 원래 상태로 돌릴 수 있기 때문이다.

~/.prefect/config.toml

  • prefect server start 명령어를 쓸 때 여러가지 사용자 설정을 config.toml 설정을 통해 줄 수 있다.
  • 그중 우리가 설정할 부분은 server.database이다.
  • 설정 파라메터가 엄청 많지만 connection_url만 줘도 제대로 동작한다!
    • 운영할 예정인 custom rds의 postgres connection_rul을 [server.database] 아래 항목에 넣어주면 된다.

4. DB 내부 구조 및 삭제

  • prefect를 띄우게 되면 아래 사진 처럼 prefect는 각종 테이블들을 만들어낸다.

  • 아래 테이블 중 cloud를 안 쓰고 직접 운영할 때 직접 관리해야하는 테이블은 log와 관련된 테이블이다.

  • log 데이터가 계속 쌓이기만 하고 어떻게 지울 수 있는지 제대로 된 안내를 찾기 힘들다.

    • (cloud 서비스를 사용할 경우 일정 기간의 유지 시간이 있고 알아서 관리 되지만, 직접 운영의 경우 현재(21년 10월 31일)는 가이드 라인을 홈페이지에서 찾기 힘들다)
  • prefect는 slack에 커뮤니티?가 있는데 log 정리는 자주 올라오는 질문이고 다들 DB에 delete 쿼리를 직접 날려서 관리하는 것을 알 수 있다.

    • prefect 슬랙글(오른쪽) / prefect가 만들어내는 DB 테이블 리스트(왼쪽)
  • 지워야할 테이블은 log, task_run, task_run_state, flow_run, flow_run_state 5개이다.

  • log, task_run, task_run_state 는 updated 컬럼을 기준으로 delete 쿼리를 통해 날려버리고 vaccum을 하면 된다.

  • 주의해야할 테이블은 flow_run, flow_run_state 테이블이다.

flow_run_state

  • flow_run_state 테이블은 아래 처럼 state라는 컬럼이 있다.
  • 처음에 나는 flow_run_state 테이블을 update 컬럼 기준으로 delete를 때려버리는 실수를 한적이 있다.
  • state='Scheduled'라는 값을 가진 row 까지 덕분에 삭제해버렸는데 이 row는 prefect UI에서 아래처럼 노란색으로 보이는 예약된 flow이다.
  • 이 노란색 예약 flow를 삭제하면 어떻게 될까?
    • 영문도 모른채로 실행해야할 job이 실행이 안 된다;;
  • 따라서 flow_run_state와 flow_run 테이블을 지울떄는 반드시 state를 체크해서 지우고 실행 완료 된것인지 체크해서 지우거나 log 테이블에서 지워지는 flow_id만 따로 log에서 지워지는 flow_id 와 관련된 row만 지우는 것이 좋다.

5. prefect server start 주의사항

  • prefect server start 를 실행시 가끔 docker 관련 오류가 난다.
  • 이때 permission 관련 에러가 나면 sudo 권한으로 그냥 실행하게 되는데 이러면 ~/.prefect/config.toml설정이 먹지 않기 때문에 sudo 권한으로 문제를 해결하면 안된다.
    • docker.sock 파일의 permission 문제를 해결해줘야한다.( chmod를 쓰거나 usergroup docker에 유저를 추가한다.)
  • tml/docker-compose 어쩌구 하는 에러가 나기도 하는데 그냥 그 파일을 지우고 다시 돌리면 된다.
  • prefect 서버를 죽여도 관련 도커 컨테이너 잔재가 남게 된다. 완벽하게 재시작을 하고 싶으면 도커 컨테이너를 전부 완벽히 지우고 삭제해주자.

6. 끝

  • Prefect 운영시 custom DB를 사용하면 운행중인 서버에 장애가 대처가 가능하다는 장점이 있다.
  • custom db 세팅 방법을 알아봄
  • custom db 사용시 log 지우는 법과 주의사항을 알아봄
  • prefect server start로 재시작 할 때 주의사항 알아봄
profile
Machine Learning Engineer: recsys, mlops

0개의 댓글