오늘 우리는 RedisTimeSeries 1.6의 정식 출시(GA)를 발표하게 되어 기쁩니다. 이번 글에서는 새롭게 제공되는 주요 기능들을 자세히 살펴보겠습니다.
RedisTimeSeries란?
RedisTimeSeries는 Redis를 위한 고성능 메모리 우선(memory-first) 시계열 데이터 구조입니다. 멀티 테넌시(multi-tenancy)를 지원하여 여러 시계열을 동시에 저장할 수 있으며, 여러 클라이언트가 이 시계열들에 동시에 접근하는 것도 가능합니다. 현재는 Redis Stack의 일부로도 제공됩니다.
RedisTimeSeries 1.6의 주요 신규 기능
- 강화된 쿼리 기능
- 시계열 간(cross-time series) 집계
- 타임스탬프 또는 샘플 값 기반 결과 필터링
- 가져올 라벨 선택
- 집계 버킷 정렬(ALIGN)
- 샘플 삭제
- 성능 개선
- 키스페이스 알림(Keyspace notifications)
- Redis on Flash를 위한 Redis Enterprise 지원
강화된 쿼리 기능
시계열 간 집계
1.6 버전 이전에는 다음과 같은 한 가지 유형의 집계만 가능했습니다.
- 단일 시계열 – 일정한 시간 간격(timeframe) 단위로 샘플을 집계
1.6 버전부터는 두 가지 새로운 집계 유형이 추가되었습니다.
- 여러 시계열 – 동일한 타임스탬프를 가진 샘플들을 시계열 집합 전체에 걸쳐 집계
- 여러 시계열 – 먼저 각 시계열을 일정한 시간 간격으로 집계한 후, 각 구간별로 그 결과를 시계열 집합 전체에 걸쳐 다시 집계
첫 번째 새로운 집계 유형을 예제로 살펴보겠습니다. 먼저 두 개의 주식을 생성하고, 서로 다른 3개의 타임스탬프에 가격을 추가합니다.
TS.CREATE stock:A LABELS type stock name A
TS.CREATE stock:B LABELS type stock name B
TS.MADD stock:A 1000 100 stock:A 1010 110 stock:A 1020 120
TS.MADD stock:B 1000 120 stock:B 1010 110 stock:B 1020 100
이제 타임스탬프별 최대 주가를 조회할 수 있습니다.
redis:6379> TS.MRANGE - + WITHLABELS FILTER type=stock GROUPBY type REDUCE max
1) 1) "type=stock" |
FILTER type=stock 절은 주식 가격을 나타내는 시계열만 남깁니다. GROUPBY type REDUCE max 절은 동일한 type 값을 가진 시계열들을 그룹으로 묶은 뒤, 각 타임스탬프마다 같은 type 값을 공유하는 모든 시계열을 max 애그리게이터로 집계합니다.
FILTER label=value는 TS.MRANGE와 TS.MREVRANGE에서 지원되며, 그 외에도 다양한 필터링 절을 사용할 수 있습니다(자세한 내용은 문서 참조).
다음으로 두 번째 새로운 집계 유형을 살펴보겠습니다.
먼저 두 개의 주식을 생성하고, 서로 다른 9개의 타임스탬프에 가격을 추가합니다.
TS.CREATE stock:A LABELS type stock name A
TS.CREATE stock:B LABELS type stock name B
TS.MADD stock:A 1000 100 stock:A 1010 110 stock:A 1020 120
TS.MADD stock:B 1000 120 stock:B 1010 110 stock:B 1020 100
TS.MADD stock:A 2000 200 stock:A 2010 210 stock:A 2020 220
TS.MADD stock:B 2000 220 stock:B 2010 210 stock:B 2020 200
TS.MADD stock:A 3000 300 stock:A 3010 310 stock:A 3020 320
TS.MADD stock:B 3000 320 stock:B 3010 310 stock:B 3020 300
이제 각 주식에 대해 1000밀리초 구간별 평균 주가를 계산한 뒤, 해당 구간에서 평균값이 가장 큰 주식을 조회해 보겠습니다.
redis:6379> TS.MRANGE - + WITHLABELS AGGREGATION avg 1000 FILTER type=stock GROUPBY type REDUCE max
1) 1) "type=stock" |
GROUPBY label REDUCE reducer는 TS.MRANGE와 TS.MREVRANGE에서 지원됩니다.
reducer로는 sum, min, max를 사용할 수 있습니다.
타임스탬프 또는 샘플 값 기반 필터링
TS.RANGE, TS.REVRANGE, TS.MRANGE, TS.MREVRANGE를 사용할 때 항상 모든 샘플을 조회하거나 집계하고 싶지는 않을 것입니다.
[FILTER_BY_TS ts...]를 사용하면 특정 타임스탬프 목록으로 샘플을 필터링할 수 있습니다.
[FILTER_BY_VALUE min max]를 사용하면 최솟값과 최댓값 범위로 샘플을 필터링할 수 있습니다.
예를 들어, 정상적인 값이 -100에서 100 사이인 지표를 샘플링하는데, 측정 오류를 나타내기 위해 9999라는 값을 사용한다고 가정해 보겠습니다.
TS.CREATE temp:TLV LABELS type temp location TLV
TS.MADD temp:TLV 1000 30 temp:TLV 1010 35 temp:TLV 1020 9999 temp:TLV 1030 40
이제 범위를 벗어난 값을 무시하고 모든 값을 조회해 보겠습니다.
TS.RANGE temp:TLV - + FILTER_BY_VALUE -100 100
마찬가지로 범위를 벗어난 값을 제외한 평균값도 조회할 수 있습니다.
TS.RANGE temp:TLV - + FILTER_BY_VALUE -100 100 AGGREGATION avg 1000
가져올 라벨 선택
TS.MRANGE, TS.MREVRANGE, TS.MGET 사용 시 매칭되는 시계열에 연결된 모든 라벨 값이 아니라, 선택한 라벨의 값만 필요한 경우가 있습니다.
SELECTED_LABELS를 사용하면 가져올 라벨을 선택할 수 있습니다. 다음과 같은 시계열과 데이터가 있다고 가정해 보겠습니다.
TS.CREATE temp:TLV LABELS type temp location TLV
TS.MADD temp:TLV 1000 30 temp:TLV 1010 35 temp:TLV 1020 9999 temp:TLV 1030 40
매칭된 시계열에 연결된 모든 라벨을 가져오려면 WITHLABELS를 사용합니다.
redis:6379> TS.MGET WITHLABELS FILTER type=temp
1) 1) "temp:TLV" |
하지만 location만 필요하다면 SELECTED_LABELS를 사용하면 됩니다.
redis:6379> TS.MGET SELECTED_LABELS location FILTER type=temp
1) 1) "temp:TLV" |
집계 버킷 정렬(ALIGN)
일평균 기온을 조회하고 싶지만 '하루'가 06:00에 시작된다고 가정해 보겠습니다. 이 경우 00:00~23:59가 아닌 06:00~05:59 기준으로 구간을 정렬하고 싶을 것입니다.
TS.RANGE, TS.REVRANGE, TS.MRANGE, TS.MREVRANGE 사용 시 이제 ALIGN 옵션을 통해 집계 버킷을 요청된 시작 시점, 종료 시점 또는 특정 타임스탬프에 맞춰 정렬할 수 있습니다.
정렬 기능을 시연하기 위해 다음 데이터를 추가해 보겠습니다.
TS.CREATE stock:A LABELS type stock name A
TS.MADD stock:A 1000 100 stock:A 1010 110 stock:A 1020 120
TS.MADD stock:A 1030 200 stock:A 1040 210 stock:A 1050 220
TS.MADD stock:A 1060 300 stock:A 1070 310 stock:A 1080 320
먼저 ALIGN 없이(즉, 기본 정렬값 0으로) 집계해 보겠습니다.
redis:6379> TS.RANGE stock:A - + AGGREGATION min 20
1) 1) (integer) 1000 |
이번에는 ALIGN을 적용해 보겠습니다.
redis:6379> TS.RANGE stock:A - + ALIGN 10 AGGREGATION min 20
1) 1) (integer) 990 |
ALIGN을 10으로 설정하면 첫 번째 버킷이 시점 10에서 시작하고, 나머지 버킷들(각각 20밀리초 길이)도 이에 맞춰 정렬됩니다.
범위 쿼리의 시작 타임스탬프가 명시적으로 지정된 경우('-'가 아닌 경우), align을 '-' 또는 'start'로 설정하여 해당 시점에 맞출 수도 있습니다.
redis:6379> TS.RANGE stock:A 5 + ALIGN start AGGREGATION min 20
1) 1) (integer) 985 |
마찬가지로 종료 타임스탬프가 명시적으로 지정된 경우('+'가 아닌 경우), align을 '+' 또는 'end'로 설정하여 해당 시점에 맞출 수 있습니다.
샘플 삭제
TS.DEL을 사용하면 특정 시계열에서 두 타임스탬프 사이의 샘플을 삭제할 수 있습니다.
예를 들어 TS.DEL stock:A 1020 1050은 타임스탬프 1020에서 1050 사이(양 끝 포함)의 모든 샘플을 삭제합니다. 반환값은 삭제된 샘플의 개수입니다.
성능 개선
수많은 최적화가 적용되어, 이제 대부분의 쿼리가 RedisTimeSeries 1.4에 비해 훨씬 빠르게 실행됩니다.
다음 표는 단일 노드에서 TSBS 쿼리(여기서 설명한 바 있습니다)로 달성 가능한 초당 쿼리 수를 보여줍니다. 표에는 1.4 버전에서 지원했던 TSBS 쿼리 중 일부만 나열되어 있습니다.
| 쿼리 유형 | v1.4 queries/sec | v1.6 queries/sec | % 변화 (높을수록 좋음) |
| tsbs-scale100_cpu-max-all-1 | 1388 | 1500 | 8.07% |
| tsbs-scale100_double-groupby-1 | 100 | 108 | 8.00% |
| tsbs-scale100_groupby-orderby-limit | 793 | 1282 | 61.66% |
| tsbs-scale100_single-groupby-1-1-1 | 13448 | 21347 | 58.74% |
| tsbs-scale100_single-groupby-1-1-12 | 2383 | 3921 | 64.54% |
RedisTimeSeries 1.4에 비해 초당 처리 가능한 쿼리 수가 8%에서 65%까지 향상된 것을 확인할 수 있습니다.
키스페이스 알림
Redis 키스페이스 알림(Keyspace notifications)은 Redis 클라이언트가 Pub/Sub 채널을 구독하여 Redis 데이터셋에 영향을 미치는 이벤트를 수신할 수 있도록 해줍니다. 예를 들어 RedisGears와 함께 사용하면 이 알림을 통해 함수를 트리거할 수 있습니다.
이를 활용하면 샘플 스트림을 수신 대기하면서 실시간으로 예측과 경고를 생성하는 시계열 예측기나 이상 감지기를 구현할 수 있습니다. 다양한 RedisTimeSeries 명령을 구독하고 이벤트를 생성하는 테스트 사례를 참고해 보세요.
Redis on Flash를 위한 Redis Enterprise 지원
1.6 버전부터 RedisTimeSeries는 Redis on Flash 환경에서 실행할 수 있습니다. 다만 RoF는 키(key) 수준에서 구현된다는 점에 유의해야 합니다. 즉, 시계열 전체의 값이 FLASH 또는 RAM 중 한 곳에 저장됩니다.
RedisTimeSeries는 이제 Redis Stack의 일부
RedisTimeSeries는 이제 Redis Stack에 포함되어 있습니다. macOS, Ubuntu 또는 Redhat용 최신 Redis Stack Server 바이너리를 다운로드하거나, Docker, Homebrew, Linux를 통해 설치할 수 있습니다.
RedisInsight로 시계열 데이터 시각화하기
RedisInsight는 개발자를 위한 시각적 도구로, Redis 또는 Redis Stack을 사용하는 개발 과정에서 RedisTimeSeries 데이터를 손쉽게 탐색할 수 있는 훌륭한 방법을 제공합니다.
그래픽 사용자 인터페이스에서 직접 시계열 쿼리를 실행하고 결과를 확인할 수 있으며, 이제 RedisInsight는 RedisTimeSeries 쿼리 결과를 시각화할 수 있습니다.
또한 RedisInsight에는 RedisTimeSeries를 대화형으로 학습할 수 있는 빠른 가이드와 튜토리얼이 포함되어 있습니다.
RedisTimeSeries에 대해 더 자세히 알아보려면 redis.io와 developer.redis.com을 방문하세요.