iT邦幫忙

2

小型網站或小型架構做負載平衡的作法

  • 分享至 

  • xImage

大家好,

我有一個網站,其實也不會有什麼大負載,每日人數跟 session 小於一百,而且只是單純的 靜態內容,單純是要做零時備援而已。

雖然不會有啥大負載,但我想要它達到零時備援,或說,在幾分鐘內備援完成。
也就是說,其中一台主機掛了,另一台可以馬上撐起來。

只會有一個 domain,頂多分出 www.abc.com 以及 abc.com。

  • 網站可以用 nginx 架,也可以用 xampp 架。都可以放在 docker 裡。
  • OS 可以是 ubuntu server 或 windows。
  • domain 是註冊在 google domain 用 a 記錄導向。
  • 有用 cloudflare 做 proxy,也用 cloudflare 的 ssl。

有三個對外 ipv4,使用的是各地異地的線路,連到各自異地的三台機器,
機器 a 當負載控制 server,也就是最主要的進入點。
機器 b 當真正放網頁的 server 1。
機器 c 當真正放網頁的 server 2。

實際上卻不是很清楚該如何設定,還是也不需要那麼多機器呢?

以虛擬機的方式建置網站,VMWare或HyperV都有HA的功能,會比較容易達成你的需求。
如果放上雲端也可以的話,放雲端也是一個選擇。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
26
Ray
iT邦大神 1 級 ‧ 2022-09-30 09:54:56

跟流量大小無關, 但小量預算通常負擔不起 Load Balancer 的費用. 因為有一些基本架構的成本, 不論你流量大小, 都要先負擔這整個架構的費用, 再來才是增加流量的成本.

嚴格講, 你所說的情境比較接近 HA Failover 備援, 而不是負載平衡; 只不過剛好可以用負載平衡的元件來組成 Failover 備援的功能.

因為你提到 XAMPP, 我就先假設你打算用 LAMP (XAMP) 技術堆疊.

低成本有一種做法 (限同一個機房內):
將 Web Server+php-fpm+網站程式(.php, .html, .css) 打包成一個 Container
其他靜態圖片影片, 儲存在雲端 S3 相容的 Storage 內
在本地建三台 MySQL DB 組成 Master-Slave 的 HA Cluster

接下來:

  1. 啟動 N 個 Container, 每一個都綁不同的 Public IP
  2. DNS 上面設定 www 給 N 個上面綁的 Public IP 做 Round Robin (或者要用 CF 的 DNS Load Balancing 做也可以)
  3. Container 裡程式碼的 DB Connection 都指向內部 MySQL 的同一個 Cluster IP
  4. 要丟圖片出去, 就內嵌 S3 的圖片 URL 給瀏覽器

實際動作:
Web Failover: 任何一個 Container 掛掉, 由 DNS 或 CF 自動轉到活著的 Container
DB Failover: DB 死掉 HA Cluster 會自動切換, 程式不需要更換 DB Connection IP
File Failover: 雲端 S3 都有自動 Failover 機制, SLA 達 99.99% 以上
以上可完成:
透過單一機房達到不死程度, 但只能備援 Host 掛掉, 不能處理 Infra 掛掉

複雜一點的, 要做到跨機房 (=異地) 備援:
將 Web Server+php-fpm+網站程式(.php, .html, .css) 打包成一個 Container
其他靜態圖片影片, 儲存在雲端 S3 相容的 Storage 內
在各地機房內都建一台 MySQL DB, 然後跨機房組成 Multi-Master Replicatoin Cluster

接下來:

  1. 每個機房啟動 1 個 Container, 每一個都綁不同的 Public IP
  2. 用 CF 的 DNS Load Balancing 把 www 綁定所有的 Public IP (這裡不能用 DNS Round Robin), 或者買 Global Load Balancer 設備(例如: F5) 或同功能的雲端服務
  3. 各地 Container 程式碼的 DB Connection 都指向每個機房自己內部 MySQL 的內網 IP
  4. 如果程式偵測到 DB 無法連線, 或者無法 query, 對外就吐 Error 503
  5. 要丟圖片就內嵌 S3 的圖片 URL 給瀏覽器

實際動作:
Web Failover: 任何一個 Container 掛掉, 由 DNS 或 CF 自動轉到活著的 Container
DB Failover: 任何一個機房的 DB 死掉, 該機房的 Wer Server 就吐 503, 這會讓 Global Load Balancer 自動剔除這個機房的服務節點; 資料則透過 Multi-Master Replication 同步複寫到不同機房去; 等到他恢復, GLB 偵測到沒有 503 了, 就會又把它放回服務清單內
File Failover: 雲端 S3 都有自動 Failover 機制, SLA 達 99.99% 以上
以上可完成:
跨機房異地不死程度, 任何一個 Host/Infra 掛掉都可以 Failover

以上兩種架構, 不管你放: 實體單機, 虛擬機, 地端機房, 雲端機房, 通通都適用

如果你的靜態檔案儲存不想用現成的 S3 雲端服務的話, 那跨機房的 File Replication 又是另外一個更複雜的故事了....(因為上面架構原本是靠 S3 幫你解決掉這件事情, 如果不用 S3 的話, 你只好自己想辦法解決這個問題)

還有, 我們也還沒談到:高流量, 高併發, Scale-out....以上僅僅處理備援而已....

以上僅是多種做法的其中一種架構, 還有很多種不同組合的可能性, 但設計者必須要考慮兩大因素: Query Latency (查找反應時間), Data Consistency (資料一致性)

看更多先前的回應...收起先前的回應...
尼克 iT邦大師 1 級 ‧ 2022-09-30 10:41:26 檢舉

筆記中!/images/emoticon/emoticon33.gif

對我而言
這個回答本身的價值
已經超過樓主的「小型網站/架構」了
/images/emoticon/emoticon07.gif

現在不是有人在推web3.0,讓網站去中心化,不是更能做到分散式區塊鏈的優點,有多少礦工,就有多少可用處理器群,來分散工作跟流量?不過我還不知道是否可以達成有大量計算需求的資料庫網站型態,坐著看元宇宙新部門成立的成果吧

ckp6250 iT邦好手 1 級 ‧ 2022-10-01 05:03:29 檢舉

請教雷大,如果想請人幫忙架構出您描述的備援機制,
機器或雲端租用成本不算,單單【規劃、安裝、設定】
費用大約落下那個範圍呢?

(坦白說,我也想弄,但技術能力不足,想外包又不知要花多少錢?)

Jesse HO iT邦好手 1 級 ‧ 2022-10-01 10:36:39 檢舉

apache reverse proxy
rewrite rule 503 or 404 redirect url control
multi servers with service in single url

obarisk iT邦研究生 2 級 ‧ 2022-10-01 22:35:26 檢舉

其實他純靜態,應該不需要 php ?

0
hackerlan7
iT邦新手 5 級 ‧ 2022-10-01 12:05:50

K8S 可以解決你得問題唷
3台VM 就可以了
1台 Master
2台 WorkNode

上面跑你的容器Pod

0
ali88
iT邦新手 3 級 ‧ 2022-10-01 12:22:23

若你只是要部署靜態網頁(HTML,CSS,Javascript)直接使用雲端的Serverless,只要將靜態網頁內容放上去,後端的負載平衡或擴展都是雲端業者做掉了,爾且價錢上有使用到它的上限才開始收費,(各家AWS,GCP,Azure細節上可能不太一樣,不過大方向差不多),這邊推薦 AWS ,如下連結介紹及教學

0

設備可以提供線路負載平衡
伺服器負載平衡
例如 NFW-460
當中就有兩種
http://www.ublink.org/index.php/news/541-inbound-loadbalance-dns-server-nfw-460

0
ak02
iT邦研究生 1 級 ‧ 2022-10-03 12:20:52

要是嫌麻煩而且技術不足的狀況下
建議直接丟到雲端虛擬主機好了
找中華電信的業務談談應該就有詳細解釋

ckp6250 iT邦好手 1 級 ‧ 2022-10-05 05:01:58 檢舉

租個虛擬主機,
就自動能得到【負載平衡】的作用了哦?
有這麼便宜嗎?

還是說,在租虛擬主機時,要告知對方,要加上負載平衡的功能,一起報價?

尼克 iT邦大師 1 級 ‧ 2022-10-26 09:18:10 檢舉

基本上要有錢

0
kevinliou
iT邦見習生 ‧ 2022-10-06 13:57:13

你要的功能不算是負載平衡,靜態網頁如果要達到零時備援,研究一下serverless方式或是直接用github架設.. 就基本上不會有停機的疑慮

我要發表回答

立即登入回答