1. redshift가 뭔가요?

- postgresql를 기반으로한 AWS의 서비스입니다.

- 실습에서는 데이터웨어하우스로 사용하기 위해 구축합니다.

- 관리형 데이터베이스 서비스인 RDS를 사용하면 Zero-ETL을 구축할 수 있습니다.

https://docs.aws.amazon.com/ko_kr/redshift/latest/dg/c_redshift-and-postgres-sql.html

 

Amazon Redshift 및 PostgreSQL - Amazon Redshift

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

https://docs.aws.amazon.com/ko_kr/redshift/latest/mgmt/serverless-whatis.html

 

Amazon Redshift 서버리스란 무엇인가요? - Amazon Redshift

Amazon Redshift 서버리스란 무엇인가요? Amazon Redshift Serverless는 데이터 웨어하우스 용량을 자동으로 프로비저닝하고 기본 리소스를 지능적으로 확장합니다. Amazon Redshift Serverless는 용량을 몇 초 만

docs.aws.amazon.com

 

2. Zero-ETL은 뭔가요?

- ETL 과정에서 복잡한 파이프라인 생성을 생략하는 기능입니다.

- AWS의 관리형 데이터베이스인 RDS를 사용하면 CDC 기능을 사용해서 redshift에 데이터를 바로 쌓을 수 있습니다.

- ETL은 데이터른 추출하고 변환하고 적재하는 과정을 말합니다.

- CDC는 데이터베이스의 변경되는 데이터를 바로 다른 DB나 저장소에 반영하는 것으로 생각하면 됩니다.

https://aws.amazon.com/ko/what-is/zero-etl/

 

제로 ETL이란? - 제로 ETL에 대한 설명 - AWS

제로 ETL은 ETL 데이터 파이프라인을 구축할 필요성을 없애거나 최소화하는 통합 세트입니다. 추출, 전환, 적재(ETL)는 다양한 소스의 데이터를 결합, 정리 및 정규화하여 분석, 인공 지능 (AI) 및 기

aws.amazon.com

 

3. 요금은 어떻게 나올까

- 기본적으로 저장된 데이터의 용량에 따라 월별 요금이 나옵니다.

- 그리고 쿼리 작업을 하는데 사용하는 컴퓨팅 리소스에 따라 요금이 나옵니다.

https://aws.amazon.com/ko/redshift/pricing/

 

클라우드 데이터 웨어하우스 – Amazon Redshift 요금–Amazon Web Services

 

aws.amazon.com

 

4. 너무 복잡해요!

- 용어에 대해서 너무 깊게 이해할 필요는 없습니다.

- 실습을 진행하면서 어떤 기능인지 눈으로 확인하고 이해해도 괜찮아요.

- 생각보다 redshift를 이용한 CDC 방법이 제일 쉬울 수 있습니다.

 

 

4. 다음 글 예고

- AWS에서 redshift를 직접 생성합니다.

1. 데이터 레이크란 무엇인가요?

- 어떤 서비스에서 생성되는 데이터를 모두 적재하는 저장소를 운영하는 것으로 생각하면 됩니다.

- 원천 데이터에서 저장소 까지 데이터를 적재하는 작업과 적재한 데이터를 잘 사용할 수 있도록 하는 작업이 주를 이룹니다.

 

2. AWS는 어렵지 않나요?

- 익히기는 어렵지만 로컬 컴퓨터에 실제 구축을 하는 것 보다 훨씬 적은 노력이 들어갑니다.

- 현재는 대부분의 기능은 자동으로 관리되는 관리형 기능이 많기 때문에 인프라 지식도 생각보다 많이 필요 없습니다.

 

3. 시작하며

- 대략적인 구조는 원천 데이터 베이스와 동일한 데이터를 가지는 데이터 웨어하우스를 만들고 파일로 적재합니다.

- 사용되는 기능은 s3, redshift, RDS, DMS, Athena 등이 있습니다.

- 당연히 AWS에 가입해서 리소스를 생성하는 작업이 있으니 AWS 계정을 생성하고 시작하세요!

- 사용에 따라 금액이 나올 수 있으나, 공부를 위해 조금은 투자를 한다고 생각하면 안 아까울지도??

1. airflow 테스트 환경 구축

- 간단한 테스트 환경 구축을 위해 airflow에서 제공하는 docker compose yaml파일을 사용한다.

- 아래의 스크린샷과 같은 부분에서 다운받을 수 있다.

- 링크 : https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html

curl로 다운하는 것도 가능하다

2. airflow에서 사용할 파이썬 라이브러리 추가 방법

- docker compose 파일에 간단하게 라이브러리를 추가하는 방법이 있다.

- airflow에서 pymysql이 기본으로 제공되지 않는데, pymysql을 설치하려면 아래와 같이 내용을 수정하고 저장하자.

## docker compose 파일에서 추가로 설치할 python module을 등록하는 경우
## 아래와 같은 environment 찾아서 수정 후 docker compose up -d
_PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:- pymysql}

## module을 여러개 설치해야하는 경우는 아래와 같이 공백으로 구분하여 추가한다
_PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:- pymysql pandas numpy}

3. airflow를 실행하자

- docker compose 파일이 있는 폴더에서 docker compose up -d으로 airflow 환경을 구축한다.

- airflow에서 사용하려는 port를 이미 사용하고 있는 경우 yaml에서 port 번호를 바꿔주도록 하자.

- 공식적으로 제공하는 파일에서는 id와 password는 모두 airflow이므로 변경이 필요하면 yaml에서 바꿔주자.

- localhost:8080 으로 접속해서 아래와 같은 창이 뜨면 테스트 환경 구축에 성공한 것이다.

 

'데이터 시스템 구축 정보 공유 > airflow' 카테고리의 다른 글

1. Airflow란?  (0) 2022.07.31

1. 일반적인 자동화 작업에서 발생하는 문제는 무엇일까?

- 데이터 분석이나 모델링 영역에서 주기적인 자동화 작업을 해야하는 경우가 빈번하게 발생한다.

- 데이터 분석을 위해 특정 시간 단위의 데이터를 연산하여 데이터를 적재하는 과정도 있고

- 특정 기간마다 자동으로 서빙 중인 모델을 다시 학습해서 서빙을 하는 경우도 있다.

 

 

 

2. 이런 과정에서 발생할 수 있는 문제는 무엇이 있을까?

- 이런 과정을 하나의 코드로 관리하기도 어렵고, 그렇게 할 수도 없다.

- 그렇다고 특정 작업보다 우선시 되는 작업을 특정 시간동안 기다리도록 작업을 단순하게 정할 수도 없고

- 그렇다고 특정 작업이 모두 완료되기 전까지 다른 후속 작업을 기다리는 방법은 너무 비효율적이다.

- 하지만 작업의 우선 순위를 설정하거나, 동기/비동기 작업으로 설정하는 코딩을 하기에는 작업량이 많고 복잡하고 변경 사항에 따라 유지보수가 반드시 뒤따른다.

- 게다가 에러가 발생할 경우 직접 에러가 남도록 로깅을 해서 이유를 찾거나, 에러를 확인할 수 있는 시스템을 구축하여 확인해야한다.

- 또한 빠른 문제 해결을 위해 자동화 작업에 문제가 발생하면 alert을 보내는 방법도 고려해야한다.

 

 

 

3. 이런 작업을 Airflow에서는 쉽게 할 수 있다.

- Shell이나 Python으로 작성된 스케쥴을 작성하고, 스케쥴들의 종속성과 작업 순서를 설정할 수 있다.

- 자동화 작업이 잘 진행되었는지 문제는 어디서 발생했는지를 웹UI에서 확인할 수 있다.

- 작업이 중간에 잘못된 경우 발생한 에러를 웹UI에서 확인할 수 있고, 문제가 발생한 지점부터의 재실행도 웹UI에서 실행할 수 있다.

- slack에 alert을 보내는 기능 등을 설정할 수 있다.

 

 

 

4. 결론적으로 복잡한 스케쥴의 자동화 작업을 편리하게 작성하고 관리할 수 있는 플랫폼이다.

- 데이터 영역에서 ETL과 모델훈련/서빙 등의 자동화를 한다면 꼭 사용해보자.

- 본 블로그에서는 어려운 용어 정의는 생략하고 실질적으로 사용하는 예제를 중심으로 내용을 설명하도록 하겠다!

1. 일단 우분투 컨테이너와 Nginx의 포트를 모두 포트포워딩 하자.

- docker-compose.yml 파일의 설정을 바꿔서 포트포워딩을 설정해야한다.

- 다음과 같이 파일을 수정할 수 있게 vim으로 연다

vim /opt/redash/docker-compose.yml

 

- 마지막 부분의 Nginx 설정에서 "443:443" 포트포워딩 설정을 아래와 같이 추가해준다

- 수정을 마치고 :wq!로 파일을 저장하고 나온다.

  nginx:
    image: redash/nginx:latest
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - server
    links:
      - server:redash
    restart: always

 

- docker-compose.yml 파일이 있는 경로로 이동하고, docker compose로 설정이 변경된 컨테이너를 다시 띄운다.

- 설정이 변경되지 않은 컨테이너는 재생성 되지 않고 Nginx 컨테이너만 다시 생성될 것이다.

1. 경로로 이동해서 Nginx 컨테이너를 다시 실행
cd /opt/redash
COMPOSE_HTTP_TIMEOUT=200 docker-compose up -d


2. 컨테이너 재생성 후 docker-compose ps 입력 후 아래와 같은 화면이 나오는지 확인

          Name                         Command               State                    Ports                  
-------------------------------------------------------------------------------------------------------------
redash_adhoc_worker_1       /app/bin/docker-entrypoint ...   Up      5000/tcp                                
redash_nginx_1              nginx -g daemon off;             Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
redash_postgres_1           docker-entrypoint.sh postgres    Up      5432/tcp                                
redash_redis_1              docker-entrypoint.sh redis ...   Up      6379/tcp                                
redash_scheduled_worker_1   /app/bin/docker-entrypoint ...   Up      5000/tcp                                
redash_scheduler_1          /app/bin/docker-entrypoint ...   Up      5000/tcp                                
redash_server_1             /app/bin/docker-entrypoint ...   Up      0.0.0.0:5000->5000/tcp


3. redash_nginx_1의 Ports가 아래와 같으면 설정 성공
0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp

 

- 시험삼아 http://my.example.domain:80으로 접속하면 redash 웹페이지가 나타나는 것을 확인할 수 있다.

- 또한 http://my.example.domain으로 접속해도 동일한 페이지가 나타난다.

 

 

 

2. Nginx 컨테이너로 접근하여 세팅을 진행하자

- 원활한 세팅을 위해 nginx 컨테이너에서 직접 세팅을 한다.

- nginx 설정 파일 수정을 위해 vim도 설치해주자

1. Nginx 컨테이너로 진입
docker exec -itu 0 redash_nginx_1 bash

2. vim 설치
apt-get update
apt-get install vim

3. Nginx 설정 파일이 있는 폴더로 이동
cd /etc/nginx

 

 

 

3. 테스트용 SSL 인증서 생성

- 간단한 연습을 위해 SSL 인증서와 도메인을 구매할 수는 없다.

- openssl이 설치되어 있다면 아래의 명령어로 자체 서명된 인증서를 생성할 수 있다.

- 물론 자체 서명이므로 보안성이 전혀 없으니 연습용으로만 사용할 수 있으니 실제 적용에는 인증서를 꼭 구매해야한다.

1. 인증서를 생성하여 저장할 폴더를 생성하고 폴더로 진입
mkdir self_cert_ssl_files
cd self_cert_ssl_files

2. openssl로 자체서명 인증서 생성
openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365

3. 입력을 요청하는 정보는 정확히 입력할 필요는 없으니 참고
Country Name (2 letter code) [AU]:KR
State or Province Name (full name) [Some-State]:Seoul
Locality Name (eg, city) []:Seoul
Organization Name (eg, company) [Internet Widgits Pty Ltd]:test
Organizational Unit Name (eg, section) []:test
Common Name (e.g. server FQDN or YOUR name) []:test
Email Address []:test@test.test

4. cert.pem 과 key.pem 파일이 생성되었는지 확인하자

 

 

 

4. 80번 포트와 443 포트 설정

- 80번 포트는 http 접속, 443번 포트는 https 접속인 것을 기억할 것이다.

- 이제 Nginx의 설정을 변경해서 80번 포트와 443번 포트에 대한 접속 설정을 해보자.

vim /etc/nginx/conf.d/default.conf

 

- 연습삼아 redash 공식 홈페이지의 설정을 일부 수정하여 적용해보자

- 아래의 설정을 default.conf 파일에 적용하자

- 아래의 설정은 80번 포트로 접속하는 경우 403 에러가 나도록 설정하고, 443번 포트로 접속하는 경우 SSL을 적용하는 설정이다.

https://redash.io/help/open-source/admin-guide/https-ssl-setup

server {
  listen   80 default;
  return 403;
}

server {
  listen 443 ssl;

  ssl on;
  ssl_certificate /etc/nginx/self_cert_ssl_files/cert.pem;
  ssl_certificate_key /etc/nginx/self_cert_ssl_files/key.pem;


  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

  access_log /var/log/nginx/redash.access.log;

  gzip on;
  gzip_types *;
  gzip_proxied any;

  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_pass       http://redash;
    proxy_redirect   off;
  }
}

 

- 설정 파일에 문제가 없는지 테스트를 해보고, Nginx에 설정을 적용한다.

1. 터미널에 nginx -t 입력하여 메세지 확인

2. 설정이 정상이라면 아래와 같은 출력 값이 뜬다.
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

3. Nginx를 끄지 않고 설정을 적용할 수 있다.
service nginx reload

4. 정상적으로 적용 됐다면 아래와 같은 출력 값이 뜬다.
[ ok ] Reloading nginx: nginx.

 

 

 

5. 80번과 443번에 해당하는 주소로 접속해보자

- http://my.example.domain으로 접속하면 아래와 같은 화면을 볼 수 있다.

- 위의 설정 파일에서 return 403으로 403에러가 발생하도록 설정했기 때문이다.

 

- 이번엔 https://my.example.domain으로 접속해보자.

- 위의 설정 파일에서 SSL을 적용하고 5000번 포트에 띄워진 리대시 웹페이지로 가도록 설정되었기 때문에 도메인 주소로 접속이 된다.

- 하지만 정상적으로 인증되지 않은 자체 서명 인증서이므로 아래와 같은 화면이 뜬다.

- 정상적인 인증서로 설정하는 경우 홈페이지로 접속하는 화면을 확인할 수 있으니 실제 적용에는 올바른 인증서를 사용해보자.

 

- 마지막으로 80번 포트에서 403에러가 발생하는 것이 아닌 https가 적용된 주소로 리다이렉팅하는 설정은 아래와 같다.

- http://my.example.domain으로 접속하면 https://my.example.domain으로 접속되는 것을 확인할 수 있다.

server {
  listen   80 default;
  return 301 https://my.example.domain;
}

server {
  listen 443 ssl;

  ssl on;
  ssl_certificate /etc/nginx/self_cert_ssl_files/cert.pem;
  ssl_certificate_key /etc/nginx/self_cert_ssl_files/key.pem;


  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

  access_log /var/log/nginx/redash.access.log;

  gzip on;
  gzip_types *;
  gzip_proxied any;

  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_pass       http://redash;
    proxy_redirect   off;
  }
}

 

 

 

6. Nginx 설정은 이게 끝이 아니다.

- 예시로 나온 설정은 아주 간단한 예시이다.

- 특정 도메인 주소로만 접근할 수 있도록 하거나, SSL protocol을 다른 방식을 적용하는 등의 추가 설정이 반드시 필요하다.

- 제공할 서비스의 보안 사항에 따라 적절한 세팅 값을 추가하고 변경하여 적용하자.

- 세부적인 Nginx의 설정은 redash 구축 범위에서 벗어나므로 Nginx를 따로 포스팅 하게 되면 상세히 적어보도록 하겠다.

1. 이전에 열어둔 80번 포트와 443번 포트는 어디에 사용하나요?

- 우리가 접속하는 글자로 된 도메인은 사실 모두 ip주소가 있다.

- 예를 들어 네이버는 223.130.200.107라는 ip주소가 존재한다.

- 하지만 인터넷 브라우저에서 접속을 하게 되면 https://naver.com으로 다시 접속되는 것을 확인할 수 있다.  

- 그리고 http://223.130.200.107로 접속을 시도해보면, https://naver.com으로 다시 접속되는 것을 확인할 수 있다. 

- https는 암호화된 통신을 할 수 있는 기능이라고 생각하면 간단하며, 보안을 위해 적용하는 것이라고 생각하면 된다.

- 결론적으로 포트 번호가 없는 http와 https 도메인을 사용할 수 있도록 하는 포트가 80번과 443번 포트이다.

 

 

 

2. 뭔말인지 잘 모르겠어요.

- 직접 우리가 실습 중인 redash로 확인해보자

- 일단 좀 더 직관적인 도메인 실습을 위해 localhost가 아닌 임의의 도메인을 등록해보도록 하자.

1. 아래의 방식으로 파일에 관리자 권한에 접근한다
윈도우즈는 C:\Windows\System32\drivers\etc\hosts (텍스트 편집기를 사용해 관리자 권한으로 연다)
맥OS는 sudo vim /private/etc/hosts
우분투는 sudo vim /etc/hosts


2. 임의의 도메인 이름을 설정하고 저장한다.
127.0.0.1 localhost 라고 설정된 것 처럼
127.0.0.1 my.example.domain 과 같은 임의의 도메인을 설정한다.

 

- 이렇게 설정한 이후 127.0.0.1:5000, localhost:5000, my.example.domain:5000으로 접속해서 동일한 페이지가 뜨는 것을 확인할 수 있다.

설정한 임의의 도메인으로도 접속할 수 있다.

 

 

 

3. 80번 포트로 접속해보자 - http 접속

- 이번에는 127.0.0.1:80, localhost:80, my.example.domain:80

- 5000이 주소에 보였던 것과 달리 127.0.0.1, localhost, my.example.domain만 주소창에 나타나는 것을 볼 수 있다.

- 이처럼 80번 포트는 기본적으로 포트 번호가 숨겨진 것을 알 수 있다.

- 그리고 크롬에서 확인해보면 보안 연결인 https가 적용되지 않은 http로 접속한 것을 확인할 수 있다.

보안이 중요한 사이트인 경우 https로 접근하도록 설정해야한다.

 

 

 

4. 443 포트로 접근은 다음 글에서 실습해보도록 하겠다.

- https 접근을 위해서는 SSL 인증서를 구입해야한다.

- 하지만 실습을 위해 도메인과 SSL 인증서를 구입할 수는 없으니 연습용 인증서를 사용해 실습할 것이다.

- 정상적인 접근 화면은 확인할 수 없지만 Nginx를 통해 80번 포트로의 접근을 443포트로 보내주는 설정 등을 실습하여 안전한 대시보드 환경을 만들어보도록 하자!

1. 기본적인 시각화 생성과 대시보드 생성

- 역시나 오픈소스라서 이런저런 정보가 국내에는 많이 없다.

- 현업에서 지표를 보는 용도 정도로는 일부 세부 기능만 사용해도 괜찮다.

- 시각화의 일반적인 설정 예시와 대시보드에 시각화를 배치하는 연습을 해보자!

 

 

 

2. 시각화 생성

- 이전에 활용한 classicmodel 데이터 베이스에서 임의의 통계치를 조회해보았다.

SELECT date_format(orderDate, "%Y-%m") AS order_month,
       count(*) AS order_month_count
FROM orders
GROUP BY order_month

 

- 조회된 테이블에 있는 New Visualization를 눌러서 시각화를 해보자

라이언이 귀여워서 라이언으로 New Visualization을 표시해보았다.

 

- 아래와 같은 에디터에서 시각화 설정을 할 수 있다.

(1) 시각화 선택에서 box, chart, map 등의 다양한 시각화 방식을 선택할 수 있다.

(2) 생성한 시각화에 이름을 설정할 수 있다.

(3) 각 시각화 방식에 따라 세부 설정할 수 있는 옵션이 다르게 나오니 직접 실습해보자.

 

- 세부 설정을 통해 시각화 색상/범례/수치표시 등의 설정을 변경할 수 있다

옵션 설정의 설명이 영어로 되어 있지만 난이도가 높지 않다.

 

- Pivot Table을 활용한 시각화는 직접 만들어보도록 하자.

- 아래의 쿼리를 사용해서 만들면 아래의 GIF와 동일한 기능을 할 수 있는 통계치를 뽑을 수 있다.

SELECT date_format(orderDate, "%Y-%m") AS order_month,
       status,
       count(*) AS status_count
FROM orders
WHERE orderDate BETWEEN '{{날짜.start}}' AND '{{날짜.end}}'
GROUP BY order_month,
         status

 

- '{{날짜}}'와 같은 방식으로 파라미터를 설정하여 사용자가 임의의 날짜를 선택할 수 있도록 할 수 있다.

- 대시보드에 시각화를 넣으면 대시보드에서 날짜를 조절하는 등의 기능을 그대로 사용할 수 있다.

파라미터를 설정하고 톱니바퀴를 누르면 Type을 설정할 수 있다.

- 글로 설명하기 어려워서 GIF 파일을 사용했다.

- 다양한 통계치를 뽑는 방식이 있으니 실습해보자.

컬럼을 이동시켜 축에 배치할 수 있고 다양한 통계치를 선택할 수 있다.

 

 

 

3. 대시보드 생성

- Dashboard로 진입하여 대시보드를 생성할 수 있다.

- 우측 하단의 Add Textbox를 누르면 마크다운이 가능한 텍스트 위젯을 생성할 수 있고, Add widget를 누르면 미리 생성한 시각화를 배치할 수 있다.

- 작성한 쿼리와 시각화를 선택해서 Add to Dashboard를 통해 시각화를 배치해보자.

쿼리와 시각화 이름을 확실히 정해두면 대시보드를 구성할 때 도움이 된다.
왼쪽 상단의 날짜의 수치를 변경해서 다양한 기간의 시각화 결과를 확인할 수 있다.

 

 

 

4. 대시보드 위젯 설정

- Add widget으로 시각화를 대시보드에 배치할 때 Value Source 설정을 변경할 수 있다.

- 변경할 수 있는 파라미터를 여러개 생성하거나 위젯에 종속시켜 각각 다르게 수치를 변경할 수 있다.

(1) New dashboard parameter로 새로운 파라미터 key를 생성할 수 있다.

(2) Existing dash dashboard parameter로 미리 작성한 위젯의 key를 같이 사용할 수 있다.

(3) Widget parameter로 해당 위젯에만 독립적으로 사용되는 파라미터를 생성할 수 있다.

(4) Static value로 설정한 파라미터 값으로 나온 결과를 보여주는 위젯을 생성할 수 있다.

2~3개의 시각화를 작성해두고 사용해보면 어렵지 않게 습득할 수 있다.

 

 

 

5. 공식 홈페이지의 설명도 확인해보자

- 국내에는 자료가 없어서 parameter 사용법은 redash 공식 홈페이지의 가이드로 확인해서 습득하였다.

- 세세한 사용 방법은 역시 검색과 실습 밖에 없다!

- 기본적인 사용법의 설명은 이번 포스팅으로 끝이다.

- 다음으로는 ldap과 같은 로그인 방식의 적용, Nginx를 활용한 https로의 접속 방식 설명을 적어보도록 하겠다.

1. 계정 생성 후 해야할 기본적인 세팅

- 설치 후 첫 화면에서 해봐야할 것들을 간단하게 링크로 제시해주고 있다.

- 우측 상단의 설정 아이콘을 통해 모든 세팅에 접근할 수 있으니 우측 상단의 세팅 버튼을 애용하자.

Let's get started의 순서로 세팅을 진행해보자

 

 

 

2. Data Source - 데이터베이스를 연결

- 일반적인 데이터베이스나 파일시스템을 연결해서 사용할 수 있다.

- 포스팅에서는 Mysql 예제DB인 classicmodels를 사용했다.

- New Data Source 버튼을 클릭해서 mysql을 검색하여 선택하면 아래와 같은 세팅 화면이 나온다.

- 하나의 Data Source에는 하나의 데이터 베이스만 연결할 수 있으니 데이터베이스명을 꼭 명시하도록 하자.

- 127.0.0.1 이나 localhost로 접근이 안되는 경우 할당된 ip를 확인하여 입력해보자.

- 연결이 완료 되었다면 좌측 상단의 Queries로 진입해서 쿼리작성과 시각화를 해보자.

New Data source 버튼으로 진입해서 일반적인 DB연결 과정을 진행하면 된다.

 

 

 

3. Queries - 쿼리 결과 조회와 시각화

- 쿼리를 작성하고 결과를 볼 수 있다.

- 조회된 쿼리로 바로 시각화를 할 수 있다.

- 쿼리 결과가 보이는 창에 있는 New Visualization으로 시각화를 할 수 있다.

일반적인 쿼리 작업 환경과 동일하다.

 

- {{}}를 쿼리에 삽입하여 parameter를 설정할 수 있다.

- 해당 기능을 삽입한 쿼리로 대시보드를 구성하면 대시보드를 조회하는 사용자가 인자를 직접 입력할 수 있다.

- 아래의 링크에서 세부 사용법을 알 수 있으니 참고!

- https://redash.io/help/user-guide/querying/query-parameters

대시보드 조회자에게 매우 유용한 기능이다.

- Visualization Type에서 다양한 시각화를 선택할 수 있다.

- 일반적인 시각화 방식과 동일하니 기능을 사용해보며 익혀보자.

일반적인 bar chart
워드 클라우드도 가능하다!

- Pivot Table의 기능이 상당히 좋은 편이다.

- Pivot Table에서 다양한 group by 조건을 GUI에서 수행할 수 있다.

- 다만 데이터가 너무 많으면 결과 조회에 많은 시간이 들어가며 컴퓨터 자원도 많이 소모하니 주의해서 사용하자.

컬럼명을 X축이나 Y축으로 이동시켜 사용할 수 있고, 히트맵 등의 시각화 기능을 제공한다.

 

 

 

4. Dashboards - 쿼리 결과와 시각화를 대시보드에 적용

- Queries에서 작성하고 Publishing한 저장된 쿼리 테이블과 시각화를 GUI환경에서 배치하여 대시보드를 생성할 수 있다.

- 우측 하단의 Add Widget을 통해 추가할 수 있으며, 배치 후에 크기와 위치를 조정할 수 있다.

위젯을 모두 배치한 후에는 대시보드도 Publish를 해야 권한이 있는 사용자에게도 대시보드가 노출된다.

 

 

5. 세세한 사용 방법은 공홈의 가이드를 확인해보자.

- 위의 기능 정도면 기본적인 대시보드 기능을 사용할 수 있다.

- 세부적인 세팅 변경이나 기능들은 공홈에 많은 가이드가 있으니 확인해보자.

- 대시보드의 세부 기능은 다음 글로 좀 더 세세하게 풀어보도록 하겠다.

1. docker로 구축하는 이유가 있나요?

- redash 공식 홈페이지에서 초보자를 위해 도커로 시스템을 구축해주는 스크립트를 추천합니다.

- 그리고 기본적인 설정을 잡아주기 때문에 DB연결 등의 세부적인 작업이 필요 없습니다.

- 또한, redash 백엔드를 도커이미지로 유지하고 DB등은 직접 구축한 DB로도 변경할 수 있습니다.

- 그리고 제일 좋은 것은 구동 환경을 다 잡아둔 도커 이미지를 쓰기 때문에 환경 설정 시간이 거의 없습니다.

 

 

 

2. 환경 설명과 도커를 활용한 실습 준비

(1) 실습을 위한 기본 설명

- 도커를 기본적으로는 사용하실 수 있어야 합니다(도커 사용법도 따로 정리해서 추가하겠습니다).

- 편의를 위해서 우분투에서 systemctl 관련 세팅이 잘 되어있는 이미지를 사용합니다. 일반 우분투 이미지를 사용하면 현재 연습을 위한 환경 구축에서 도커가 잘 실행되지 않는 경우가 있었습니다.

- 결론적으로 컨테이너 내부에 다시 컨테이너들을 구축하는 경우입니다.

- 물론 자체적으로 우분투에서 구축하셔도 상관없습니다. 다만 윈도우 유저나 우분투 18.04에서의 구축을 추천하는 Redash 홈페이지 안내문에 따라 위의 방식을 택하였으니 참고해주세요.

그림으로 표현하자면 이런 구조에서 구축 실습을 하게 됩니다.

 

(2) 우분투 18.04 컨테이너 생성

- 모든 작업은 윈도우즈 cmd, 리눅스나 맥의 terminal 기반으로 설명합니다.

docker pull jrei/systemd-ubuntu:18.04
docker run -d -p 5000:5000 -p 80:80 -p 443:443 --name redash_test --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro jrei/systemd-ubuntu:18.04

- 생성한 컨테이너의 이름은 redash_test, 로컬호스트의 5000, 80, 443번 포트와 컨테이너의 5000, 80, 443번 포트를 포트포워딩 했습니다.

- Redash 서버가 기본적으로 5000번포트로 띄워지고, 우리에게 익숙한 포트 번호가 없는 도메인으로 접속하기 위한 80번 포트와 SSL 적용을 위한 443 포트 또한 포트포워딩했습니다.

- 80번 포트와 443 포트의 사용은 아직 이해하지 않으셔도 되고, 추후 Nginx를 설정 설명에서 이해하시면 됩니다.

 

(1) 터미널에서 컨테이너 상태 확인
docker ps -a

(2) 결과가 아래와 같아야 정상 작동하는 것
CONTAINER ID   IMAGE                       COMMAND                  CREATED         STATUS         PORTS                    NAMES
c7dcfad7ca41   jrei/systemd-ubuntu:18.04   "/lib/systemd/systemd"   5 minutes ago   Up 5 minutes   0.0.0.0:5000->5000/tcp   redash_test

(3) 수월한 설치를 위해 sudo 권한으로 컨테이너에 진입
docker exec -itu 0 redash_test bash

- 위의 과정 중에 docker exec -itu 0 rehasd_test bash의 -it는 익숙하지만 -itu 0가 익숙하지 않을 수 있습니다.

- u 0는 sudo 권한을 컨테이너 내에서 사용할 수 있게 하는 설정입니다.

- Redash 설치 스크립트에 sudo 권한을 요구하는 과정이 많으니 편의를 위해 꼭 sudo 권한을 사용할 수 있도록 설정합시다.

 

 

 

3. 설치 세부 과정

(1) Redash 스크립트 설치와 설치에 필요한 환경 설정

- 필수로 필요한 우분투 패키지를 설치하고 설치 스크립트를 가져옵니다.

- 기존에 도커와 도커컴포즈가 설치된 시스템에서 설치를 해보시는 경우 도커 버전이 변경될 수 있으니 주의하세요!

(1) 필요한 우분투 패키지 설치
apt-get update
apt-get install sudo
apt-get install git
apt-get install vim

(2) 설치 스크립트를 가져옵니다
git clone https://github.com/getredash/setup.git
cd setup

- (선택사항)도커 설치가 필요 없는 분은 setup.sh파일의 마지막 부분의 install_docker 부분을 삭제하시면 됩니다.

 

(2) 설치 진행과 발생할 수 있는 오류 설명

- 설치 파일의 권한을 변경하고 설치 스크립트를 실행합니다.

sudo chmod +x setup.sh
sudo ./setup.sh

- 일반적으로 첫번째로 볼 수 있는 에러는 아래와 같습니다.

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   664  100   664    0     0   1019      0 --:--:-- --:--:-- --:--:--  1018
100 11.2M  100 11.2M    0     0  2939k      0  0:00:03  0:00:03 --:--:-- 5165k
--2022-04-22 06:13:04--  https://raw.githubusercontent.com/getredash/setup/master/data/docker-compose.yml
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.111.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1076 (1.1K) [text/plain]
Saving to: 'docker-compose.yml'

docker-compose.yml            100%[=================================================>]   1.05K  --.-KB/s    in 0s

2022-04-22 06:13:04 (64.1 MB/s) - 'docker-compose.yml' saved [1076/1076]

ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?

If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.

- 에러메세지 설명대로 도커가 실행되지 않은 경우에 발생합니다.

- 도커를 실행하고 다시 setup 스크립트를 실행합니다.

(1) docker가 켜져있는지 확인
service --status-all

(2) 실행되지 않았다면 아래처럼 [-] 표시가 있음
 [ - ]  apparmor
 [ - ]  cron
 [ + ]  dbus
 [ - ]  docker
 [ - ]  hwclock.sh
 [ - ]  procps
 [ + ]  unattended-upgrades
 
 (3) 도커를 실행
 service docker start
 
 (4) service --status-all로 다시 확인하고 실행되었다면 [+]로 표시됨
 [ - ]  apparmor
 [ - ]  cron
 [ + ]  dbus
 [ + ]  docker
 [ - ]  hwclock.sh
 [ - ]  procps
 [ + ]  unattended-upgrades
 
 (5) 설치 스크립트를 다시 실행
 sudo ./setup.sh

- 완전히 설치가 됐다면 아래와 같은 메세지를 확인할 수 있습니다.

redash_postgres_1 is up-to-date
redash_redis_1 is up-to-date
Creating redash_server_1           ... done
Creating redash_scheduler_1        ... done
Creating redash_scheduled_worker_1 ... done
Creating redash_adhoc_worker_1     ... done
Creating redash_nginx_1            ... done

- 가끔씩 이 과정에서 time out error라는 문구와 함께 컨테이너가 일부만 생성되거나 하는 문제가 발생하는데, docker-compose의 HTTP 테스트시간이 짧게 설정되어 있어서 발생하는 문제입니다.

- 아래와 같은 과정으로 일반적으로 해결할 수 있습니다.

(1) 깨끗하게 설치하기 위해 설치되다가 멈춘 컨테이너를 삭제
docker-compose down

(2) 도커 컴포즈의 HTTP 테스트 시간을 200초 까지 늘려서 다시 생성
sudo COMPOSE_HTTP_TIMEOUT=200 docker-compose up -d

- 도커 컴포즈 설정 파일이 있는 폴더로 이동하여 정상적으로 Redash 시스템이 구축되었는지 확인합니다.

- docker-compose.yml파일에 docker-compose.yml.1와 같이 숫자가 붙은 파일들이 많이 있을텐데 반복된 설치 스크립트 실행으로 생긴 것이니 docker-compose.yml을 제외한 yml 파일은 삭제하시면 됩니다.

(1) Redash 시스템 구성과 관련된 파일들이 있는 디렉토리로 이동
cd /opt/redash

(2) 도커 컴포즈에서 Redash 시스템 구성이 잘 되었는지 확인
docker-compose ps -a

(3) 아래와 같이 나오면 성공
          Name                         Command               State              Ports
------------------------------------------------------------------------------------------------
redash_adhoc_worker_1       /app/bin/docker-entrypoint ...   Up      5000/tcp
redash_nginx_1              nginx -g daemon off;             Up      443/tcp, 0.0.0.0:80->80/tcp
redash_postgres_1           docker-entrypoint.sh postgres    Up      5432/tcp
redash_redis_1              docker-entrypoint.sh redis ...   Up      6379/tcp
redash_scheduled_worker_1   /app/bin/docker-entrypoint ...   Up      5000/tcp
redash_scheduler_1          /app/bin/docker-entrypoint ...   Up      5000/tcp
redash_server_1             /app/bin/docker-entrypoint ...   Up      0.0.0.0:5000->5000/tcp

(4) 에러 발생으로 인한 반복 과정에서 생성된 docker-compose.yml파일이 있는지 확인
ls

(5) 디렉토리에서 docker-compose.yml.1을 확인함
docker-compose.yml  docker-compose.yml.1  env  postgres-data

(6) docker-compose.yml.1을 완전히 삭제
rm -f docker-compose.yml.1

 

 

3. 기본적인 설치를 완료했다!

- 웹브라우저에서 내 컴퓨터의 80번이나 5000번 포트로 접속해서 아래와 같은 화면이 뜨면 시스템 구축에 성공한 것이다.

- localhost:80나 localhost:5000을 주소창에 입력하여 접속해보자!

- 80번 포트는 Nginx를 통해 5000번 포트로 다시 접근하는 경로이고, 5000번 포트는 플라스크 서버로 띄운 Redash에 직접 접근하는 것이다.

- 일반적인 접근은 80번 포트로 접근해서 도메인 주소로만 접근하는 방식입니다.

Redash 구축 후 최초로 접속하면 나오는 화면이다

 

4. 다음 글 예고

- 다음 글에서는 Redash의 기본적인 세팅 방법과 사용 예시를 살펴보도록 하겠습니다.

1. 시스템구조를 알아야할까요?

- 사실 냅다 구성만해서 사용하려면 딱히 알 필요가 없다.

- 왜냐면 설치 스크립트 한 방이면 걍 잘 돌아가게 구축이 되니까!

- 그러나 컨테이너형식이 아닌 직접 구축한 데이터베이스를 쓰려면 시스템 구조를 알아야 바꿀 수 있다.

- 그리고 실무에서는 아무튼 돌아감으로 해결되지 않는 많은 문제들이 발생한다...

- 하여튼 시스템구조를 살펴보고 각 기능에 대해 간단하게 짚고 넘어가자

 

 

 

2. 시스템 구조 설명

Redash의 아키텍처 다이어그램

- 공식 사이트에 다이어그램이나 기능에 대한 정확한 가이드를 적어두지 않아서 포럼을 뒤져서 찾았다.

(1) Nginx

- 리버스 프록시로 Redash 서버에 https를 적용하기 쉽게 해준다

(2) Redash server

- 플라스크로 띄우는 실질적인 대시보드 서버다

- 쉽게 이야기 하면 대시보드 웹페이지를 띄워주는 서버다

(3) postgreSQL

- postgreSQL 데이터베이스를 띄우는 서버로 운영하는 리대시의 모든 정보가 저장된다

- 유저, 쿼리, 시각화 등의 값들이 저장되는 곳이라고 생각하면 된다

(4) scheduler

- 대시보드에서 발생하는 잡(job)의 큐(queue)로 관리해주는 곳이다

(5) redis

- 스케쥴러에서 수행할 일(task)를 수행할 워커 서버로 보내기 전에 redis 서버에서 모니터링한다

- 정확히는 모르겠는데 adhoc task와 scheduled task를 관리하는 기능인 것 같다

(6) worker

- 각 워커에서 수행할 task를 실질적으로 수행한다

- 일시적인 쿼리를 실행하거나 주기적으로 돌아갈 작성된 쿼리 수행과 관련된 서버이다.

 

* 참고한 포럼

https://discuss.redash.io/t/what-are-the-individual-services-in-redash-actually-for/9675

 

What are the individual services in Redash actually for?

In Redash docker-compose files, we have been used to the following services: Server Adhoc-worker scheduled_worker scheduler Worker What are these services actually doing? The flask application which runs the redash under the hood looks to be the server. Bu

discuss.redash.io

 

 

3. 어... 뭔 말인지 모르겠어요

- 사실 도커기반으로 구축하는데 모든 기능을 세세하게 이해할 필요는 없습니다!

- 이런 이야기는 그만하고 다음엔 실질적으로 간단하게 구축을 해봅시다.

+ Recent posts