Domanda

Una singola installazione dei nostri negozi di prodotti la sua configurazione in un insieme di tabelle di database.

Nessuno degli impianti know 'di qualsiasi altra installazione.

E 'sempre stato comune per i clienti di installare più copie del nostro prodotto in diversi data center, che sono geograficamente distanti. Ciò significa che le informazioni di configurazione deve essere creata una volta, quindi esportata ad altri sistemi. Alcuni dei config viene poi modificato in base alle condizioni locali. per esempio. modifica degli indirizzi IP, ecc Questo è un errore di approccio incline goffo.

Stiamo ricevendo richieste per la capacità di avere una strategia più senza soluzione di continuità per la condivisione dei dati globali, ma ancora permettendo modifiche locali.

Se non fosse per le modifiche locali po 'poi siamo riusciti a utilizzare le funzionalità di replica dei dati di Oracle.

A causa dei requisiti di HA aventi tutte la configurazione in un database non è un'opzione.

Qualcun altro ha incontrato questo problema e hai mai capito una buona soluzione programmatica per questo? Sa di eventuali buoni documenti che potrebbero descrivere una soluzione parziale o totale?

Siamo * Basato nix, e utilizzare Oracle. Le modifiche dovrebbero essere replicate in tutti i nodi abbastanza rapidamente (un secondo o 2).

È stato utile?

Soluzione

Non sono sicuro di come sia possibile per voi per cambiare il modo di gestire la configurazione, ma abbiamo implementato qualcosa di simile a questo utilizzando l'idea di sostituzioni locali. In particolare, ci sono due tabelle di configurazione che sono identici (chiamarli CentralConfig e LocalConfig). CentralConfig è mantenuta alla posizione centrale, e viene replicato fuori per le posizioni satellitari, dove è di sola lettura. LocalConfig può essere impostato al sito locale. La procedura che interroga i dati di configurazione prima cerca i dati nella tabella LocalConfig, e se non lo trova, recupera dalla tabella CentralConfig.

Per esempio, se si è tentato di fare questo con i valori della tabella v $ parametro, si potrebbe interrogare la configurazione utilizzando la funzione di FIRST_VALUE in analisi SQL:

  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;

La colonna localsort nei sindacati è lì solo per assicurarsi che i valori local_parameter hanno la precedenza sui valori dei parametri v $.

Nel nostro sistema, in realtà è molto più sofisticato di questo. Oltre al "nome" per il parametro che stai guardando in alto, abbiamo anche una colonna "contesto" che descrive il contesto che stiamo cercando. Ad esempio, potremmo avere un parametro di "timeout", che è impostato in posizione centrale, ma anche a livello locale, abbiamo più componenti che utilizzano questo valore. Essi possono essere tutti uguali, ma possono anche voler configurare in modo diverso. Così, quando lo strumento guarda in alto il valore di "timeout", che vincola anche dal campo di applicazione. Nella configurazione in sé, possiamo utilizzare i caratteri jolly quando definiamo quello che vogliamo per campo di applicazione, come ad esempio:

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

La configurazione di cui sopra dice, per tutti i componenti, utilizzare un timeout di 30, ma per Comp motori di qualsiasi tipo, utilizzare un timeout di 5, tuttavia per motori Comp A & B, utilizzare 15 e 10 rispettivamente. Le ultime due configurazioni possono essere mantenuti in CentralConfig, ma gli altri due possono essere mantenuti in LocalConfig, e si dovrebbe risolvere le impostazioni in questo modo:

  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;

E 'fondamentalmente la stessa query, tranne che sto inserendo che traducono l'espressione prima del mio localsort e sto vincolante del contesto. Quello che sta facendo è la conversione del% e _ caratteri Chr (1) & chr (2), che li renderà in ordine caratteri alfanumerici nel ordinamento decrescente. In questo modo, il esplicitamente definito "Comp Engine A" verrà prima "Comp motore%", che a sua volta venire prima "%". Nei casi in cui i contesti sono definiti in modo identico, configurazione locale prevale su quelle centrali; se si voleva locale per sempre briscola centrale, anche nei casi in cui centrale è stato ambito più strettamente, si era appena invertire le posizioni dei due termini di ordinamento.

Altri suggerimenti

Il modo in cui stiamo facendo questo è simile con Steve. In primo luogo è necessario un Configura Servizio centrale per salvare tutto il configure si desidera applicare per l'ambiente distribuito. Ogni volta che si desidera modificare la configurazione, modificarlo nel Configura Servizio Centrale. In ogni host di produzione è possibile scrivere uno script ciclo per aggiornare la configurazione. Per una soluzione più sofisticata, è necessario impostare qualche strategia per evitare un lotto configure sbagliato in tutti i server, che sarebbe un disastro. Forse avete bisogno di un blocco semplice o un processo di rilascio grigio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top