У меня есть виртуальная машина (Debian), работающая на хосте физической машины. Виртуальная машина выступает в качестве буфера для данных, которые она часто получает по локальной сети (период для этих данных составляет 0,5 с, поэтому довольно высокая пропускная способность). Все полученные данные хранятся на виртуальной машине и многократно пересылаются на внешний сервер по UDP. Как только внешний сервер подтверждает (через UDP), что он получил пакет данных, исходные данные удаляются с виртуальной машины и больше не отправляются на внешний сервер. Интернет-соединение, которое соединяет виртуальную машину и внешний сервер, ненадежно, то есть оно может быть разорвано на несколько дней.
Физическая машина, на которой размещена виртуальная машина, отключается несколько раз в день наугад. Невозможно определить, когда это произойдет, и невозможно добавить ИБП, батарею или подобное решение в систему.
Первоначально данные хранились в файловой базе данных HSQLDB на виртуальной машине. Однако частые отключения питания в конечном итоге приводят к повреждению файла сценария базы данных (не на уровне файловой системы, то есть он доступен для чтения, но HSQLDB не может это понять), что приводит к моему вопросу:
Как следует хранить данные в среде, где отключение питания может происходить и происходит часто?
Один из вариантов, который я могу придумать, - использовать плоские файлы, сохраняя каждый пакет данных в виде файла в файловой системе. Таким образом, если файл поврежден из-за потери питания, его можно игнорировать, а остальные данные остаются нетронутыми. Однако это создает несколько проблем, в основном связанных с объемом данных, которые могут храниться на виртуальной машине. Через 0,5 с между каждым фрагментом данных за 10 дней будет сгенерировано 1 728 000 файлов. По крайней мере, это означает использование файловой системы с увеличенным числом инодов для хранения этих данных (в текущей настройке файловой системы исчерпаны иноды с ~ 250 000 сообщений и 30% используемого дискового пространства). Кроме того, это трудно (не невозможно) управлять.
Есть ли другие варианты? Существуют ли движки баз данных, работающие на Debian, которые не будут повреждены отключениями питания? Кроме того, какую файловую систему следует использовать для этого? ext3 - это то, что используется в данный момент.
Программное обеспечение, работающее на виртуальной машине, написано с использованием Java 6, поэтому, надеюсь, решение не будет несовместимым.
источник
Ответы:
Честно говоря, ваш лучший подход здесь - это либо исправить отключение электроэнергии, либо развернуть другую систему в лучшем месте.
Да, есть такие системы, как redis, которые будут хранить данные в журнале только для добавления для воспроизведения, но вы рискуете повредить их на более низких уровнях - например, если ваша файловая система зашифрована, то данные на диске потенциально находятся под угрозой.
Я ценю, что любое улучшение было бы полезно для вас, но на самом деле проблема не та, которая может быть решена с учетом сценария, который вы обрисовали.
источник
Ваш подход может работать. Позвольте мне предложить некоторые улучшения к нему. Возник вопрос о переполнении стека при атомарной записи в файл . По сути, вы сохраняете каждый пакет данных во временный файл, а затем переименовываете его в окончательное имя. Переименование - это атомарная операция, которая будет защищена от сбоев питания. Таким образом вы гарантируете, что все ваши файлы в вашем конечном месте были сохранены правильно, без повреждения.
Тогда что вы можете сделать, чтобы справиться с проблемой наличия миллионов файлов. Является ли cron заданием, которое запускается, может быть, каждый час, и занимает все файлы старше часа и объединяет их в один большой файл, снова используя атомарные операции с файлами, так что это задание выполняется безопасно даже при сбоях питания, а затем удаляет старые файлы. Вроде как ротация бревен. Часовая стоимость файлов составит около 7200 файлов. Поэтому в любой момент времени на диске не должно быть более 20 000 файлов.
источник
Вы устанавливаете в систему ИБП или карту RAID с кэш-памятью с резервным питанием от батареи, и всего за 49,95 долл. США вы достигаете того, что просто невозможно сделать только программным обеспечением.
Ваше утверждение, что каким-то образом невозможно подключить этот сервер к ИБП или батарее ... просто неправдоподобно.
источник
My PHB won't let me hook this up to a UPS/battery
- это совсем не то, чтоit is not possible to add a UPS, a battery, or a similar solution to the system.
не слишком педантично, но это важное различие, потому что оно меняет подход и доступные решения.Монтируйте всю систему только для чтения, за исключением блочного устройства, в котором хранятся все ваши данные. Используйте это блочное устройство напрямую и реализуйте свой собственный механизм хранения данных, используя это необработанное блочное устройство.
источник