跨不同數據中心的多個 VPS 集的負載平衡/故障轉移
我知道已經問過這個問題的許多變體,但我仍然找不到滿足我需求的好答案。
我想要做的是設置幾個(至少 2 個)VPS來託管我的網路應用程序。我想提供一些負載平衡(使用 Varnish 很容易實現)和相對高的可用性——這是我的問題。
使用負載均衡器(我需要在其中一個 VPS 上託管)會引入單點故障,這幾乎與只有一台機器來提供內容一樣糟糕。
http://i.stack.imgur.com/lFafj.png
而且 AFAIK DNS 循環方法不僅對於負載平衡來說是個壞主意,而且不提供故障轉移機制。如果其中一台伺服器出現故障,某些人(具有記憶體的 DNS IP)仍會嘗試連接到不可用的伺服器。忘記短 TTL - 這不是正確的解決方案。
http://i.stack.imgur.com/mTLRf.png
需要考慮的一件非常重要的事情:我想讓我的 VPS 分佈在多個數據中心,所以如果一個數據中心的電力或 ISP 出現故障,網站不會關閉。
我能想到的唯一 2 個解決方案要麼依賴 dns 循環(如果伺服器出現故障,至少在恢復之前將內容提供給一定比例的使用者),或者在數據中心購買專用伺服器,為停電做好充分準備並配備有幾個網際網路連接(與租用甚至 10 個 VPS 相比,這非常昂貴)。
所以問題是: 在擁有多個負載平衡 VPS 的同時避免單點故障的正確方法是什麼?
請原諒圖片。它們只是我的意思的盡可能基本的例子。
筆記:
你願意花多少錢,我還沒有看到有人依賴 VPS 並且真的想把錢花在數據中心故障案例上。
關於你的圖紙:
當(且僅當)負載均衡器是單台機器時,第一個失敗是正確的,如果它是單個系統(如在由多個主機建構的系統中),則不再正確。
SPA(最短的答案):
非常簡短的回答:您需要獲得在所有位置都可用的服務 IP。並設置BGP路由。
稍長一點:通常這是通過使用 BGP 並在 2 個不同位置宣布 IP 來完成的。您可以將其設置為始終公佈 IP,但其中一個的優先級低於另一個。這樣,在正常情況下,您的流量將僅流向一個站點,如果該站點失敗,則 BGP 路由將被丟棄並且流量切換到仍然可用的 IP。
我們有一些與此類似的設置,典型的佈局是:
(每個位置):
- 2個負載均衡器
這是 BGP 也執行並宣布其 IP 的地方。通常是 Quagga 和一些 IPVS 設置(我們使用 keepalived)
n
處理負載的伺服器 (FE)失敗案例:
任何 1 個負載均衡器(在單個站點)失敗
- 由keepalived處理,另一個LB將繼續它的工作
任何
n-k
FE 失敗(k
即在我們沒有遇到問題的情況下可能失敗的 FE 數量)
- 由 LB 處理,檢查會將它們從中刪除,並且它們不會再收到任何流量
n-(k+1)
FE 失敗(在單個站點)
- 由 BGP 處理。我們將在太多 FE 失敗的站點上終止 LB 上的 BGP 會話。另一個位置接管
單個站點的任何重大中斷
- 由 BGP 處理,BGP 會話將被丟棄,其他位置跳轉
很抱歉,我現在沒有心情進一步了解手動執行此操作的細節。我的猜測是,通過租用負載均衡器服務,您會變得更好(並且更便宜),這將為您帶來魔力。我讀過亞馬遜提供了這些,但我不知道如果不使用其他基礎設施是否可以使用它們。