사내 데이터 제공 툴로 Redash를 사용하고 있다. 사용자 증가와 데이터베이스 확장으로 인해 쿼리 속도가 점차 느려지고 있어서 Redash 인스턴스 성능 향상과 워커 수 증가를 동해 더 많은 쿼리를 동시에 처리 할 수 있도록 개선하는 작업을 진행했다.
Redash 상황
Redash는 AWS EC2에 docker로 설치해 운영하고 있다. 인스턴스에 접근하려면 인스턴스를 생성할 때 설정했던 비공개키가 필요하다. 아래와 같이 키파일이 있는 디렉토리에 가서 명령어를 입력해줘야 한다.
ssh -i "privatekey.pem" ubuntu@ec2-주소.ap-northeast-2.compute.amazonaws.com
명령어를 통해 인스턴스에 접근 후 루트 디렉토리에서 /opt/redash 라는 경로로 들어가면 docker-compose.yml 파일을 확인 할 수 있다.
docker-compose.yml
version: "2"
x-redash-service: &redash-service
image: redash/redash:10.1.0.b50633
depends_on:
- postgres
- redis
env_file: /opt/redash/env
restart: always
services:
server:
<<: *redash-service
command: server
ports:
- "5000:5000"
environment:
REDASH_WEB_WORKERS: 4
scheduler:
<<: *redash-service
command: scheduler
scheduled_worker:
<<: *redash-service
command: worker
adhoc_worker:
<<: *redash-service
command: worker
worker:
<<: *redash-service
command: worker
environment:
QUEUES: "periodic emails default"
WORKERS_COUNT: 1
redis:
image: redis:5.0-alpine
restart: always
postgres:
image: postgres:9.6-alpine
env_file: /opt/redash/env
volumes:
- /opt/redash/postgres-data:/var/lib/postgresql/data
restart: always
nginx:
image: redash/nginx:latest
ports:
- "80:80"
depends_on:
- server
links:
- server:redash
restart: always
docker-compose.yml 파일을 보면 리대시가 어떤 설정으로 설치되어 있는지 알 수 있다.
Redash 구조
웹서버(Server): Redash의 웹 서버를 실행. REDASH_WEB_WORKERS 환경 변수를 통해 웹 서버의 워커 수를 설정할 수 있다. 이는 Redash의 웹 인터페이스를 처리하는 데 사용된다.
스케줄러(Scheduler): 정기적으로 실행되어야 하는 작업을 스케줄링하고 관리한다. 특정 시간에 실행해야 할 작업을 예약하고, 해당 시간이 되면 작업을 Worker에게 전달한다.
작업자(Worker): QUEUES 환경 변수를 통해 처리해야 할 작업 큐를 지정하여 처리하며 크게 두가지 종류가 있다. WORKERS_COUNT는 서비스에 할당된 워커의 수를 설정한다.
- scheduled_worker: 스케줄된 작업을 처리하는 데 사용. 정기적으로 실행되어야 하는 데이터 쿼리를 처리한다.
- adhoc_worker: ad-hoc 쿼리를 처리하는 데 사용. 사용자가 직접 작성하고 실행하는 쿼리를 처리한다.
Redis: Redis는 메모리 기반의 데이터베이스로, Redash에서는 메시지 큐와 캐시로 사용된다. Worker와 Scheduler 사이에서 메시지를 전달하는 데 사용되며, 자주 사용되는 데이터를 임시 저장하는 데도 사용된다.
PostgreSQL: PostgreSQL은 Redash의 메인 데이터베이스로, 사용자 정보, 대시보드 설정, 쿼리 결과 등 Redash의 다양한 데이터를 저장한다.
현재 WORKERS_COUNT 가 1 이므로 쿼리처리 효율이 좋지 않다. 이 워커수를 늘려서 배포하고, 인스턴스의 성능도 한단계 늘려서 더 빠른 처리가 될 수 있도록 해보자.
docker-compose down
docker-compose up -d
WORKERS_COUNT를 6으로 수정하고 위 명령어를 통해 기존 컨테이너를 내린다음 수정된 yml 파일로 실행될 수 있게 해주면 된다.
인스턴스는 기존 m5.large 에서 m5.xlarge로 한단계 올려주었다. 작업 시엔 Redash를 사용 할 수 없게 되므로, 작업전 미리 팀마다 공지를 하고 최대한 영향을 안주는 시간대인 토요일 오전에 진행했다.
재설치 자체는 금방 끝났으며 인스턴스 업그레이드가 훨씬 더 오래 걸렸다. WORKER_COUN가 1 일때는 기본 워커가 다섯개인데 6으로 변경하니 추가적으로 5개가 더 생성되어있는 것을 확인 할 수 있었다. 이제 열개의 워커에서 동시에 쿼리를 처리 할 수 있게 되었다.
'이슈 해결 일지' 카테고리의 다른 글
Kafka 파이프라인에 따른 DB 부하줄이기 여정 (0) | 2024.03.02 |
---|---|
DB 격리수준과 트랜잭션에 따른 데이터 일관성 문제 (0) | 2024.02.25 |
Kafka offset이 뒤로 돌아가는 문제 (0) | 2023.10.17 |
Route 53과 Externel DNS (feat. 회고) (1) | 2023.07.31 |
Redash 쿼리 큐 쌓이는 이슈 (0) | 2023.07.09 |