天天看點

Envoy 上遊叢集連接配接池

連接配接池

對于 HTTP 流量,Envoy 支援在底層有線協定(HTTP/1.1、HTTP/2、HTTP/3)之上分層的抽象連接配接池。使用過濾器代碼不需要知道底層協定是否支援真正的多路複用。

連接配接池支援的協定

HTTP/1.1

  • HTTP/1.1 連接配接池根據需​​要擷取到上遊主機的連接配接(直到斷路限制)。當連接配接可用時,請求将綁定到連接配接,因為連接配接已完成處理先前的請求,或者因為新連接配接已準備好接收其第一個請求。HTTP/1.1 連接配接池不使用流水線,是以如果上遊連接配接被切斷,則隻需重置單個下遊請求。

HTTP/2

  • HTTP/2 連接配接池通過單個連接配接多路複用多個請求,達到最大并發流和每個連接配接的最大請求數所施加的限制。HTTP/2 連接配接池根據需​​要建立盡可能多的連接配接來服務請求。沒有限制,這将隻是一個連接配接。如果收到 GOAWAY 幀或連接配接達到每個連接配接的最大請求數限制,連接配接池将耗盡受影響的連接配接。一旦連接配接達到其最大并發流限制,它将被标記為忙碌,直到有可用的流。每當有一個挂起的請求而沒有可以分派到的連接配接時,都會建立新的連接配接(直到連接配接的斷路器限制)。當 Envoy 作為反向代理運作時,HTTP/2 是首選的通信協定,因為連接配接很少(如果有的話)被切斷。

HTTP/3

  • HTTP/3 連接配接池通過單個連接配接多路複用多個請求,達到最大并發流和每個連接配接的最大請求數所施加的限制。HTTP/3 連接配接池根據需​​要建立盡可能多的連接配接來服務請求。沒有限制,這将隻是一個連接配接。如果收到 GOAWAY 幀或連接配接達到每個連接配接的最大請求數限制,連接配接池将耗盡受影響的連接配接。一旦連接配接達到其最大并發流限制,它将被标記為忙碌,直到有可用的流。每當有一個挂起的請求而沒有可以分派到的連接配接時,都會建立新的連接配接(直到連接配接的斷路器限制)。

自動協定選擇

  • 對于充當正向代理的 Envoy,首選配置是 AutoHttpConfig ,通過 http_protocol_options進行配置。預設情況下,它将使用 TCP 和 ALPN 來選擇 HTTP/2 和 HTTP/1.1 的最佳可用協定。
  • 如果在 automatic pool 中配置了 HTTP/3,它目前将首先嘗試 QUIC 連接配接,然後 300 毫秒後,如果未建立 QUIC 連接配接,也會嘗試建立 TCP 連接配接。無論哪個握手成功,都将用于初始流,但如果 TCP 和 QUIC 連接配接都建立,則最終将首選 QUIC。
  • 如果通過alternate_protocols_cache_options配置了備用協定緩存,則僅會嘗試通過HTTP備用服務(最終是HTTPS DNS資源記錄或“QUIC提示”(将手動配置)向釋出HTTP/3支援的伺服器進行HTTP/3連接配接。如果不存在此類廣告,則将使用HTTP/2或HTTP/1。
  • 如果未配置備用協定緩存,則将嘗試與所有伺服器建立 HTTP/3 連接配接,即使是那些不釋出 HTTP/3 的伺服器。
  • 此外,HTTP/3 通過 QUIC(使用 UDP)而不是 TCP(HTTP/1 和 HTTP/2 使用)運作。網絡裝置阻止 UDP 流量并是以阻止 HTTP/3 的情況并不少見。這意味着上遊 HTTP/3 連接配接嘗試可能會被網絡阻止,并将回退到使用 HTTP/2 或 HTTP/1。這條路徑是 alpha 并且正在迅速改進,目标是讓預設行為為網際網路環境帶來最佳延遲,是以請耐心等待并遵循 Envoy 釋出說明,以随時了解最新和最大的變化。

Happy Eyeballs Support

  • Envoy 支援 Happy Eyeballs,RFC6555,用于上遊 TCP 連接配接。此行為現​​在預設啟用,但可以通過運作時标志禁用​

    ​envoy.reloadable_features.allow_multiple_dns_addresses​

    ​。對于使用 LOGICAL_DNS的叢集,通過将config.cluster.v3.Cluster.DnsLookupFamilyALL來配置此行為 傳回 IPv4 和 IPv6 位址的選項。傳回的位址将根據 Happy Eyeballs 規範進行排序,并嘗試連接配接到清單中的第一個。如果此連接配接成功,它将被使用。如果失敗,将嘗試清單中的下一個。如果 300 毫秒後連接配接仍在連接配接,則将對清單中的下一個位址進行備份連接配接嘗試。
  • 最終嘗試将成功連接配接到其中一個位址,在這種情況下将使用該連接配接,否則所有嘗試都将失敗,在這種情況下将報告連接配接錯誤。

連接配接池數量

  • 每個叢集中的每台主機都會有一個或多個連接配接池。如果叢集配置了一個顯式協定,那麼主機可能隻有一個連接配接池。但是,如果叢集支援多個上遊協定,那麼除非它使用 ALPN,否則可以為每個協定配置設定一個連接配接池。
  • 每個工作線程為每個叢集維護自己的連接配接池,是以如果一個 Envoy 有兩個線程和一個同時支援 HTTP/1 和 HTTP/2 的叢集,那麼至少會有 4 個連接配接池。

健康檢查互動

  • 如果 Envoy 配置為主動或被動健康檢查,則所有連接配接池連接配接都将代表從可用狀态轉換為不可用狀态的主機關閉。如果主機重新進入負載平衡輪換,它将建立新的連接配接,這将最大限度地解決壞流(由于 ECMP 路由或其他原因)。

連接配接池的常用名額

  • 最大連接配接數:表示在任何給定時間内, Envoy 與上遊叢集建立的最大連接配接數,适用于 HTTP/1.1;
  • 每連接配接最大請求數:表示在任何給定時間内,上遊叢集中所有主機可以處理的最大請求數;若設為 1 則會禁止 keepalive 特性;
  • 最大請求重試次數:在指定時間内對目标主機最大重試次數
  • 連接配接逾時時間:TCP 連接配接逾時時間,最小值必須大于 1ms;最大連接配接數和連接配接逾時時間是對 TCP 和 HTTP 都有效的通用連接配接設定;
  • 最大等待請求數:待處理請求隊列的長度,若該斷路器溢出,叢集的 upstream_rq_pending_overflow計數器就會遞增;

連接配接池配置格式

---
clusters:
- name: ...
  ...
  connect_timeout: ... # TCP連接配接的逾時時長,即主機網絡連接配接逾時,合理的設定可以能夠改善因調用服務變慢而導緻整個連結變慢的情形;
  max_requests_per_connection: ... # 每個連接配接可以承載的最大請求數,HTTP/1.1和HTTP/2的連接配接池均受限于此設定,無設定則無限制,1表示禁用keep-alive
  ...      
  • 将max_connections和最max_pending_requests都設定為 1,表示如果超過了一個連接配接同時發起請求,Envoy就會熔斷,進而阻止後續的請求或連接配接;

參考文檔

繼續閱讀