Hi,
We have been running InfluxDB in production now for about two weeks and have noticed something very worrying: aggregated data (i.e. generated using SELECT … INTO) seems to be disappearing.
This is a fairly long post but I crave your indulgence …
We are running Influx version 1.2.2 on Ubuntu 16.04 LTS inside VMware ESXi 6.0.0.
Raw measurements are received in batches from devices out in the field, roughly once every 5 minutes, each batch contains data points collected at one-minute intervals. (I.E. each device uploads its data roughly every 5 minutes, but across our entire set of devices the database is being updated continuously.) This data is loaded into one database “solarmon” which was created with the default retention policy and shard duration.
Aggregated data is calculated on 5- and 30-minute intervals and loaded into databases “solarmon_5min” and “solarmon_30min” respecitively, both of these have default retention policy and a shard duration of 90 days. (I set that duration because an earlier comment seen on this forum suggested that for long-lived data the shards should be larger.) The aggregated data is calculated using a simple but brutal SELECT … INTO, e.g. for the 5-minute aggregate:
SELECT mean(*) as avg, max(*), min(*) INTO "solarmon_5min".."$measurement" FROM $measurement WHERE __devhash='$devhash' AND time>=${start}s AND time<${end}s GROUP BY time(5m),*
(The code is Perl and appropriate substitutions take place before the SELECT is sent to Influx.)
Prior to going live I ran some scripts to load the various measurements from our Postgres database and calculated the aggregates, and this all seemed to work nicely.
A day or two before we went live, the system disk filled up (for other reasons) but no data was being added to Influx and everything still looked OK. We went live and for the next week or so everything worked as expected. But a week ago the server stalled and had to be rebooted (twice), and ever since then it’s behaved oddly.
In the week since then we noticed that 3 months of aggregated data had gone missing for most devices. The missing aggregates exactly match the 90-day shard duration I set up for those databases.
Then we noticed that for many devices up to two weeks raw data was lost also.
The raw data in most cases could be reloaded from the monitoring devices and in the end we have lost only one day’s data for most devices, which is annoying but not the end of the world.
I wrote a script to recalculate the lost aggregated data, and this is where things get “interesting”. The script looks at the number of raw measurements logged for each device for each day, and compares this to the count of aggregated measurements for each day for that device. If the aggregated count is deficient it recalculates the aggregated data for that day for the device. I ran this script to look at all devices and it seemed to work.
But then we started getting reports from users that the aggregated data was missing again.
I am fairly confident that the raw measurements which were initially lost all belonged to the same pair of shards for that database, and the aggregated measurements which continue to be lost are all in one shard for their respective databases:
> show shards
...
name: solarmon
id database retention_policy shard_group start_time end_time expiry_time owners
-- -------- ---------------- ----------- ---------- -------- ----------- ------
613 solarmon autogen 613 2011-09-12T00:00:00Z 2011-09-19T00:00:00Z 2011-09-19T00:00:00Z
349 solarmon autogen 349 2013-04-29T00:00:00Z 2013-05-06T00:00:00Z 2013-05-06T00:00:00Z
...
596 solarmon autogen 596 2017-05-01T00:00:00Z 2017-05-08T00:00:00Z 2017-05-08T00:00:00Z
597 solarmon autogen 597 2017-05-08T00:00:00Z 2017-05-15T00:00:00Z 2017-05-15T00:00:00Z
601 solarmon autogen 601 2017-05-15T00:00:00Z 2017-05-22T00:00:00Z 2017-05-22T00:00:00Z
619 solarmon autogen 619 2017-05-22T00:00:00Z 2017-05-29T00:00:00Z 2017-05-29T00:00:00Z
605 solarmon autogen 605 2017-05-29T00:00:00Z 2017-06-05T00:00:00Z 2017-06-05T00:00:00Z
604 solarmon autogen 604 2017-09-18T00:00:00Z 2017-09-25T00:00:00Z 2017-09-25T00:00:00Z
603 solarmon autogen 603 2017-10-09T00:00:00Z 2017-10-16T00:00:00Z 2017-10-16T00:00:00Z
name: solarmon_5min
id database retention_policy shard_group start_time end_time expiry_time owners
-- -------- ---------------- ----------- ---------- -------- ----------- ------
615 solarmon_5min autogen 615 2011-06-23T00:00:00Z 2011-09-21T00:00:00Z 2011-09-21T00:00:00Z
360 solarmon_5min autogen 360 2013-03-14T00:00:00Z 2013-06-12T00:00:00Z 2013-06-12T00:00:00Z
361 solarmon_5min autogen 361 2013-06-12T00:00:00Z 2013-09-10T00:00:00Z 2013-09-10T00:00:00Z
379 solarmon_5min autogen 379 2013-09-10T00:00:00Z 2013-12-09T00:00:00Z 2013-12-09T00:00:00Z
389 solarmon_5min autogen 389 2013-12-09T00:00:00Z 2014-03-09T00:00:00Z 2014-03-09T00:00:00Z
404 solarmon_5min autogen 404 2014-03-09T00:00:00Z 2014-06-07T00:00:00Z 2014-06-07T00:00:00Z
419 solarmon_5min autogen 419 2014-06-07T00:00:00Z 2014-09-05T00:00:00Z 2014-09-05T00:00:00Z
433 solarmon_5min autogen 433 2014-09-05T00:00:00Z 2014-12-04T00:00:00Z 2014-12-04T00:00:00Z
448 solarmon_5min autogen 448 2014-12-04T00:00:00Z 2015-03-04T00:00:00Z 2015-03-04T00:00:00Z
464 solarmon_5min autogen 464 2015-03-04T00:00:00Z 2015-06-02T00:00:00Z 2015-06-02T00:00:00Z
479 solarmon_5min autogen 479 2015-06-02T00:00:00Z 2015-08-31T00:00:00Z 2015-08-31T00:00:00Z
494 solarmon_5min autogen 494 2015-08-31T00:00:00Z 2015-11-29T00:00:00Z 2015-11-29T00:00:00Z
508 solarmon_5min autogen 508 2015-11-29T00:00:00Z 2016-02-27T00:00:00Z 2016-02-27T00:00:00Z
524 solarmon_5min autogen 524 2016-02-27T00:00:00Z 2016-05-27T00:00:00Z 2016-05-27T00:00:00Z
539 solarmon_5min autogen 539 2016-05-27T00:00:00Z 2016-08-25T00:00:00Z 2016-08-25T00:00:00Z
555 solarmon_5min autogen 555 2016-08-25T00:00:00Z 2016-11-23T00:00:00Z 2016-11-23T00:00:00Z
570 solarmon_5min autogen 570 2016-11-23T00:00:00Z 2017-02-21T00:00:00Z 2017-02-21T00:00:00Z
586 solarmon_5min autogen 586 2017-02-21T00:00:00Z 2017-05-22T00:00:00Z 2017-05-22T00:00:00Z
609 solarmon_5min autogen 609 2017-05-22T00:00:00Z 2017-08-20T00:00:00Z 2017-08-20T00:00:00Z
607 solarmon_5min autogen 607 2017-08-20T00:00:00Z 2017-11-18T00:00:00Z 2017-11-18T00:00:00Z
name: solarmon_30min
id database retention_policy shard_group start_time end_time expiry_time owners
-- -------- ---------------- ----------- ---------- -------- ----------- ------
614 solarmon_30min autogen 614 2011-06-23T00:00:00Z 2011-09-21T00:00:00Z 2011-09-21T00:00:00Z
358 solarmon_30min autogen 358 2013-03-14T00:00:00Z 2013-06-12T00:00:00Z 2013-06-12T00:00:00Z
359 solarmon_30min autogen 359 2013-06-12T00:00:00Z 2013-09-10T00:00:00Z 2013-09-10T00:00:00Z
378 solarmon_30min autogen 378 2013-09-10T00:00:00Z 2013-12-09T00:00:00Z 2013-12-09T00:00:00Z
388 solarmon_30min autogen 388 2013-12-09T00:00:00Z 2014-03-09T00:00:00Z 2014-03-09T00:00:00Z
403 solarmon_30min autogen 403 2014-03-09T00:00:00Z 2014-06-07T00:00:00Z 2014-06-07T00:00:00Z
418 solarmon_30min autogen 418 2014-06-07T00:00:00Z 2014-09-05T00:00:00Z 2014-09-05T00:00:00Z
432 solarmon_30min autogen 432 2014-09-05T00:00:00Z 2014-12-04T00:00:00Z 2014-12-04T00:00:00Z
447 solarmon_30min autogen 447 2014-12-04T00:00:00Z 2015-03-04T00:00:00Z 2015-03-04T00:00:00Z
463 solarmon_30min autogen 463 2015-03-04T00:00:00Z 2015-06-02T00:00:00Z 2015-06-02T00:00:00Z
478 solarmon_30min autogen 478 2015-06-02T00:00:00Z 2015-08-31T00:00:00Z 2015-08-31T00:00:00Z
493 solarmon_30min autogen 493 2015-08-31T00:00:00Z 2015-11-29T00:00:00Z 2015-11-29T00:00:00Z
507 solarmon_30min autogen 507 2015-11-29T00:00:00Z 2016-02-27T00:00:00Z 2016-02-27T00:00:00Z
523 solarmon_30min autogen 523 2016-02-27T00:00:00Z 2016-05-27T00:00:00Z 2016-05-27T00:00:00Z
538 solarmon_30min autogen 538 2016-05-27T00:00:00Z 2016-08-25T00:00:00Z 2016-08-25T00:00:00Z
554 solarmon_30min autogen 554 2016-08-25T00:00:00Z 2016-11-23T00:00:00Z 2016-11-23T00:00:00Z
569 solarmon_30min autogen 569 2016-11-23T00:00:00Z 2017-02-21T00:00:00Z 2017-02-21T00:00:00Z
585 solarmon_30min autogen 585 2017-02-21T00:00:00Z 2017-05-22T00:00:00Z 2017-05-22T00:00:00Z
608 solarmon_30min autogen 608 2017-05-22T00:00:00Z 2017-08-20T00:00:00Z 2017-08-20T00:00:00Z
606 solarmon_30min autogen 606 2017-08-20T00:00:00Z 2017-11-18T00:00:00Z 2017-11-18T00:00:00Z
The shards in question are those covering the time period 2017-05-15T00:00:00Z - 2017-05-29T00:00:00Z for the “solarmon” (raw) database, and the time period 2017-05-22T00:00:00Z - 2017-08-20T00:00:00Z for the “solarmon_5min” and “solarmon_30min” (aggregated) databases.
All of which leads to the following questions and observations …
- The “disk full” condition occurred on 15h May which is at the start of one of the affected “solarmon” shards, and the “system rebooted” event happened on 26th & 27th May which is in the middle of the other affected “solarmon” shard. So I am wondering if these two conditions caused those shards to become corrupted in such a way that data continued to be written to them but then lost when the system was rebooted.
- Why does recalculating the historical aggregated data apparently cause the loss of other aggregated data which would be stored in the same shard? (You will notice that the shard ID for the date range 2017-05-22T00:00:00Z - 2017-08-20T00:00:00Z is out of sequence compared to the shard which follows it.) Should I instead simply delete this shard and recreate it from scratch by running my script over the required time range? (And if so, presumably I should shut down our application so that no other database updates are occurring at that time.) Would I get better results by making the shard duration shorter?
- Is there a tool to verify the database consistency i.e. its internal file organisation?
- You will notice that in the “solarmon” database the first shard is dated 2011-09-12 and its shard ID is out of sequence relative to the next 2013-04-29. This results from a bug in the monitoring devices whereby upon rebooting they sometimes get their system clocks reverting back to 12-Sep-2011 and log data with timestamps starting from that moment. This apparently causes the shard to be recreated … would I be correct in guessing that this is pathalogically bad for InfluxDB? (Measurements with those timestamps are of no value so we could probably ignore them anyway.)
Thanks,
Jeremy Begg