2015-01-16 5 views

Antwort

17

Es gibt 4 Felder (source):

  • inode
  • Hauptgerätenummer
  • minor Gerätenummer
  • Byteversatz

Unter der Annahme, dass eine Festplatte in Tausende von sehr kleinen Teilen mit einer Nummer für jeden einzelnen segmentiert würde, wäre der Inode mehr oder weniger wie die Nummer des winzigen Teils, wo die Datei beginnt. Daher ist ein gegebener Inode für jede Festplatte eindeutig, aber um Fälle zu behandeln, in denen mehrere Platten auf demselben Server vorhanden sind, ist die Verwendung von Major- und Minor-Gerätenummern erforderlich, um die Eindeutigkeit des Triplets {Inode, Minor Device Number, Geringere Gerätenummer}. Genauere Informationen über Inoden unter Wikipedia.

Ich bin nicht so sicher, dass (zum Beispiel) Dateien, die über NFS gemountet wurden, nicht mit lokalen Dateien kollidieren konnten, da der Inode einer Datei, die über NFS gemountet wurde, die Remote ist. Auch wenn ich nicht glaube, dass der Plugin-Schreiber sich über solche Fälle Gedanken gemacht hat, und trotz der Tatsache, dass ich NFS selbst benutzt habe, ist es bis jetzt nie in Schwierigkeiten geraten. Ich vermute auch, dass die Kollisionswahrscheinlichkeit sehr klein ist.

Jetzt mit dem Triplet aus Inode und Major und Minor Gerätenummer haben wir eine Möglichkeit, die einzelne Protokolldatei, die von dem Plugin gelesen wird, ohne Fehler (oder zumindest das war die ursprüngliche Absicht). Die letzte Zahl, der Byte-Offset, verfolgt, wie weit die Eingangsprotokolldatei bereits gelesen und an Logstash ausgegeben wurde. In einigen speziellen Architekturen wie Solaris oder Windows gab es Fehler mit Ruby, die die Inode-Nummer, die gleich 0 war, falsch erkannte. Dies könnte zum Beispiel zu Problemen führen, wie Logstash eine Datei-Rotation nicht erkennt.

+0

Warum beschreiben Sie nicht alle 4 Felder in Ihrer Selbstantwort und vielleicht mit mehr Autorität? –

+0

Ich gebe nur seltene Informationen, die bereits schwer zu sammeln waren. Mein Zweck war nicht, einen Wikipedia-Artikel zu beginnen. Wie auch immer, du hast mir klar gemacht, dass "Byte Offset" nicht für jeden offensichtlich ist, also habe ich ein paar weitere Informationen hinzugefügt. – Aldian

2

Dies war sehr hilfreich. Ich wollte alle meine SinceDB-Dateien den logstash-Eingaben zuordnen, also habe ich einen kleinen Bash-Zweiliner zusammengestellt, um diese Zuordnung zu drucken.

filesystems=$(grep path /etc/logstash/conf.d/*.conf | awk -F'=>' '{ print $2 }' | xargs -I {} df -P {} 2>/dev/null | grep -v Filesystem | sort | uniq | cut -d' ' -f 1) 
for fs in $filesystems; do for f in $(ls -a .sincedb_*); do echo $f; inodes=$(cut -d' ' -f 1 $f); for inode in $inodes; do sudo debugfs -R "ncheck $inode" $fs 2>/dev/null | grep -v Inode | cut -f 2; done; echo; done; done 

Ich habe gerade die Details über mapping SinceDB files to logstash input dokumentiert.