Time Series Database Overview
The storage tier of the data lake is Aster TSDB, optimized for industrial time series workloads (apache-cassandra-timeseries).
It is an in-house fork of Apache Cassandra cassandra-6.0; the CQL syntax and disk format are identical to the upstream — it reads existing 6.0 data as-is, and new features work only when explicitly enabled.
These names are similar and are the most common source of confusion. What they store is different.
| Time Series Database (this document) | Time Series Engine (TSE) | |
|---|---|---|
| What it stores | Sensor values — tag points from the field (pp.tm_tag_point) | Metrics — the system's own indicators, such as PLANTPULSE.JMX.* and PLANTPULSE.EDGE.* |
| Nature | General-purpose time series database | Metrics-only |
| Port | 9042 (CQL) | 7800 (plaintext) · 7801 (TLS) |
| Query | CQL — with built-in functions like time_bucket_gapfill | TQL |
| Documentation | This section | Time Series Engine |
"What was the equipment temperature?" goes here. "How many records did the collector process yesterday?" goes to the engine.
The engine also writes to the same Aster TSDB ring, but its keyspace and schema are different, so metrics stored in the engine will not appear even if you query the tag tables with CQL.
What Improves
Field time series have their own characteristics. Tags accumulate endlessly at second-level granularity, must be retained for years due to regulations, an edge that was disconnected may push days' worth of data at once (late loading), and queries are almost always “this tag, this time range”. Stock Cassandra can do this, but compression, retention, and aggregation all become the application's responsibility. This fork moves that responsibility into the database itself.
| What you want to do | What this database does | Documentation |
|---|---|---|
| Handle bucketing, aggregation, and interpolation on the server | 21 CQL functions + gap filling | Time Series Functions |
| Automatically compress old data | Tiered storage — queries remain unchanged | Tiered Storage |
| Delete old data entirely after the retention period | Time Series Compaction (TSCS) | Time Series Compaction |
| Search log/event bodies by substring | Full-text search — including Korean | Full-Text Search |
Enabling All Three Together
쓰기 ──▶ [ 핫 구간 ] 최근 데이터. 평소대로 행으로 저장·질의
│
│ hot_window 를 지나면 (계층형 저장)
▼
[ 콜드 청크 ] 컬럼 지향으로 압축. SELECT 가 알아서 합쳐 읽는다
│
│ cold_window / retention 이 지나면
▼
통째로 삭제 컴팩션 없이 창 단위로 (TSCS)
TSCS and tiered storage are independent of each other. You can enable one or both; the lower-risk option is to enable TSCS first.
Measured Results — Production Table Shape, 20 Million Rows
tm_tag_point (8 general columns), host 234, chunk format v4.
| Item | Before Tiering | After Tiering | Effect |
|---|---|---|---|
| Storage size | 237.8 MB | 33.3 MB | 7.1× smaller (11.9 → ~1.7 bytes per row) |
count(*) (40,000-row partition) | 303 ms | 50 ms | 6.1× faster |
time_bucket + aggregation | 150–270 ms | 31–64 ms | 3–6× faster |
| Gap filling (locf · interpolate) | 162–284 ms | 30–53 ms | 5.4× faster |
| Hourly average of 90 tags (3.6 million rows) | 14.9 s | 4.2 s | 3.5× faster |
Usually compression trades speed for space, but here all measured queries were as fast or faster — because fewer bytes are read. Even scans without a range limit stop when LIMIT fills, as they decompress chunks in query order, so they don't get slower.
- Full-scan aggregation without a partition key returns incorrect values on tiered tables. That path does not merge chunks.
- The space savings depend on the table shape. A minimal shape with no constant columns and no all-null columns (a single high-entropy
double) will not see the figures above. Re-measure on your own table before deciding.
Where to Find It
Go to $PP_HOME/plantpulse-storage/db/cassandra then apache-cassandra-timeseries-<version>.jar.
The version of the running process is checked as follows.
docker exec plantpulse-datalake nodetool version
Version, source, and update procedure are in the operator documentation, not this manual.
See Also
| What you want to do | Documentation |
|---|---|
| Use bucketing, gap filling, and interpolation | Time Series Functions |
| Move old values to cheaper storage | Tiered Storage |
| Understand compaction | Time Series Compaction (TSCS) |
| Search bodies | Full-Text Search |
| Query directly with CQL | Data Query |
Looking for metrics (system indicators)? This isn't the place → Time Series Engine