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.properties
kann accessible=false
als Standard, ist aber außer Kraft gesetzt in searchengine.properties
mitaccessible=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.
Antworten:
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.
quelle
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.
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:
Im Inneren
londonsettings.properties
könnten Sie einen Wert haben wie:Dies ermöglicht mehr oder zusätzliche Freiheitsgrade.
quelle
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.
quelle
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
quelle
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.
quelle