개요

필자는 회사에서 Redash를 3.0 버전으로 docker-compose 기반으로 운영하고 있었다. 이때 리대시 버전이 4.x로 올라가며 상당히 바뀌었다는 얘기에 맞추어 리대시를 4.0으로 업그레이드를 진행하며 얻은 Step을 정리해둔다.

운영현황

필자는 회사에서 Redash를 공식 제공 Docker Compose를 활용해서 운영하고 있다.

이 부분에 대한 정보를 리대시 업그레이드 전 docker ps를 쳐보면 docker-compose로 유기적으로 엮여 nginx, postgres, redash_server, redash_worker, redash_redis 인스턴스가 떠있는것을 확인 할 수 있다.

$ docker ps
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                           NAMES
2b83a86455bc        redash/nginx:latest         "nginx -g 'daemon ..."   7 minutes ago       Up 7 minutes        443/tcp, 0.0.0.0:8080->80/tcp   redash_nginx_1
a782d1400a93        redash/redash:3.0.0.b3147   "/app/bin/docker-e..."   7 minutes ago       Up 7 minutes        0.0.0.0:5100->5000/tcp          redash_server_1
3b6d37ba558b        postgres:9.5.6-alpine       "docker-entrypoint..."   7 minutes ago       Up 7 minutes        5432/tcp                        redash_postgres_1
74a9e457a641        redash/redash:latest        "/app/bin/docker-e..."   7 minutes ago       Up 7 minutes        5000/tcp                        redash_worker_1
a2eb4f4a05aa        redis:3.0-alpine            "docker-entrypoint..."   7 minutes ago       Up 7 minutes        6379/tcp                        redash_redis_1

업그레이드 유의사항

Redash를 4.0으로 업그레이드 하기 위해서는 Postgres 스키마의 수정이 불가피 하다. 따라서 이를 안전하게 수행하기 위해 아래의 절차가 필요하다.

  1. postgres 백업을 진행 한 뒤
  2. 그다음 docker 이미지를 4.0.1로 교체 후 실행하고
  3. 이 이미지에서 리대시에서 제공하는 DB 업그레이드 스크립트를 돌려야한다.
  4. 이후 리대시를 실행하여 정상동작하는지 검증한다.

1. Postgres 백업하기

위에서 얻어진 docker 이름을 기반으로 bash shell을 연다. 그 다음 전체 데이터베이스를 원하는 경로로 dump한다.
(이 예제에서는 postgres도 docker 데몬이기 때문에 전체 database를 백업한다. 이유는 어차피 redash관련 database밖에 없기 때문이다.)
(/var/lib/postgresql/data는 docker 외부의 OS에 직접 마운트된 경로이다.)

$ docker exec -it DOCKER_NAME bash
$ pg_dumpall -U postgres > /var/lib/postgresql/data/20180515.dump

부가적으로 postgres의 조각모음에 해당하는 vacuum을 실행해주어 Redash 스키마 업그레이드 시 시간을 최소화 할 수 있게 해준다.

$ docker exec -it DOCKER_NAME psql -U ID -W PW DB명
vacuum full analyze;

2. docker 이미지를 4.0.1로 교체 후 실행

우선 docker-compose를 down하여 모든 docker 인스턴스를 내린다.

$ docker-compose down

그 다음 docker-compose.production.yml에서 redash docker hub에서 원하는 버전의 이미지명을 찾아 yml파일에서 교체한다.
아래의 예제에서는 redash/redash:4.0.1.b4038를 사용하였다.

version: '2'
services:
  server:
    image: redash/redash:4.0.1.b4038
    #image: redash/redash:3.0.0.b3147

이후 아래의 명령어로 다시 redash docker-compose를 실행한다.

$ docker-compose -f docker-compose.production.yml up -d

3. 리대시 DB 업그레이드 스크립트 실행

docker ps를 통해 redash_server의 인스턴스명을 찾아 bash shell을 실행한다.

$ docker exec -it DOCKER_NAME bash

기본경로가 /app인데 여기에서 아래와 같이 ./manage.py db upgrade를 실행한다.
그러면 아래와 같이 postgres database 스키마가 업그레이드 되는 것을 확인 할 수 있다.

redash@a782d1400a93:/app$ ./manage.py db upgrade
[2018-05-15 08:01:21,821][PID:55][INFO][root] Generating grammar tables from /usr/lib/python2.7/lib2to3/Grammar.txt
[2018-05-15 08:01:21,848][PID:55][INFO][root] Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt
[2018-05-15 08:01:23,347][PID:55][INFO][alembic.runtime.migration] Context impl PostgresqlImpl.
[2018-05-15 08:01:23,348][PID:55][INFO][alembic.runtime.migration] Will assume transactional DDL.
[2018-05-15 08:01:23,354][PID:55][INFO][alembic.runtime.migration] Running upgrade d1eae8b9893e -> 7671dca4e604, empty message
[2018-05-15 08:01:23,357][PID:55][INFO][alembic.runtime.migration] Running upgrade 7671dca4e604 -> 5ec5c84ba61e, Add Query.search_vector field for full text search.
[2018-05-15 08:01:23,809][PID:55][INFO][alembic.runtime.migration] Running upgrade 5ec5c84ba61e -> 6b5be7e0a0ef, Re-index Query.search_vector with existing queries.
[2018-05-15 08:01:24,325][PID:55][INFO][alembic.runtime.migration] Running upgrade 6b5be7e0a0ef -> 969126bd800f, Update widget's position data based on dashboard layout.
Updating dashboards position data:
  Updating dashboard: 2
    Building widgets map:
    Widget: 7
    Widget: 8
    Iterating over layout:
      Row: 0 - [6]
      Column: 0 - 6
      Row: 1 - [7, 8]
      Column: 0 - 7
      Column: 1 - 8
  Updating dashboard: 1
    Building widgets map:
    Widget: 1
    Widget: 3
    Widget: 4
    Widget: 5
    Iterating over layout:
      Row: 0 - [4]
      Column: 0 - 4
      Row: 1 - [1]
      Column: 0 - 1
      Row: 2 - [3]
      Column: 0 - 3
      Row: 3 - [5]
      Column: 0 - 5
  Updating dashboard: 3
    Building widgets map:
    Iterating over layout:
      Row: 0 - [9]
      Column: 0 - 9
  Updating dashboard: 4
    Building widgets map:
    Widget: 10
    Widget: 11
    Iterating over layout:
      Row: 0 - [10]
      Column: 0 - 10
      Row: 1 - [11]
      Column: 0 - 11
  Updating dashboard: 5
    Building widgets map:
    Widget: 12
    Iterating over layout:
      Row: 0 - [12]
      Column: 0 - 12
      Row: 1 - [13]
      Column: 0 - 13
  Updating dashboard: 6
    Building widgets map:
    Widget: 15
    Iterating over layout:
      Row: 0 - [15]
      Column: 0 - 15
      Row: 1 - [14]
      Column: 0 - 14
  Updating dashboard: 7
    Building widgets map:
    Iterating over layout:
  Updating dashboard: 9
    Building widgets map:
    Widget: 16
    Widget: 17
    Widget: 19
    Widget: 20
    Iterating over layout:
      Row: 0 - [16, 17]
      Column: 0 - 16
      Column: 1 - 17
      Row: 1 - [19]
      Column: 0 - 19
      Row: 2 - [20]
      Column: 0 - 20
  Updating dashboard: 8
    Building widgets map:
    Iterating over layout:
  Updating dashboard: 10
    Building widgets map:
    Iterating over layout:
  Updating dashboard: 11
    Building widgets map:
    Widget: 21
    Widget: 22
    Widget: 23
    Widget: 25
    Iterating over layout:
      Row: 0 - [21]
      Column: 0 - 21
      Row: 1 - [22]
      Column: 0 - 22
      Row: 2 - [23]
      Column: 0 - 23
      Row: 3 - [25]
      Column: 0 - 25

4. 리대시 검증하기

업그레이드 이후 다시 리대시에 접속해보면 정상적으로 로그인 창이 뜨는 것을 확인 할 수 있다.

또한 로그인 후 기존의 쿼리나 대시보드가 정상 동작함을 확인 할 수 있다.