2009-08-07 14 views
1

Eine einzelne Installation unseres Produkts speichert seine Konfiguration in einer Reihe von Datenbanktabellen.Wo Wie verteilte Konfigurationsdaten gespeichert werden

Keine der Installationen "weiß" über irgendeine andere Installation.

Es war schon immer üblich, dass Kunden mehrere Kopien unseres Produkts in verschiedenen geografisch weit voneinander entfernten Datenzentren installierten. Dies bedeutet, dass die Konfigurationsinformationen einmal erstellt und dann in andere Systeme exportiert werden müssen. Ein Teil der Konfiguration wird dann an die lokalen Bedingungen angepasst. z.B. Ändern von IP-Adressen usw. Dies ist ein klobiger, fehleranfälliger Ansatz.

Wir erhalten jetzt Anfragen für die Möglichkeit einer nahtloseren Strategie für die gemeinsame Nutzung globaler Daten, die jedoch lokale Änderungen erlaubt.

Ohne das lokale Änderungsbit könnten wir die Datenreplikationsfunktionen von Oracle verwenden.

Aufgrund der HA-Anforderungen ist die Konfiguration in der einen Datenbank keine Option.

Hat jemand anderes dieses Problem und haben Sie jemals eine gute programmatische Lösung dafür gefunden? Kennen Sie gute Papiere, die eine teilweise oder vollständige Lösung beschreiben könnten?

Wir sind * nix basiert und verwenden Oracle. Änderungen sollten ziemlich schnell auf alle Knoten repliziert werden (eine Sekunde oder 2).

Antwort

2

Ich bin mir nicht sicher, wie es Ihnen möglich ist, die Art und Weise zu ändern, wie Sie Ihre Konfiguration handhaben, aber wir haben etwas Ähnliches implementiert, indem wir lokale Überschreibungen verwenden. Insbesondere haben Sie zwei Konfigurationstabellen, die identisch sind (nennen Sie sie CentralConfig und LocalConfig). CentralConfig wird am zentralen Standort verwaltet und an Ihre Satellitenstandorte repliziert, wo es schreibgeschützt ist. LocalConfig kann am lokalen Standort eingerichtet werden. Ihre Prozedur, die Konfigurationsdaten abfragt, sucht zuerst nach den Daten in der LocalConfig-Tabelle und ruft sie, falls nicht gefunden, aus der CentralConfig-Tabelle ab.

Zum Beispiel, wenn Sie versuchen, dies in der v $ Parametertabelle mit den Werten zu tun, könnten Sie Ihre Konfiguration mit der FIRST_VALUE Funktion in SQL Analytik abfragen:

SELECT DISTINCT 
     NAME 
     , FIRST_VALUE(VALUE) OVER(PARTITION BY NAME 
            ORDER BY localsort 
           ) VALUE 
    FROM (SELECT t.* 
       , 0 localsort 
      FROM local_parameter t 
      UNION 
      SELECT t.* 
       , 1 localsort 
      FROM v$parameter t 
     ) 
ORDER BY NAME; 

Die localsort Spalt in den Gewerkschaften Stellen Sie nur sicher, dass die Parameter local_parameter Vorrang vor den v $ -Parameterwerten haben.

In unserem System ist es tatsächlich viel ausgeklügelter als das. Zusätzlich zu dem "Namen" für den Parameter, den Sie suchen, haben wir auch eine "Kontext" -Spalte, die den Kontext beschreibt, den wir suchen. Zum Beispiel haben wir vielleicht einen Parameter "timeout", der zentral gesetzt wird, aber selbst lokal haben wir mehrere Komponenten, die diesen Wert verwenden. Sie können alle gleich sein, aber wir können sie auch anders konfigurieren. Wenn das Tool den "Timeout" -Wert nachschlägt, wird es ebenfalls nach Bereich eingeschränkt. In der Konfiguration selbst können wir Platzhalter verwenden, wenn wir definieren, was wir für Umfang wollen, wie zum Beispiel:

CONTEXT  NAME VALUE 
------------- ------- ----- 
Comp Engine A timeout 15 
Comp Engine B timeout 10 
Comp Engine % timeout  5 
%    timeout 30 

Die Konfiguration oben sagt, für alle Komponenten, ein Timeout von 30 verwenden, aber für Comp Motoren jeder Art Verwenden Sie ein Timeout von 5, verwenden Sie jedoch für Comp Engines A & B 15 & 10.Die letzten beiden Konfigurationen können in CentralConfig beibehalten werden, aber die anderen beiden in LocalConfig beibehalten werden kann, und Sie würden die Einstellungen auf diese Weise beheben:

SELECT DISTINCT 
     NAME 
     , FIRST_VALUE(VALUE) OVER(PARTITION BY NAME 
            ORDER BY (TRANSLATE(Context 
                 , '%_' 
                 , CHR(1) || CHR(2) 
              ) DESC 
              , localsort 
           ) VALUE 
    FROM (SELECT t.* 
       , 0 localsort 
      FROM LocalConfig t 
      WHERE 'Comp Engine A' LIKE Context 
      UNION 
      SELECT t.* 
       , 1 localsort 
      FROM CentralConfig t 
      WHERE 'Comp Engine A' LIKE Context 
     ) 
ORDER BY NAME; 

Es ist im Grunde die gleiche Abfrage, mit der Ausnahme, dass ich das Einfügen dass UEBER Ausdruck vor meinem Localsort und ich beschränke mich auf Context. Was es macht, ist die Umwandlung der Zeichen% und _ in chr (1) & chr (2), wodurch sie nach alphanumerischen Zeichen in der absteigenden Sortierung sortiert werden. Auf diese Weise wird die explizit definierte "Comp Engine A" vor "Comp Engine%" kommen, die wiederum vor "%" steht. In Fällen, in denen die Kontexte identisch definiert sind, hat die lokale Konfiguration Vorrang vor zentralen Kontexten. Wenn Sie möchten, dass der lokale Bereich immer im Vordergrund steht, würden Sie auch in den Fällen, in denen der Bereich central genauer definiert ist, die Positionen der beiden Sortierbegriffe umkehren.

0

Die Art, wie wir das machen, ist ähnlich wie bei Steve. Zuerst benötigen Sie einen zentralen Konfigurationsdienst, um alle Konfigurationen zu speichern, die Sie auf die verteilte Umgebung anwenden möchten. Jedes Mal, wenn Sie die Konfiguration ändern möchten, ändern Sie sie im zentralen Konfigurationsdienst. In jedem Produktions-Host können Sie ein Schleifen-Skript schreiben, um die Konfiguration zu aktualisieren. Für eine ausgefeiltere Lösung müssen Sie eine Strategie einrichten, um zu vermeiden, dass ein falscher Batch für die Konfiguration auf allen Servern konfiguriert wird. Das wäre ein Desaster. Vielleicht brauchen Sie eine einfache Sperre oder einen grauen Freigabevorgang.

Verwandte Themen