У меня есть виртуальная машина (Debian), работающая на хосте физической машины. Виртуальная машина выступает в качестве буфера для данных, которые она часто получает по локальной сети (период для этих данных составляет 0,5 с, поэтому довольно высокая пропускная способность). Все полученные данные хранятся на виртуальной машине и многократно пересылаются на внешний сервер по UDP. Как только внешний сервер подтверждает (через UDP), что он получил пакет данных, исходные данные удаляются с виртуальной машины и больше не отправляются на внешний сервер. Интернет-соединение, которое соединяет виртуальную машину и внешний сервер, ненадежно, то есть оно может быть разорвано на несколько дней.
Физическая машина, на которой размещена виртуальная машина, отключается несколько раз в день наугад. Невозможно определить, когда это произойдет, и невозможно добавить ИБП, батарею или подобное решение в систему.
Первоначально данные хранились в файловой базе данных HSQLDB на виртуальной машине. Однако частые отключения питания в конечном итоге приводят к повреждению файла сценария базы данных (не на уровне файловой системы, то есть он доступен для чтения, но HSQLDB не может это понять), что приводит к моему вопросу:
Как следует хранить данные в среде, где отключение питания может происходить и происходит часто?
Один из вариантов, который я могу придумать, - использовать плоские файлы, сохраняя каждый пакет данных в виде файла в файловой системе. Таким образом, если файл поврежден из-за потери питания, его можно игнорировать, а остальные данные остаются нетронутыми. Однако это создает несколько проблем, в основном связанных с объемом данных, которые могут храниться на виртуальной машине. Через 0,5 с между каждым фрагментом данных за 10 дней будет сгенерировано 1 728 000 файлов. По крайней мере, это означает использование файловой системы с увеличенным числом инодов для хранения этих данных (в текущей настройке файловой системы исчерпаны иноды с ~ 250 000 сообщений и 30% используемого дискового пространства). Кроме того, это трудно (не невозможно) управлять.
Есть ли другие варианты? Существуют ли движки баз данных, работающие на Debian, которые не будут повреждены отключениями питания? Кроме того, какую файловую систему следует использовать для этого? ext3 - это то, что используется в данный момент.
Программное обеспечение, работающее на виртуальной машине, написано с использованием Java 6, поэтому, надеюсь, решение не будет несовместимым.