J'ai une machine virtuelle (Debian) exécutée sur un hôte de machine physique. La machine virtuelle agit comme un tampon pour les données qu'elle reçoit fréquemment sur le réseau local (la période pour ces données est de 0,5 s, donc un débit assez élevé). Toutes les données reçues sont stockées sur la machine virtuelle et transmises à plusieurs reprises à un serveur externe via UDP. Une fois que le serveur externe reconnaît (via UDP) qu'il a reçu un paquet de données, les données d'origine sont supprimées de la machine virtuelle et ne sont plus envoyées au serveur externe. La connexion Internet qui connecte la machine virtuelle et le serveur externe n'est pas fiable, ce qui signifie qu'elle peut être interrompue pendant plusieurs jours.
La machine physique qui héberge la machine virtuelle obtient sa coupure de courant plusieurs fois par jour au hasard. Il n'y a aucun moyen de savoir quand cela est sur le point de se produire et il n'est pas possible d'ajouter un onduleur, une batterie ou une solution similaire au système.
À l'origine, les données étaient stockées sur une base de données HSQLDB basée sur des fichiers sur la machine virtuelle. Cependant, les coupures de courant fréquentes finissent par endommager le fichier de script de base de données (pas au niveau du système de fichiers, c'est-à-dire qu'il est lisible, mais HSQLDB ne peut pas le comprendre), ce qui conduit à ma question:
Comment les données doivent-elles être stockées dans un environnement où les coupures de courant peuvent et se produisent fréquemment?
Une option à laquelle je peux penser est d'utiliser des fichiers plats, en enregistrant chaque paquet de données en tant que fichier sur le système de fichiers. De cette façon, si un fichier est corrompu en raison d'une perte d'alimentation, il peut être ignoré et le reste des données reste intact. Cela pose cependant quelques problèmes, principalement liés à la quantité de données susceptibles d'être stockées sur la machine virtuelle. À 0,5 s entre chaque donnée, 1 728 000 fichiers seront générés en 10 jours. Cela signifie au moins utiliser un système de fichiers avec un nombre accru d'inodes pour stocker ces données (la configuration actuelle du système de fichiers a manqué d'inodes à ~ 250 000 messages et 30% d'espace disque utilisé). De plus, c'est difficile (pas impossible) à gérer.
Il y a-t-il des alternatives? Existe-t-il des moteurs de base de données fonctionnant sur Debian qui ne seraient pas corrompus par des coupures de courant? De plus, quel système de fichiers doit être utilisé pour cela? ext3 est ce qui est utilisé actuellement.
Le logiciel qui s'exécute sur la machine virtuelle est écrit en utilisant Java 6, donc j'espère que la solution ne serait pas incompatible.
la source
Réponses:
Honnêtement, votre meilleure approche consiste à réparer les coupures de courant ou à déployer un système différent dans un meilleur emplacement.
Oui, il existe des systèmes tels que redis qui stockent les données dans un journal à ajouter uniquement pour la relecture, mais vous risquez la corruption à des niveaux inférieurs - par exemple, si votre système de fichiers est brouillé, les données sur le disque sont potentiellement à risque.
J'apprécie que toute amélioration vous soit utile, mais en réalité, le problème ne peut pas être résolu compte tenu du scénario que vous avez décrit.
la source
Votre approche peut fonctionner. Permettez-moi de suggérer quelques améliorations. Il y avait une question de débordement de pile lors de l'écriture atomique dans un fichier . Essentiellement, vous enregistrez chaque paquet de données dans un fichier temporaire, puis vous le renommez en son nom final. Le changement de nom est une opération atomique qui sera à l'abri des pannes de courant. De cette façon, vous êtes assuré que tous vos fichiers dans votre destination finale ont été enregistrés correctement sans corruption.
Ensuite, ce que vous pouvez faire pour résoudre le problème d'avoir des millions de fichiers. Est-ce que cron est un travail qui s'exécute peut-être toutes les heures, qui prend tous les fichiers plus d'une heure et les combine en un seul gros fichier en utilisant à nouveau les opérations de fichiers atomiques afin que ce travail s'exécute en toute sécurité même lors d'une panne de courant, puis supprime les anciens fichiers. Un peu comme la rotation du journal. Une heure de fichiers équivaut à environ 7 200 fichiers. Donc, à tout moment, vous ne devriez pas avoir plus de 20 000 fichiers sur le disque.
la source
Vous installez un onduleur ou une carte RAID avec un cache d'écriture alimenté par batterie sur le système, et pour aussi peu que 49,95 $ , vous accomplissez ce qui est tout simplement impossible à accomplir dans le logiciel seul.
Votre affirmation selon laquelle il n'est pas possible de connecter ce serveur à un onduleur ou à une batterie ... n'est tout simplement pas crédible.
la source
My PHB won't let me hook this up to a UPS/battery
est une chose très différente deit is not possible to add a UPS, a battery, or a similar solution to the system.
Ne pas devenir trop pédant, mais c'est une distinction importante car elle change l'approche et les solutions disponibles.Montez l'ensemble du système en lecture seule, à l'exception d'un périphérique bloc qui stocke toutes vos données. Utilisez ce périphérique de bloc directement et implémentez votre propre mécanisme de stockage de données à l'aide de ce périphérique de bloc brut.
la source