TimescaleDB를 사용하여 PostgreSQL에서 시계열 데이터 성능 극대화하기
Emily Parker
Product Engineer · Leapcell

소개
오늘날의 데이터 중심 세계에서 시계열 데이터는 어디에나 존재합니다. IoT 장치 메트릭 및 금융 시장 변동부터 애플리케이션 성능 모니터링 및 센서 판독에 이르기까지 기업은 지속적으로 타임스탬프가 찍힌 정보 스트림으로 넘쳐납니다. 이 계속 늘어나는 데이터 볼륨을 효과적으로 저장하고 쿼리하는 것은 중요한 과제입니다. 강력한 관계형 데이터베이스는 강력하지만, 시계열 데이터의 고유한 특성인 추가 전용 특성, 높은 삽입 속도, 시간 기반 집계 및 범위에 초점을 맞춘 쿼리 패턴으로 종종 어려움을 겪습니다. 이로 인해 성능 병목 현상과 운영상의 어려움이 발생하는 경우가 많습니다. 다행히 PostgreSQL용 TimescaleDB 확장을 비롯한 전문 솔루션이 등장하여 이러한 문제점을 해결하고 강력한 범용 데이터베이스를 고성능 시계열 파워하우스로 탈바꿈시켰습니다.
시계열 데이터 환경 이해
TimescaleDB의 구체적인 내용을 살펴보기 전에 시계열 데이터 및 관리와 관련된 주요 개념에 대한 공통적인 이해를 확립해 봅시다.
- 시계열 데이터: 시간 순서대로 인덱싱(또는 나열)된 데이터 포인트 시퀀스입니다. 각 데이터 포인트는 일반적으로 타임스탬프와 하나 이상의 측정값을 포함합니다.
- 높은 수집 속도: 시계열 애플리케이션은 종종 매우 높은 빈도로 데이터를 생성하므로 데이터베이스에 강력한 쓰기 성능이 요구됩니다.
- 시간 기반 쿼리: 일반적인 쿼리 패턴에는 시간 범위 필터링, 특정 간격에 대한 데이터 집계(예: 평균, 합계, 개수) 및 다른 기간에 걸친 데이터 비교가 포함됩니다.
- 데이터 보존 정책: 엄청난 양 때문에 시계열 데이터는 종종 다양한 보존 요구 사항을 가지며, 오래된 데이터는 보관되거나 다운샘플링될 수 있습니다.
- 하이퍼테이블(Hypertable): TimescaleDB에서 이것이 핵심 추상화입니다. 시간 및 선택적 다른 열을 기반으로 데이터를 여러 일반 PostgreSQL 테이블( "청크"라고 함)에 자동으로 분할하는 가상 테이블입니다. 이 분할은 성능 이점의 핵심입니다.
- 청크(Chunk): 특정 시간 범위에 대해 하이퍼테이블 데이터를 저장하는 일반 PostgreSQL 테이블입니다. TimescaleDB는 이러한 청크를 투명하게 관리합니다.
TimescaleDB의 장점
TimescaleDB는 PostgreSQL을 확장하여 PostgreSQL의 안정성, 유연성 및 방대한 생태계를 희생하지 않으면서 기본 시계열 기능을 제공합니다. 핵심 원칙은 사용자에게 대부분 숨겨진 지능형 분할로, 시계열 워크로드의 성능을 대폭 향상시킵니다.
TimescaleDB가 작동하는 방식
TimescaleDB의 효율성의 핵심은 하이퍼테이블과 청킹입니다. 하이퍼테이블을 만들 때 시간 열(및 선택적으로 다른 분할 키)을 지정합니다. TimescaleDB는 이 논리적 테이블을 작고 관리하기 쉬운 물리적 테이블, 즉 청크로 자동 분할합니다.
효율적인 수집: 새 데이터는 항상 가장 최근의 활성 청크에 기록됩니다. 즉, 삽입은 주로 더 빠른 쓰기 성능을 제공하는 더 작은 테이블을 대상으로 하며, 단일의 계속 성장하는 테이블에 대한 충돌을 피합니다.
더 빠른 쿼리: 시간 기반 필터로 하이퍼테이블을 쿼리할 때 TimescaleDB의 쿼리 플래너( "청크 집계기"라고 함)는 관련 청크만 지능적으로 식별하고 스캔합니다. 이를 통해 데이터베이스가 처리해야 하는 데이터 양이 크게 줄어들어 쿼리 실행 속도가 훨씬 빨라집니다. 예를 들어, 지난 1시간의 데이터를 쿼리하는 경우 TimescaleDB는 전체 데이터 세트가 아닌 해당 특정 시간을 다루는 청크만 확인하면 됩니다.
자동 데이터 관리: TimescaleDB는 청크 생성 및 관리를 자동으로 처리합니다. 데이터가 수집되고 시간이 지남에 따라 수동 개입 없이 새 청크가 생성됩니다. 또한 데이터 보존 정책(오래된 청크를 자동으로 삭제하기 위함) 및 다운샘플링(장기 저장을 위해 더 거친 세분성으로 데이터 집계)과 같은 기능도 제공합니다.
실질적인 구현
센서 데이터를 저장하기 위해 TimescaleDB를 사용하는 간단한 예제를 살펴보겠습니다.
1. TimescaleDB 확장 설치:
먼저 PostgreSQL 인스턴스에 TimescaleDB를 설치해야 합니다. 일반적으로 postgresql.conf
에 확장을 추가한 다음 데이터베이스 내에서 생성합니다.
-- 데이터베이스에 연결 \c your_database_name -- TimescaleDB 확장 생성 CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
2. 일반 테이블 생성: 일반적으로 PostgreSQL에서 스키마를 정의하는 것부터 시작합니다. 다양한 센서의 온도를 추적한다고 가정해 보겠습니다.
CREATE TABLE sensor_readings ( time TIMESTAMPTZ NOT NULL, sensor_id INTEGER NOT NULL, temperature DOUBLE PRECISION );
3. 하이퍼테이블로 변환:
이제 이 일반 테이블을 하이퍼테이블로 변환합니다. 이것이 TimescaleDB의 최적화를 가능하게 하는 중요한 단계입니다. time
열을 시간 분할 열로 지정합니다.
SELECT create_hypertable('sensor_readings', 'time');
chunk_time_interval
(예: interval '1 day'
또는 interval '1 hour'
)을 지정하여 청크 크기를 제어할 수도 있습니다. 청크가 클수록 파일 수가 줄어들지만 청크당 스캔되는 데이터 양이 늘어날 수 있습니다. 청크가 작을수록 파일 수가 늘어나지만 잠재적으로 더 많은 대상 스캔이 가능합니다. TimescaleDB의 기본값이 자주 잘 작동하지만 특정 워크로드에 대한 조정이 필요할 수 있습니다.
4. 데이터 삽입: 하이퍼테이블에 데이터를 삽입하는 것은 일반 테이블에 삽입하는 것과 동일합니다.
INSERT INTO sensor_readings (time, sensor_id, temperature) VALUES ('2023-01-01 10:00:00+00', 1, 22.5), ('2023-01-01 10:01:00+00', 1, 22.7), ('2023-01-01 10:00:00+00', 2, 21.9), ('2023-01-01 10:02:00+00', 1, 23.0), ('2023-01-02 11:00:00+00', 1, 24.1), ('2023-01-02 11:01:00+00', 2, 23.8);
5. 데이터 쿼리: 표준 SQL 쿼리는 원활하게 작동합니다. TimescaleDB는 이를 올바른 청크를 대상으로 하도록 지능적으로 다시 작성합니다.
-
시간 범위별 쿼리:
SELECT * FROM sensor_readings WHERE time >= '2023-01-01 10:00:00+00' AND time < '2023-01-01 11:00:00+00';
-
시간 기반 집계: TimescaleDB는 시계열 분석을 위한 강력한 함수, 특히
time_bucket()
을 제공합니다. 이 함수를 사용하면 데이터를 임의의 시간 간격으로 그룹화할 수 있습니다.SELECT time_bucket('5 minutes', time) AS five_min_bucket, sensor_id, AVG(temperature) AS avg_temp FROM sensor_readings WHERE time >= '2023-01-01 10:00:00+00' AND time < '2023-01-01 11:00:00+00' GROUP BY five_min_bucket, sensor_id ORDER BY five_min_bucket, sensor_id;
이 쿼리는 5분 간격으로 각 센서의 평균 온도를 우아하게 계산합니다. time_bucket()
이 없으면 일반적으로 더 복잡한 날짜 조작이 필요합니다.
고급 기능 및 사용 사례
TimescaleDB는 기본적인 청킹 이상의 기능을 제공합니다.
- 압축: 자주 액세스하지 않는 오래된 청크의 경우 TimescaleDB는 열 압축을 허용하여 저장 공간을 크게 줄입니다.
- 연속 집계: 이는 시간 경과에 따라 데이터를 자동으로 미리 집계하는 구체화된 뷰로, 백그라운드에서 계산을 수행하여 일반적인 분석 쿼리를 극적으로 가속화합니다.
- 데이터 보존 정책: 지정된 기간보다 오래된 청크를 자동으로 삭제하는 정책을 정의하여 스토리지 비용을 관리합니다.
- 실행 가능한 분석: 간단한 집계 외에도 TimescaleDB는 복잡한 창 함수 및 고급 분석 쿼리를 지원하므로 시계열 인텔리전스를 위한 다목적 도구가 됩니다.
TimescaleDB는 다음과 같은 시나리오에서 뛰어납니다.
- IoT 모니터링: 수천 또는 수백만 개의 센서에서 데이터를 수집하고 분석합니다.
- 인프라 모니터링: 서버 및 서비스의 CPU, 메모리, 네트워크 및 디스크 사용량을 추적합니다.
- 금융 데이터 분석: 틱별 시장 데이터를 저장하고 실시간 분석을 수행합니다.
- 애플리케이션 성능 모니터링 (APM): 애플리케이션 응답 시간, 오류 및 리소스 사용량에 대한 메트릭을 수집합니다.
결론
시계열 데이터를 효율적으로 저장하고 쿼리하는 것은 일반 관계형 데이터베이스가 종종 어려움을 겪는 복잡한 작업입니다. TimescaleDB는 PostgreSQL을 목적에 맞는 시계열 데이터베이스로 변환하여 지능형 분할 및 시간 인지 최적화를 활용하여 대량 수집과 복잡한 분석 쿼리 모두에 대해 뛰어난 성능을 제공합니다. 친숙하고 강력한 PostgreSQL 생태계를 확장함으로써 TimescaleDB는 계속해서 증가하는 타임스탬프 정보의 홍수를 관리하는 데 있어 강력하고 확장 가능하며 개발자 친화적인 솔루션을 제공합니다. 애플리케이션이 시계열 데이터를 처리하는 경우 PostgreSQL에서 TimescaleDB를 채택하면 효율성과 기능이 크게 향상됩니다.