2015-01-20 58 views
0

我正在考慮創建一個帶有hot/warm standby instance的postgresql安裝程序,以便我的應用程序不受數據庫服務器停機時間的影響,並且還可以快速備份主服務器。如何將c3p0配置爲熱備用/熱備用Postgresql服務器?

我想最簡單的方法來檢測主是改變DNS:

  • 應用程序連接到JDBC:在PostgreSQL://database.example.com/testdb
  • database.example.com點掌握的IP
  • 如果主停止響應,DNS更改database.example.com指向備份服務器1。在此期間,觸發備份成爲主要

我有幾個q問題:

  1. c3p0可以配置一個非IP網址?
  2. 請問這個工作在c3p0/jdbc連接方面?與主站的連接會斷開,我不確定連接池在這種情況下的工作方式。它是否簡單地清除了連接池,在一段時間後重新嘗試連接,並在它發生時從備份變爲主的主節點獲取連接?
  3. 這是否對休眠(例如會話緩存)有任何影響,還是會完全不知道下面的內容?

最後,我也接受了關於在主站變爲不可用時進行主/從切換的不同建議。

回答

1

如果您按照您的建議隱藏DNS後面的服務器切換,並且如果該方案在沒有集中的情況下工作,則c3p0應該沒有問題。 c3p0可以處理JDBC驅動程序可以處理的任何URL。通常(對於postgresql來說)並不要求數據庫地址是硬IP,DNS名稱很好,並且很常見。

要使您的計劃正常工作,只需確保您已配置一些合理的connection testing。 c3p0將不知道您的DNS開關。它只會獲取並提供連接。但是,當主服務器關閉時,c3p0會檢測到這些連接已斷開並退出。它將用新的連接替代它們,這些連接將安靜地來自輔助DBMS。

我主要關心的是你提出的是緩存。您必須小心地配置您的DNS,以便不緩存您要切換的名稱,並且有可能Postgres JDBC驅動程序可能只執行一次DNS查找並在內部緩存。這可能很難解決。

+0

感謝您的輸入史蒂夫。雖然我還沒有嘗試過(如果我錯了,有人會糾正我),但我認爲DNS緩存在名稱服務器配置中使用名稱的TTL解決 - 如果將其設置得足夠低(例如1/2分鐘)這意味着該服務將在那段時間停止運行,直到緩存過期並且服務(在本例中爲JDBC驅動程序)被迫從域名服務器獲取IP地址。 – mmalmeida 2015-01-23 09:26:21

+0

(是的,我認爲很短的TTL應該限制DNS緩存,你只需要嘗試看看它的工作效果如何!) – 2015-01-26 07:28:49