현상
AWS EKS에서 Helm으로 Apache Superset을 설치해 사용 중이다. 최근 EKS 버전 업그레이드 작업을 진행했는데, 작업 후 서비스를 확인하던 중 로그인 후 메인화면이 정상적으로 표시되지 않는 현상이 발생했다.
확인해 보니 작업 중 쿠버네티스 클러스터 노드가 변경되면서 새로 Superset 도커 이미지 pull이 발생했는데, Helm으로 배포한 values.yaml에 이미지 태그가 특정 버전으로 고정되어 있지 않고 latest로 지정되어 있어 Superset DB의 버전과 차이가 발생하게 된 것 같다. 특정 컬럼이 존재하지 않는다는 로그와 함께 데이터 로드에 실패하는 모습을 확인할 수 있었다.
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedColumn) column tables.normalize_columns does not exist
LINE 1: ...es_template_params, tables.extra AS tables_extra, tables.nor...
아무래도 데이터베이스를 초기화하고 데이터를 복구하는 게 나아보여 아래와 같이 진행하게 되었다.
1. Helm Release 삭제 (Chart version : 0.9.3 / App version : 2.1.0) 또는 Superset DB 삭제
# Helm Release 삭제
helm uninstall superset
kubectl delete pvc data-superset-postgresql-0
# Superset DB Drop & Create
kubectl exec -it superset-postgresql-0 -- bash
psql -U postgres
DROP DATABASE superset WITH (FORCE);
CREATE DATABASE superset;
2. Helm Chart 최신 버전으로 신규 설치 (Chart version : 0.11.2 / App version : 3.0.1)
helm upgrade --install --values superset-values.yaml superset superset/superset --version 0.11.2
3. Superset DB를 기존 데이터로 복구
kubectl exec -it superset-postgresql-0 -- bash
psql -U superset -f <dump.sql>
그러나 이후 superset 웹에서 확인해보면 데이터는 존재하지만 정작 대시보드나 차트는 전부 깨져있고, 설정 변경을 위해 재배포를 해보면 아래와 같은 에러가 발생하면서 배포가 되지 않았다.
ERROR [flask_migrate] Error: Requested revision 4b85906e5b91 overlaps with other requested revisions 9c2a5681ddfd
원인
로그 내용을 보면 alembic이라는 단어를 확인할 수 있는데 alembic이란 SQLAlchemy 기반 데이터베이스 마이그레이션 도구이다. 데이터베이스 스키마를 관리하는데 revision이라는 개념을 사용하는데, 아무래도 superset db init 명령어 실행 중 revision 4b85906e5b91, 9c2a5681ddfd 간에 충돌(?)이 발생하는 것 같다.
데이터를 초기화하고 복구하는 과정에서 9c2a5681ddfd와 4b85906e5b91 두 개 값이 같이 존재하는 게 문제인 것 같았다.
해결
superset 버전에 알맞는 superset DB alembic 리비전을 사용하면 된다. 이 글의 경우에는 superset DB에서 기존 데이터 복구로 인해 추가된 revision을 삭제했다.
kubectl exec -it superset-postgresql-0 -- bash
psql -U superset
SELECT * FROM alembic_version;
확인해 보면 버전이 두 개가 존재하는 것을 확인할 수 있다. 이 글의 superset은 2023-12-16 기준으로 최신 버전인 3.0.1을 사용하고 있으므로, 두 리비전 중 최신 리비전을 남겨둔다. 리비전은 https://github.com/apache/superset/tree/master/superset/migrations/versions에서 확인할 수 있다.
확인해 보면 두 리비전 중에서는 4b85906e5b91이 최신 버전인 것을 알 수 있다. 따라서 9c2a5681ddfd을 테이블에서 삭제한다.
DELETE FROM alembic_version
WHERE version_num = '9c2a5681ddfd';
이후 다시 helm upgrade를 하여 설치를 진행하면 정상적으로 설치되고, 웹에서 데이터도 정상적으로 확인되는 모습을 확인할 수 있다.
참고 문서
How do I fix alembic's "Requested revision overlaps with other requested revisions"?
https://blog.outsider.ne.kr/1143