Best Practices für den Umgang mit einer großen Anzahl strukturierter Konfigurations- / Eigenschaftendateien

15

Stellen Sie sich ein System mit einer großen Anzahl von Servern vor. Jeder von ihnen hat eine Reihe von Einstellungen:

  • Einige spezifisch für den Server
  • Einige spezifisch für die Region
  • Einige, die allen gemeinsam sind
  • Möglicherweise können Sie einige benutzerdefinierte Gruppierungen festlegen, da diese Servergruppe nur zum Lesen bestimmt ist
  • etc.

Die derzeitige Praxis, die ich vor Augen habe, ist eine einfache Eigenschaftsstruktur mit übergeordneten Fähigkeiten.

Nehmen wir zum Zweck des Beispiels die Google-Server. Jeder von ihnen hat eine Liste der zu ladenden Einstellungen.

Beispielsweise kann der Londoner Server Folgendes haben:

rootsettings.properties, europesettings.properties, londonsettings.properties, searchengine.properties, Usw.

Wenn jede Datei eine Reihe von Eigenschaften enthält und Sie mit der Ladereihenfolge Eigenschaften überschreiben können, müssen Sie weitere Schritte ausführen.

Zum Beispiel: rootsettings.propertieskann accessible=falseals Standard, ist aber außer Kraft gesetzt in searchengine.propertiesmitaccessible=true


Das Problem, das ich mit dieser Struktur habe, ist, dass es sehr leicht ist, außer Kontrolle zu geraten. Es ist überhaupt nicht strukturiert, dh Sie können jede Eigenschaft auf jeder Ebene definieren und viele Elemente können veraltet sein.

Außerdem wird das Ändern einer mittleren Ebene unmöglich, wenn das Netzwerk wächst, da Sie jetzt eine sehr große Anzahl von Servern betreffen.

Zu guter Letzt benötigt jede einzelne Instanz möglicherweise eine spezielle Eigenschaft, was bedeutet, dass Ihr Baum sowieso eine Konfiguration für jeden Server hat, was die Lösung nicht optimal macht.

Ich würde mich sehr freuen, wenn Sie Vorschläge / Ideen für eine bessere Konfigurationsmanagement-Architektur haben.

SDekov
quelle
1
Als Erstes müssen alle beim Start geladenen Eigenschaften protokolliert werden. Zumindest kennen Sie den verwendeten Wert.
Walfrat
@Stoyan, suchen Sie nach Ansätzen für "Softwarekonfiguration" oder "Serverkonfiguration"?
Yusubov
Verrückte Idee, wenn auch nicht sehr gut: Hat jemand ein "CSS-ähnliches" System für so etwas verwendet? Anstatt (oder zusätzlich zu) den Dateinamen, die strukturiert werden, sind die Daten in ihnen.
user949300
Ich baue ein auf CSS-ähnlichen Regeln basierendes zentrales Konfigurationsmanagementsystem auf. Es ist kostenlos und Open Source. Siehe meine Antwort unten für weitere Details.
Bikeman868
scheint mir eine vernünftige Herangehensweise zu sein.
Dagnelies

Antworten:

5

Ich denke, Sie müssen sich zuerst einige Fragen stellen und einige Punkte klären, dann können Sie besser entscheiden, wie Sie Ihr Problem lösen.

Erstens: Wer soll die Kontrolle über die Server haben?

  • Ist es ein einzelner Administrator, der Hunderte von Servern kontrollieren wird? Dann müssen Sie die Konfiguration so weit wie möglich zentralisieren.

  • Oder ist jeder Server möglicherweise unter der Kontrolle eines einzelnen Administrators, der nicht möchte, dass seine Einstellungen durch eine zentrale Konfiguration außer Kraft gesetzt oder gesteuert werden? Dann sollten Sie sich auf die dezentrale Konfiguration konzentrieren. Wenn jeder Administrator über eine Handvoll Server verfügt, die maximal verwaltet werden können, kann dies immer noch manuell verwaltet werden.

Zweitens: Brauchen Sie wirklich unzählige Konfigurationsoptionen, oder können Sie die Anzahl auf einige beschränken? Anstatt alles "für alle Fälle" konfigurierbar zu machen, sollten Sie sich besser auf die Optionen beschränken, die Ihr System wirklich benötigt. Dies kann beispielsweise erfolgen durch

  • Machen Sie Ihre Software ein bisschen schlauer (zum Beispiel, was kann das Programm automatisch bestimmen, indem es die Umgebung fragt)?

  • Festes Befolgen von "Konventionen über Konfigurationen" - beispielsweise durch Festlegen bestimmter Namenskonventionen oder durch Ableiten einiger Optionen als Standard aus anderen Optionen

Drittens: Wollen Sie wirklich eine hierarchische Konfigurationsebene, die fest in die Software eingebunden ist? Stellen Sie sich vor, Sie wissen vorher nicht, wie viele Server es geben wird, ob eine baumartige Hierarchie wirklich die beste Struktur für sie ist oder wie viele Ebenen der Baum haben muss. Die einfachste Lösung, die ich mir vorstellen kann, besteht darin, überhaupt keine zentralisierte Konfiguration bereitzustellen, sondern nur eine Konfigurationsdatei pro Server, und die verantwortlichen Serveradministratoren selbst zu entscheiden, wie sie das Problem der Verwaltung der Konfigurationen mehrerer Server lösen.

Zum Beispiel könnten die Administratoren Generatorskripte schreiben, die eine zentrale Konfigurationsdatei an eine Gruppe verschiedener Server verteilen und an jeder Kopie geringfügige Änderungen vornehmen. Auf diese Weise müssen Sie im Voraus keine Annahmen über die "Serververteilungstopologie" treffen, die Topologie kann jederzeit an die Anforderungen der realen Welt angepasst werden. Der Nachteil ist, dass Sie Administratoren benötigen, die sich mit dem Schreiben von Skripten in einer Sprache wie Perl, Python, Bash oder Powershell auskennen.

Doc Brown
quelle
Auch wenn dies keine direkte Lösung bietet, ist es am sinnvollsten, mit einer Situation umzugehen, die sich bereits verschlechtert hat. Insbesondere , um Ihre Software ein bisschen schlauer zu machen .
SDekov
2

Ich persönlich mochte die Vererbung von Konfigurationsdateien nie. Sie erwähnen eine Ladereihenfolge, nicht sicher, wie diese definiert oder abgeleitet ist. Vielleicht hilft es, die Reihenfolge zu verdeutlichen, indem Sie sie in eine Verzeichnisstruktur spiegeln, in die Sie die Dateien eingefügt haben, oder indem Sie sie in die Dateinamen aufnehmen.

rootsettings.properties
rootsettings.eurosettings.properties
rootsettings.eurosettings.londonsettings.properties

Dies funktioniert bis zu einem Punkt, an dem Sie eine Ansammlung von Konfigurationswerten haben, die nicht an einer Region ausgerichtet sind. Sie müssen also die organisatorische Achse berücksichtigen, die Sie auswählen.

Was ich mehr mag, ist das Isolieren von Aggregaten von Konfigurationswerten in ihre eigenen Dateien und das Zeigen einer (Blatt-) Konfigurationsdatei auf eine.

Ein Beispiel:

bigcity.searchsettings.properties
regional.searchsettings.properties

Im Inneren londonsettings.propertieskönnten Sie einen Wert haben wie:

searchsettings:bigcity.searchsettings.properties

Dies ermöglicht mehr oder zusätzliche Freiheitsgrade.

Joppe
quelle
2

Ich hatte das gleiche Problem und Open Source meine Lösung. Den Quellcode finden Sie hier https://github.com/Bikeman868/Urchin

Ich verwende es für ein großes System mit vielen Servern, mit mehreren Anwendungen auf jedem Server und mehreren Umgebungen. Es enthält eine in Dart geschriebene Benutzeroberfläche zum Verwalten der Konfiguration.

Sie können mich direkt kontaktieren, wenn Sie Hilfe benötigen.

Die Lösung, die ich implementiert habe, basiert auf Regeln. Sie beginnen im Allgemeinen mit einer Regel, die für alle Konfigurationen gilt. Anschließend können Sie Regeln wie "Alle Computer in dieser Umgebung erstellen Protokolldateien für diesen UNC-Pfad" hinzufügen. Die Regeln können für eine Umgebung, eine Anwendung, eine Maschine oder eine Instanz einer Anwendung spezifisch sein. Regeln können auch spezifischer sein, da sie nur in dieser bestimmten Instanz dieser Anwendung auf diesem bestimmten Server ausgeführt werden.

Regeln werden in der Reihenfolge der am wenigsten spezifischen Regeln angewendet, und spätere Regeln können die in früheren Regeln angegebenen Werte überschreiben. So können Sie beispielsweise eine Regel erstellen, die für eine bestimmte Anwendung gilt, und diese dann mit einem anderen Wert für einen bestimmten Computer oder eine bestimmte Instanz der Anwendung überschreiben.

Der Server verfügt über eine REST + JSON-Schnittstelle und funktioniert daher mit den meisten Entwicklungssystemen. Außerdem verfügt er über eine praktische Clientbibliothek für .NET-Anwendungen.

bikeman868
quelle
1

Diese Einstellungen sind ein Albtraum. Es ist am besten, sie so weit wie möglich zu reduzieren, indem Sie Ihre Softwarekomponenten alle Fälle behandeln lassen.

Das heißt, anstatt einen API-Server für eine Region einzurichten, übergeben Sie die Region mit dem API-Aufruf und lassen Sie alle Regionen von einem einzelnen Server einrichten.

Wenn Sie sich jedoch in dem Status befinden, in dem Sie sich befinden, würde ich davon abraten, ein System zum Generieren von Konfigurationseinstellungen einzurichten. Es erhöht nur die Komplexität eines bereits komplexen Problems.

Speichern Sie stattdessen die Einstellungen in Ihrem Bereitstellungstool nach Servertyp. (Octopus-Bereitstellungseinstellungen, TeamCity-Dateischreibvorgänge usw.) Auf diese Weise können Sie sicher sein, dass Sie die gleichen Konfigurationseinstellungen bereitstellen, die Sie zuletzt beim Upgrade der Software vorgenommen haben, und die Änderungen genau steuern.

Sie möchten nicht in der Situation sein, in der Sie Änderungen an Ihren Meta-Konfigurationsdateien vornehmen und dann testen müssen, welche Konfigurationsdatei in Ihren verschiedenen Regionen / Servern / benutzerdefinierten Gruppierungen erstellt wird

Ewan
quelle
0

Keine Forschung; Alle persönliche Meinung, 30+ IT-Erfahrung. Klingt nach einer komplizierten Datenstruktur, die sich bei einer großen Anzahl von Benutzern schnell ändern / modifizieren lässt.

Betrachten Sie ein Datenbank-Repository (z. B. SQL) zum Strukturieren der Daten mit benutzerdefinierten Extraktionsprozessen, die individuelle Konfigurationsdateien für jeden Benutzer erstellen. Sie können eine Abfrage der Datenbank verwenden, um die Auswirkungen einer Änderung zu ermitteln, bevor sie implementiert wird. finden Sie doppelte Vorkommen, etc .. Einzelne Flatfiles sind Teil des Problems. Außerdem können Sie Änderungsprotokolle und Unterstützung für die Wiederherstellung / Wiederherstellung erhalten. Mit der Datenbanksteuerung können Sie möglicherweise das Problem der Konfigurationsvererbung beseitigen. Diese Art von Lösung erfordert eine zusätzliche Datenbankstruktur. Die richtige zusammengesetzte Tastenstruktur ist sehr wichtig.

Das ist mein Vorschlag.

Möglicherweise untersuchen Sie einige sehr teure Systemsicherheits- und -kontrollsysteme von Anbietern, die diese Art von Service implementieren. Betrachten Sie sie. Im Allgemeinen sind sie umweltabhängig.

just.a.guy
quelle