본문 바로가기

server/아키텍쳐

(13)
2. airflow + dbt 이 예제는 개발(로컬/경량)–운영(클라우드/규모) 분리를 전제로 한다.개발/속도: DuckDB 어댑터로 빠르게 모델을 검증하고, seed·단위테스트 중심으로 피드백 루프를 짧게 한다.운영/확장: BigQuery를 타깃으로 외부 테이블(원천: GCS) → staging → mart의 표준 3계층을 구축한다. 스토리지-컴퓨트 분리를 활용해 대용량에도 비용/성능 균형을 맞춘다. 디렉토리 구조 airflow-dbt-demo/├─ docker-compose.yml├─ .env ├─ airflow/│ ├─ Dockerfile│ ├─ requirements.txt│ ├─ dags/│ └─ dbt_duckdb_demo.py└─ dbt/ └─ demo_dbt/ ..
1. dbt tutorial 왜 dbt인가, 그리고 언제 써야 하나데이터 팀은 보통 원천 데이터를 웨어하우스로 옮긴 뒤 SQL로 정제하고, 지표를 만들어 대시보드·분석에 제공합니다. 이 과정이 커질수록 SQL 스크립트가 여기저기 흩어지고, 의존성·버전관리·테스트가 어려워집니다. dbt(Data Build Tool) 는 이 문제를 해결하기 위한 표준 도구입니다.SQL 변환을 코드로 관리하고, ref()로 의존 그래프를 안전하게 만들며, 테스트·문서화·라인리지를 자동화합니다. PR 기반 협업과 CI/CD도 용이합니다.다음을 기준으로 사용하면 좋습니다.웨어하우스(BigQuery/Snowflake/Redshift/DuckDB 등) 안에서 SQL 기반 변환을 할 때모델 수가 늘어나 의존성/품질 관리가 중요할 때대시보드 지표 정의를 코드로 명..
로또 시스템 아키텍처 지금 회사에는 제품중 로또 시스템 있다. 실제 토요일 로또 추첨된 결과와 일치하는 로또를 가진 유저에게 현금을 주는 시스템이 있다. 최근 사용자가 증가하면서 일주일에 대략 8000만개의 로또가 생성되는데, 이를 추첨하는데만 12시간이 걸린다. (정확히는 데이터를 백업하고, 해당 유저를 정확히 뽑는데까지 걸리는 시간이다.) 하지만, 실제 로또 추첨을 보면 번호 추첨과 동시에 몇명이 뽑혔는지가 나온다. (거의 10초 내외로 나온다.)이게.....어떤 시스템이길래 가능한걸까? 라는 생각이 들어서, 우리 회사에 적용할수 있는 시스템일까? 하는 호기심이 들어서 테스트를 해보았다. 테스트는 맥북 에어 (m4) 에서 실행했다. 1. 번호 생성조건은 3억개의 로또 번호에서 특정 번호를 뽑는데, 얼마나 시간이 걸리는지 ..
rabbitmq 심화 (persistent / cluster) rabbitmq persistentdelivery_mode는 RabbitMQ에서 메시지의 배달 모드를 지정하는 데 사용되는 옵션. 이 옵션은 메시지를 메모리에만 저장할지 아니면 디스크에 영구적으로 저장할지를 결정Transient메시지를 메모리에만 저장. RabbitMQ가 종료되면 메모리에 있는 메시지는 모두 삭제됨메시지는 RabbitMQ 서버의 메모리에서만 보관되므로 메모리가 부족한 경우 메시지 손실이 발생할 수 있음메시지를 가장 빠르게 처리하고자 할 때 사용Persistent메시지를 디스크에 저장. RabbitMQ가 종료되어도 메시지는 디스크에 보존됨.메시지를 디스크에 영구적으로 저장하여 메시지 손실을 방지할 수 있으며 재부팅 후에도 메시지가 유지되므로 안정성을 높일 수 있다.메시지의 지속성이 중요하고..
rabbitmq start docker-compose.yamlversion: "3"services: rabbitmq: image: rabbitmq:3-management-alpine container_name: rabbitmq-stream volumes: - ./etc/:/etc/rabbitmq/ - ./data/:/var/lib/rabbitmq/ - ./logs/:/var/log/rabbitmq/ ports: - "5672:5672" - "15672:15672" environment: RABBITMQ_ERLANG_COOKIE: "RabbitMQ-test" RABBITMQ_DEFAULT_USER: "admin" RABBITMQ_DE..
airflow scheduler high cpu usage CPU 99.7% 사용중 ........ 전혀 dag이 실행중이지 않는데도 CPU를 사용입니다. 너무 잦은 DAG 파일 검색으로 인한 CPU부하와 함께 기존 하위 버전 v1.10.*부터 아래와 같은 버그가 있었습니다. 스케줄러 버그 - 스케쥴러가 중단없이 계속 반복됨 웹서버의 높은 CPU 부하 또한 airflow의 디폴트 값 설정값은 속도를 중시하에 셋팅 되어 있습니다. 자신만의 CPU 상황과 dag+task의 수에 맞게 [scheduler] / [webserver] / [core]의 환경변수를 조절 해야 합니다. 아래는 이번에 수정한 환경변수 목록 입니다. 이중에서 dag_dir_list_interval / min_file_process_interval 를 높게 설정한것만으로도 CPU 부하를 줄일 수 ..
캐시 컴퓨터에서 캐시는 일시적인 데이터 집합으로 데이터 요청 시 해당 데이터의 스토리지에 액세스 하여 가능한 한 빨리 처리 위해 사용된다. 캐시를 사용하면 이전의 검색이나 데이터를 효율적으로 재사용할 수 있다 캐시는 운영 체제, CDN (Content Delivery Networks) 및 DNS를 포함한 네트워킹 계층, 웹 애플리케이션 및 데이터베이스를 포함한 다양한 기술 계층 전반에 걸쳐 적용 및 활용할 수 있다. 캐싱을 사용하여 웹서비스, 게임, 미디어 공유 및 소셜 네트워킹과 같은 읽기가 많은 애플리케이션 워크로드에 대해 지연 시간을 크게 줄이고 IOPS를 개선 할 수 있다. 애플리케이션 서버 캐시 서버 요청 계층에 직접 캐시를 배치하면 응답 데이터의 로컬 저장이 가능하다. 서비스에 대한 요청이 있을 때..
Consistent Hashing (일관된 해싱) 일관된 해싱은 여러 스토리지 서버 간에 데이터를 분할하여 스토리지 시스템의 확장성을 구현하기 위해 수행된다. 많은 서버 (데이터베이스 서버+ 파티션)에 많은 데이터가 분산되어 있고 사용 가능한 서버 수가 지속적으로 변경되는 경우 (서버 추가 또는 서버 제거) 일관된 해싱을 사용한다. 단순 해싱을 쓸 수 없는 이유 간단한 해싱은 데이터와 지정된 키를 모듈러 함수를 통해 지정된 범위의 숫자로 생성한다. 모듈러 함수로 md5 사용한다면 0~2^128−1 범위에서 임의의 값을 얻을 수 있다. 이제 우리의 해시 함수는 server_number = hash(key)%n 로 계산된다. 이것은 [0- (n-1)] 범위로 제공하며 n은 서버의 수가 된다. 이렇게 하면 서버수에 따라 데이터가 완벽하게 나뉜다. value를..