Postgres as the Substructure for IoT and the Next Wave of Computing
blog.timescale.com
blog.timescale.com
TimescaleDB is an extension that brings the automatic partitioning (which is common in data warehouses) to Postgres. It is more scalable and reliable than doing it yourself using normal PG partitioning features. Timescale is similar to Citus, which can also auto-shard tables, but is more focused on time as the primary dimension, along with helper functions for easier bucketing and analysis. Unlike Citus, it's currently limited to a single node.
The biggest benefit is being able to use Postgres with your other operational data so you can avoid ETL and simplify your stack. It will also greatly improve insert performance since recent data is in small partitions with indexes in memory. This will not match the scale and performance of a fully distributed data warehouse with time as a partitioning key, but will work for most general timeseries looking at a recent time window.
Whether your data comes from IoT devices, blockchain transactions, or some other source doesn't matter. If you want to try this extension, Aiven makes it easy: https://aiven.io/blog/turn-aiven-postgresql-into-time-series...
But once I got past that, it was enlightening. I've been very dissatisfied with the time-series options available out there, so learning about something built on Postgres, which we already use extensively for OLTP purposes, was very interesting. Thanks.
As an aside, I find that I can use sqlite for 90% of the DB needs I have. For the other 10% (multiple writers, more granular locking, more concurrent connections, richer data types such as inet), then I use Postgres.
Though TimescaleDB would improve the efficiency of RAM use I don't think you want to try and run a database on an IoT device with very limited RAM to begin with.
"IoT" is only one of those buzzwords that means different things for everyone. Free cookie to whomever guesses the other one...
With TimescaleDB time series data is the offer, not some vague idea of "connectedness" or "the future".
The use of PostreSQL in Timescale is a big selling point, it's something we know how to manage and scale. A big stumbling block though is with the retention of older data.
For now we do mainly service/machine monitoring and event logging without needing high granularity for older data and keeping disk usage contained.
For this we've found InfluxDB to be well suited, as the retention policy system is easy to set up and fits our needs perfectly.
Do you plan on introducing similar functionality in Timescale? I've found this issue in Github but don't know if this is something that is being pursued for the official product.
But unlike InfluxDB (at least what we've been told by users), the important thing about TimescaleDB's rollups is that they correctly handle late data. So if you are performing a rollup every 10 minutes, but the data corresponding to 9:58 actually arrives at 10:05, it's easy to ensure that you subsequently reperform the rollup and "correct" that previous answer. This happens because we correctly support UPSERTS: http://docs.timescale.com/v0.9/using-timescaledb/writing-dat...
You can also read more about one of our user's experience with rollups (compared to via Influx) in their recent blog post: https://blog.dnsfilter.com/3-billion-time-series-data-points...
As to that feature request in the github issue, it's actually asking for a much subtler and more powerful functionality. In particular, it wants the "rollup" to be hidden from the user, such that they don't worry about querying the raw vs. rollup table, and just see a single table view across multiple different levels of aggregation. Further, the planner would be smart enough which one to choose based on the time aggregation being asked for, as well as transparently merge data across different aggregation levels.
This functionality is definitely on top of mind, but my understanding is that Influx doesn't support anything like this as well: If you have a rollup table there (say, to 10 minutes), you need to explicitly ask for data from the 10min rollup table, and you don't see any data that has been written in the last 10 minutes. TimescaleDB similarly supports this today.
1) Use PostgreSQL's built-in aggregate functions and/or Timescale API (time_bucket?) to feed rollup tables;
2) Delete the raw, non-aggregated data;
3) trigger these queries using cron according to need.
This would be totally OK for us (even if in-DB scheduling is indeed easier), and as you say, in some ways superior to Influx. I will test it out.
Do you have any tutorials or examples of using rollups in practice? Thanks!
So to review:
1) Create a "raw" and "rollup" table. Define the rollup table with the right UNIQUE constraint (say, on timestamp and server_id). Call create_hypertable() to convert them both to Timescale hypertables.
2) Write a rollup UPSERT query similar to following:
INSERT INTO rollup VALUES ( SELECT time_bucket('10 minutes', time) as time, server_id, sum(value) as sum, count(value) as count FROM raw WHERE time > now() - interval '20 minutes' GROUPBY time, server_id) ON CONFLICT (time, server_id) DO UPDATE SET sum = excluded.sum, count = excluded.com;
3) Write a data retention query: SELECT drop_chunks(interval '6 hours', 'raw');
4) Then schedule the rollup query to run every 10 minutes, and the data retention query to run, e.g., every 3 hours. Note that the rollup query above will properly handle late data.
A more detailed tutorial is in the works (e.g., using triggers for late data rather than the "20 minute sweep" trick as above). But also happy to help out in our slack channel: http://slack.timescale.com/
If so, data retention policies are easy with TimescaleDB:
http://docs.timescale.com/v0.9/using-timescaledb/data-retent...
Those of us at TimescaleDB hope to see PostgreSQL move up in the rankings (at least pass 'Don't Know', yikes!).
That said, I actualy did read the article, and it was excellent. I was a little put off by the "IoT" (buzzword fatigue) and like 2% over-editorializing (to set the stage for timescaledb) but it makes sense given that the poster is the CTO, with a company to promote, and the fact that the people who might read the article are varied.
Inside the article is a link to a post on why PG10 doesn't quite stack up[0], which was also a great read -- the naive engineer in me immediately asked myself that since PG10 offered improved partitioning why I would need TimescaleDB if I had PG10. Obviously PG10 doesn't offer the chunking, and it doesn't offer automation of the partitions that TimescaleDB does, and it degrades under number of partitions (which is bound to grow with time series data of course).
[EDIT] - Ignore the sentence immediately below this edit - write performance is the graphed metric in the article. Sentence left in for posterity. Turns out PG10 writes degrade horribly as partition size increases.
They did not graph write speed in the article though, which was a bit disappointing, so I assume the difference was negligible (in the end, you are writing with postgres to multiple chunks/partitions, no matter how efficiently/automatically they were created, so it's probably the same).
I've been itching to use TimescaleDB for a while, really glad to see it get exposure like this -- I'm just about ready to go all in on it, I already love Postgres and TimescaleDB means now I can do more awesome things with Postgres.
I'd like to hear the profit model of the company though -- how does TimescaleDB plan to make money?
[0]: https://blog.timescale.com/time-series-data-postgresql-10-vs...
Did you mean query performance? There are write speed/insert numbers under "Insert performance measurement graphs"
I'm surprised PG10 tanked so fast...
[0]: https://www.postgresql.org/docs/current/static/ddl-partition...
[1]: https://www.postgresql.org/docs/current/static/ddl-partition...