Caddy 實戰(六)- 反向代理中的負載均衡

爲了保障系統的高可用,我們需要針對重要的服務啓動多個,這樣當其中的一個服務出問題的時候,其他服務可以繼續工作,系統就做到了高可用,這也就是負載均衡的應用。

什麼是負載均衡

負載平衡(Load balancing)是一種電子計算機技術,用來在多個計算機(計算機集羣)、網絡連接、CPU、磁盤驅動器或其他資源中分配負載,以達到優化資源使用、最大化吞吐率、最小化響應時間、同時避免過載的目的。

以上來自於維基百科,這個定義看起來有點繞。其實在我們互聯網中,負載均衡其實就用利用多態服務器提供單一服務,這種方案有時也被稱爲服務器農場。

比如我們常見的 DNS 負載均衡,其實就是對一個域名配置多個 IP 主機,這樣當一個有問題的時候,其他的 IP 主機也可以正常的提供服務

負載均衡有很多負載,比如可以按照地理位置,給用戶分配離他最近位置的 IP,這樣可以加快用戶的訪問速度;也可以根據響應時間、連接數等因素來進行靈活的調度。

Caddy 的負載均衡

只要定義了多個上游 (upstream),Caddy 的反向代理就會使用負載均衡的能力,比如我們上篇 *** 文章中的示例,就是用了負載均衡,代碼如下所示:

reverse_proxy /api/*  {
    to node1:80 node2:80 node3:80
}

以上這個配置,它的負載均衡策略 (調度方式) 默認是隨機的,我們可以通過 lb_policy 來指定不同的負載均衡策略,比如:

reverse_proxy /api/*  {
    to node1:80 node2:80 node3:80
    lb_policy first
}

以上代碼指定的是 first 的負責均衡策略,也就是選擇第一個可用的上游。

負載均衡策略

除了 first 外,還有很多負載均衡策略以供我們選擇,下面就爲你分別介紹他們。

  1. first:選取第一個可用的上游

  2. random:隨機選取一個可用的上游

  3. least_conn:選取當前請求數最少的上游, 這個比較適合長連接的場景

  4. ip_hash:根據 IP 的 Hash 值選取一個固定的上游

  5. random_choose 

    :隨機選取 2 個或者更多個上游,然後再從中選擇負載最小的,n 通常爲 2

  6. header:這個是根據請求頭的 Hash 選取一個固定的上游,和 ip_hash 很像,只不過它是根據指定的請求頭的值進行 Hash,然後選取上游的。所以這裏的用法是 header ,要指定一個請求頭。

  7. uri_hash:這個也和 ip_hash 很像,只不過它是根據請求的 URI 進行 Hash,然後選取一個上游。

  8. round_robin:這個策略是循環迭代,挨個使用一個個上游,每個上游都可以被用到,輪着來。

  9. cookie [

     []] :如果你理解了以上幾個基於 Hash 的負載均衡策略,那麼這個 cookie 的也會很好理解,其實它就是通過 cookie 的值的 hash 來選取一個上游。在這裏 name 表示要獲取 cookie 值的 name ,默認是 lb , secret 是用於 Hash 的密鑰,使用的是 Hamc256 算法。

以上是 Caddy 支持的 9 個負載均衡策略,除了常規的 first、random、least_conn 外,其他幾個主要是根據特定的『值』進行 Hash,然後根據 Hash 後的值,再選取一個固定的上游,如 ip_hash、uri_hash 甚至 cookie 都是此類,只是實現的方式不同。

重試等待時間

當你設置了多個上游主機,啓用了負載均衡後,不可避免的會遇到上游服務不可用的情況,默認情況下,Caddy 的處理是:當上遊服務器不可用的時候,客戶端的請求就沒有可用的服務來相應,客戶端就會報錯。

當然除了立即響應服務不可用,Caddy 還提供了負責均衡的重試功能,這就是 lb_try_duration ,他可以設置一個重試的時間,比如 1000 毫秒。

這是什麼意思呢?如果你設置了lb_try_duration 爲 1000 毫秒,那麼 Caddy 的負載均衡在處理該客戶端請求時,如果選用了一個不可用的上游服務,就會繼續重試,一直到找到一個可用的上游或者到了設置的 1000 毫秒時間爲止。

也就是,這個時間,就是 Caddy 的負載平衡器嘗試查找可用的上游主機時,客戶端將等待最長時間。

重試時間間隔

有了重試等待時間,肯定也有重試時間間隔,因爲正常的邏輯上來講,不能馬上去重試,因爲馬上重試的話,很大概率拿到的也是個不可用的上游主機,所以需要一個重試時間間隔,來控制重試的節奏,在 Caddy 中,就是 lb_try_interval ,默認是重試間隔是 250ms,250 毫秒。

所以你可以看到, lb_try_interval 是結合着lb_try_duration 來使用的。lb_try_duration 是重試等待的總時間,而lb_try_interval 是在這段時間內,每隔多久重試一次。

示例

其實 Caddy 的負載均衡示例非常簡單,按照配置寫即可,這裏爲了便於理解,我也寫下:

# 按照ip hash 負載均衡
reverse_proxy /api/*  {
    to node1:80 node2:80 node3:80
    lb_policy ip_hash
}

如果要設置等待時間的話,可以這樣:

# 按照ip hash 負載均衡,重試等待時間爲5秒
reverse_proxy /api/*  {
    to node1:80 node2:80 node3:80
    lb_policy ip_hash
    lb_try_duration 5s
}

小結

這篇文章主要介紹了 Caddy 的負載均衡,並且對負責均衡的策略、重試等待時間、重試時間間隔做了詳細的介紹,相信你已經會使用了。

在這篇文章中,我一直很強調「可用的上游主機」,那麼什麼是可用的呢?下一篇我將會爲你講解 Caddy 的健康檢查,歡迎關注公衆號接收查看。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/X0yv_gTN6yjXkQvZtRLNxg