시계열 소개
시계열 소개 (Introduction to time series)
하루 동안 바깥 온도가 어떻게 바뀌는지 알고 싶다고 상상해보세요. 한 시간마다 온도계를 확인해 시간과 현재 온도를 기록한다면, 시간 순서대로 정렬된 측정값의 연속인 시계열(time series) 데이터가 만들어져요. 시계열은 특정 시점의 시스템 상태를 분석해 과거를 이해하게 하고, 데이터의 추세를 찾아 미래를 예측하는 데도 도움을 줘요.
출처: 문서
본문
한 시간마다 온도를 기록한 예시:
| Time | Value |
|---|---|
| 09:00 | 24°C |
| 10:00 | 26°C |
| 11:00 | 27°C |
표의 각 행은 특정 시점의 개별 측정값 하나를 나타내요. 표는 개별 측정값을 식별하는 데 유용하지만 큰 그림을 보기엔 어려워요. 시계열의 더 일반적인 시각화는 그래프로, 각 측정값을 시간 축을 따라 배치해 데이터의 패턴과 특징을 쉽게 발견하게 해줘요.
온도뿐 아니라 시계열의 다른 예로는 CPU와 메모리 사용량, 센서 데이터, 주식 시장 지수 등이 있어요. 이들은 모두 시간순으로 정렬된 측정값의 연속이면서 다음 속성도 공유해요:
- 새 데이터는 정기 간격으로 끝에 추가돼요 — 예: 매시간 09:00, 10:00, 11:00 등.
- 측정값은 추가된 후 거의 업데이트되지 않아요 — 예: 어제의 온도는 변하지 않아요.
시계열은 강력해요. 어떤 시점의 시스템 상태를 분석하게 해 과거를 이해하는 데 도움을 주며, 예를 들어 여유 디스크 공간이 0이 된 직후 서버가 크래시했다는 걸 알려줄 수 있어요. 또한 데이터의 추세를 찾아 미래를 예측하는 데도 도움이 돼요. 등록 사용자 수가 지난 몇 달간 매월 4%씩 증가했다면 연말 사용자 기반 규모를 예측할 수 있죠.
일부 시계열은 알려진 기간에 반복되는 패턴을 가져요. 예를 들어 온도는 보통 낮에 더 높고 밤에 내려가요. 이런 주기적·계절적 시계열을 식별하면 다음 기간에 대해 자신 있게 예측할 수 있어요. 시스템 부하가 매일 18:00쯤 최고조에 달한다는 걸 안다면, 그 직전에 머신을 더 추가할 수 있어요.
시계열 집계 (Aggregating time series)
측정 간격보다 긴 기간을 비교하고 싶다면 어떻게 해야 할까요? 온도를 한 시간마다 재면 하루에 24개 데이터 포인트가 생겨요. 여러 해의 8월 온도를 비교하려면 31×24개 데이터 포인트를 하나로 결합해야 해요. 측정값 컬렉션을 결합하는 것을 **집계(aggregation)**라고 해요. 일반적인 집계 방법:
- Average: 모든 값의 합을 값 개수로 나눠요.
- Min / Max: 컬렉션의 최솟값과 최댓값을 반환해요.
- Sum: 컬렉션의 모든 값의 합을 반환해요.
- Count: 컬렉션의 값 개수를 반환해요.
예를 들어 한 달의 데이터를 집계하면 2017년 8월이 그 전 해보다 평균적으로 더 따뜻했는지 알 수 있어요. 한 달 중 어느 달이 가장 뜨거웠는지 보려면 각 달의 최고 온도를 비교하면 돼요. 시계열 데이터를 어떻게 집계할지는 데이터로 전달하고 싶은 이야기에 따라 정하는 중요한 결정이에요. 같은 시계열 데이터를 다른 방식으로 시각화하기 위해 서로 다른 집계를 쓰는 건 흔한 일이에요.
시계열과 모니터링
IT 업계에서는 인프라·하드웨어·애플리케이션 이벤트 같은 것을 모니터링하기 위해 시계열 데이터를 자주 수집해요. 기계 생성 시계열 데이터는 보통 짧은 간격으로 수집되어 예기치 않은 변화가 발생한 직후 반응할 수 있게 해줘요. 결과적으로 데이터가 빠르게 축적되므로 효율적으로 저장·쿼리하는 방법이 필수적이며, 시계열 데이터에 최적화된 데이터베이스가 최근 인기를 얻고 있어요.
시계열 데이터베이스 (TSDB)
시계열 데이터베이스(TSDB)는 시계열 데이터를 위해 명시적으로 설계된 데이터베이스예요. 일반 데이터베이스로도 측정값을 저장할 수 있지만, TSDB는 유용한 최적화 기능을 제공해요. 현대 TSDB는 측정값이 추가만 되고 거의 업데이트되거나 제거되지 않는다는 사실을 활용해요. 예를 들어 각 측정값의 타임스탬프는 시간이 지나도 거의 변하지 않아 중복 데이터가 저장됩니다.
다음 Unix 타임스탬프 시퀀스를 보세요:
1572524345, 1572524375, 1572524404, 1572524434, 1572524464
모두 1572524로 시작해 디스크 공간을 비효율적으로 사용해요. 대신 각 후속 타임스탬프를 첫 번째 값과의 차이(delta)로 저장할 수 있어요:
1572524345, +30, +29, +30, +30
한 걸음 더 나아가 이 delta들의 delta를 계산할 수도 있어요:
1572524345, +30, -1, +1, +0
측정값이 정기 간격으로 수집되면 이 delta-of-delta 대부분이 0이 돼요. 이런 최적화 덕분에 TSDB는 다른 데이터베이스보다 훨씬 적은 공간을 써요.
TSDB의 또 다른 기능은 **태그(tags)**를 사용해 측정값을 필터링하는 것이에요. 각 데이터 포인트에는 측정 위치 같은 컨텍스트 정보를 추가하는 태그가 붙어요. 측정값이 어떻게 저장되는지 보여주는 InfluxDB 데이터 포맷 예시:
weather,location=us-midwest temperature=82 1465839830100400200
| -------------------- -------------- |
| | | |
| | | |
+-----------+--------+-+---------+-+---------+
|measurement|,tag_set| |field_set| |timestamp|
+-----------+--------+-+---------+-+---------+
Grafana가 지원하는 TSDB 중 일부:
시계열 데이터 수집
시계열을 저장할 곳이 생겼으니, 실제로 측정값을 어떻게 모을까요? 보통 모니터링하려는 장치·머신·인스턴스에 **컬렉터(collector)**를 설치해요. 일부 컬렉터는 특정 데이터베이스를 염두에 두고 만들어지고, 일부는 다른 출력 대상을 지원해요. 컬렉터 예시:
컬렉터는 데이터베이스에 데이터를 푸시(push)하거나, 데이터베이스가 컬렉터에서 풀(pull)하도록 합니다. 두 방식 모두 장단점이 있어요:
| Pros | Cons | |
|---|---|---|
| Push | 여러 대상으로 데이터를 복제하기 쉬움 | TSDB가 얼마나 많은 데이터가 전송되는지 제어할 수 없음 |
| Pull | 수집되는 데이터 양과 정확성을 더 잘 제어 | 방화벽·VPN·로드 밸런서가 에이전트 접근을 어렵게 함 |
모든 측정값을 데이터베이스에 매번 쓰는 건 비효율적이므로, 컬렉터는 데이터를 사전 집계해 정기 간격으로 시계열 데이터베이스에 기록해요.