장비별 해시레이트와 온도를 Telegraf로 모아 InfluxDB에 넣고 Grafana로 보고 있었다. 몇 주 만에 디스크가 찼다.
Table of contents
Open Table of contents
증상 — 몇 주 만에 디스크가 찼다
장비가 백 대가 넘고 각각 여덟 개씩 지표를 올리고 있었다. 1초 간격으로 쌓으니 하루에 수천만 포인트가 됐다.
df -h로 보니 /var/lib/influxdb가 붙은 파티션에 남은 공간이 5%밖에 되지 않았다. 그대로 두면 며칠 안에 쓰기가 멈출 상태였다.
배제한 것들
먼저 디스크를 늘리는 것을 생각했는데 그 자리에서는 못 했다. 장비실이라 부품을 넣으려면 반입 일정을 따로 잡아야 했다.
압축 설정을 바꿔 볼까 했는데 InfluxDB 문서를 보니 TSM 엔진이 이미 기본으로 압축하고 있었다. 설정을 만져서 더 줄일 여지가 남아 있지 않았다.
수집 간격을 늘리는 것도 봤다. 그런데 장비가 멈추는 순간을 잡으려면 초 단위가 필요해서 지금 것을 줄일 수 없었다.
남은 것은 오래된 데이터의 해상도를 낮추는 것이었다. 최근 것은 그대로 두고 지난 것만 줄인다.
용도마다 필요한 것이 달랐다
무엇을 보는지 나눠 봤다. 장애 확인은 최근 며칠을 초 단위로 보고, 월별 가동률은 시간 단위면 충분했다.
되짚어 보니 초 단위가 실제로 필요한 구간은 아주 짧았다. 한 달 전 데이터를 초 단위로 여는 화면은 하나도 없었다.
기간에 따라 해상도를 낮췄다
Retention Policy를 셋으로 나눠 7일은 원본, 90일은 1분 평균, 그 뒤는 1시간 평균으로 뒀다.
CREATE RETENTION POLICY "raw_7d" ON "rig" DURATION 7d REPLICATION 1 DEFAULT
CREATE RETENTION POLICY "min_90d" ON "rig" DURATION 90d REPLICATION 1
CREATE RETENTION POLICY "hour_2y" ON "rig" DURATION 730d REPLICATION 1
Continuous Query로 자동 요약되게 했다. 원본은 7일 뒤 지워지고 요약본만 남는다.
CREATE CONTINUOUS QUERY "cq_1m" ON "rig" BEGIN
SELECT mean("hashrate") AS "mean_hashrate",
max("hashrate") AS "max_hashrate",
min("hashrate") AS "min_hashrate"
INTO "min_90d"."rig_1m" FROM "raw_7d"."rig_raw"
GROUP BY time(1m), "rig_id"
END
GROUP BY time()이 없으면 Continuous Query 자체가 만들어지지 않는다. 장비별로 갈라야 해서
rig_id 태그도 함께 묶었다.
남은 공간이 15%까지 돌아왔고 그 뒤로 다시 줄지 않았다. 화면에서 최근 구간을 여는 속도도 빨라졌다.
평균만 남기면 잃는 것
평균만 남기니 장비가 잠깐 튀었던 순간 최대가 사라졌다. 장비가 잠깐 튀었던 것이 평균에 묻혀 안 보였다.
그래서 위 쿼리처럼 mean 옆에 max와 min을 함께 넣었다. 컬럼이 셋으로 늘어도 원본을 그대로 두는 것보다는 훨씬 작았다.
요약본을 먼저 만들고 며칠 대조한 뒤에 원본을 지우게 했다. 지우고 나서 요약이 잘못된 것을 알면 되돌릴 방법이 없다.
정리
- 초 단위 지표는 장비 수 × 지표 수만큼 빠르게 쌓인다
- 디스크 증설·압축·수집 간격은 이 상황에서 쓸 수 없었다
- 남은 방법은 오래된 데이터의 해상도를 낮추는 것이었다
- 무엇을 보는지 나눠 보면 초 단위가 필요한 구간이 짧다는 것이 드러난다
- Retention Policy를 7일 원본 · 90일 1분 · 그 뒤 1시간으로 나눴다
- 평균만 남기면 순간 최대가 사라지므로 최댓값·최솟값을 함께 넣었다
- 요약본을 먼저 만들고 대조한 뒤에 원본을 지운다
- 지운 뒤에는 되돌릴 방법이 없다