2009-08-07 63 views
1

我們產品的單一安裝將其配置存儲在一組數據庫表中。Where 如何存儲分佈式配置數據

沒有任何安裝「知道」任何其他安裝。

客戶將我們產品的多個副本安裝在不同的數據中心(地理位置相隔很遠)一直很常見。這意味着配置信息需要創建一次,然後導出到其他系統。然後修改一些配置以適合當地情況。例如更改IP地址等等。這是一種笨重的,容易出錯的方法。

我們現在正在獲得有關共享全球數據的更加無縫策略的要求,但仍允許進行本地修改。

如果不是本地修改位,那麼我們可以使用Oracle的數據複製功能。

由於HA要求在一個數據庫中的所有配置不是一個選項。

有沒有其他人遇到過這個問題,你有沒有想過一個很好的編程解決方案呢?瞭解任何可能描述部分或完整解決方案的優秀論文?

我們基於* nix,並使用Oracle。更改應該很快地複製到所有節點(一秒或2秒)。

回答

2

我不知道它是如何可能改變你處理你的配置的方式,但我們通過使用本地覆蓋的想法實現了類似於此的東西。具體而言,您有兩個相同的配置表(稱爲CentralConfig和LocalConfig)。 CentralConfig維護在中心位置,並複製到您的衛星位置,在該位置只讀。 LocalConfig可以在本地站點建立。查詢配置數據的過程首先在LocalConfig表中查找數據,如果找不到,則從CentralConfig表中檢索它。

例如,如果你想與V $參數表中的值要做到這一點,你可以使用FIRST_VALUE函數在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; 

的localsort列工會是否只是爲了確保local_parameter值優先於v $參數值。

在我們的系統中,它實際上比這更復雜。除了您正在查找的參數的「名稱」之外,我們還有一個「上下文」列來描述我們正在尋找的上下文。例如,我們可能有一個集中設置的參數「超時」,但即使在本地,我們也有多個使用此值的組件。它們可能都是一樣的,但我們也可能想要以不同的方式進行配置。所以當工具查找「超時」值時,它也受到範圍的限制。在配置本身,我們可以使用通配符時,我們定義我們所希望的範圍,如:

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

上面的配置表示,所有組件,使用30超時,但對於任何類型的比較引擎,請使用5的超時,但對於Comp Engines A & B,請分別使用15 & 10。最後兩個配置可以保持在CentralConfig,但其他兩個可以在LocalConfig維持,你會解決的設置是這樣的:

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; 

它基本上是相同的查詢,但我將那個翻譯表達式在我的localsort之前,我約束上下文。它所做的是將%和_字符轉換爲chr(1)& chr(2),這將使它們按字母數字字符按降序排序。這樣,明確定義的「Comp Engine A」將出現在「Comp Engine%」之前,而「Comp Engine%」則會出現在「%」之前。在上下文定義相同的情況下,本地配置優先於中央配置;如果你希望本地永遠佔據中心位置,即使在中央的範圍更緊的情況下,你也只需要顛倒兩個排序項的位置。

0

我們這樣做的方式與Steve's相似。 首先,您需要一箇中央配置服務來保存您要應用到分佈式環境的所有配置。每當您想修改配置時,都要在中央配置服務中對其進行修改。在每個生產主機中,您可以編寫一個循環腳本來更新配置。 對於更復雜的解決方案,您需要設置一些策略,以避免在所有服務器中進行錯誤的配置批處理,這將是一場災難。也許你需要一個簡單的鎖定或灰色釋放過程。