Я использую RRDtool для хранения данных для отображения графиков. Я обновляю RRD с помощью RRDs :: update, и это не удается при попытке переписать информацию, что означает обновление данных за какое-то время в прошлом (например, кто-то переместил системный таймер назад). Я получаю следующую ошибку:
ERROR: Cannot update /opt/dashboard/rrd/Disk/192.168.120.168_disk_1.rrd with
'1228032301:24:24' illegal attempt to update using time 1228032301 when last
update time is 1228050001 (minimum one second step)
Я хочу всегда разрешать перезапись, как я могу это сделать?





Согласно документации RRD, номер отметки времени должен увеличивается с каждым обновлением. Учитывая ваши ограничения, я бы изменил вашу процедуру обновления, чтобы в случае сбоя обновления вы перехватили исключение и повторили обновление с полем времени, установленным на «N». Это заставит RRDtool использовать текущее время в качестве времени обновления.
В качестве альтернативы, если вы не хотите иметь дело с кодом перехвата и повторения, просто измените код обновления, чтобы всегда использовать «N» в качестве значения времени - тогда обновление всегда будет работать.
Может быть полезно просмотреть документацию по RRDtool команда обновления.
rrdtool не записывает ваши данные в файл rrd. Он скорее пробует то, что вы вводите, а затем сохраняет полученные в результате точки данных. Таким образом, предоставление «старых данных» для обновления rrdtool не будет работать таким же образом, поскольку вы не можете легко вернуться к звуковой записи, чтобы «исправить» несколько плохих заметок.
Очевидно, есть способы изменить старые данные, способ сделать это в rrdtool - это «сбросить» файл rrd в xml, изменить содержимое и «восстановить» его. Не то, что хотелось бы делать на регулярной основе.
В таких ситуациях я использую следующий скрипт:
#!/bin/sh
rrdtool dump "$1" | perl -ne 'BEGIN {$t=`date +%s`; chomp($t);} $a=$_; if ($a =~ /lastupdate.\d+..lastupdate/) { $a =~ s/(lastupdate.)\d+(..lastupdate)/$1$t$2/; } print $a' | rrdtool restore -f - "$1"
Это немного ... странно, но другого автоматического решения я не нашел.