熱重啟
易於操作是 Envoy 的主要目標之一。除了強大的統計數據和本地管理介面之外,Envoy 還具有「熱」或「即時」重啟自身的能力。這表示 Envoy 可以在 排空過程 中完全重新載入自身(程式碼和設定),而不會丟棄現有的連線。熱重啟功能具有以下一般架構
兩個活動的程序會使用基本的 RPC 協定,透過 Unix 網域插槽彼此通訊。所有計數器都會從舊程序透過 Unix 網域傳送到新程序,而量表則會被傳輸,但標記為
NeverImport
的量表除外。在熱重啟完成後,從舊程序傳輸的量表將會被清除,但是像 server.hot_restart_generation 統計數據 這樣的特殊量表會被保留。新程序會完全初始化自身(載入設定、執行初始服務探索和健康檢查階段等),然後才會要求從舊程序複製監聽插槽。新程序開始監聽,然後告訴舊程序開始排空。
在排空階段,舊程序會嘗試優雅地關閉現有的連線。如何執行此操作取決於已設定的篩選器。排空時間可透過
--drain-time-s
選項設定,並且隨著時間推移,排空會變得更加積極。在排空序列之後,新的 Envoy 程序會告訴舊的 Envoy 程序關閉自身。此時間可透過
--parent-shutdown-time-s
選項設定。Envoy 的熱重啟支援經過設計,即使新的 Envoy 程序和舊的 Envoy 程序在不同的容器內執行,也能正確運作。程序之間的通訊僅使用 Unix 網域插槽進行。
在原始碼發行版本中,包含一個以 Python 撰寫的範例重新啟動器/父程序,位於 restarter/hot-restarter.py。此父程序可與標準程序控制公用程式(例如 monit/runit/等)搭配使用。
Envoy 的預設命令列選項假設在給定主機上只執行一組 Envoy 程序:一個作用中的 Envoy 伺服器程序,以及(可能)一個將如上所述退出的排空 Envoy 伺服器程序。--base-id
或 --use-dynamic-base-id
選項可用於允許多個、設定不同的 Envoy 在同一主機上執行並獨立熱重啟。
注意
目前,不支援在熱重啟期間更新監聽器的 socket_options。將會使用舊程序的插槽選項。如果需要更新插槽選項,請執行完全重新啟動或執行基於 LDS 的監聽器更新。
注意
Windows 不支援此功能。
插槽處理
依預設,Envoy 在 Linux 上使用 reuse_port 插槽,以獲得更好的效能。此功能在熱重啟期間可正確運作,因為 Envoy 會依工作程序索引將每個插槽傳遞給新程序。因此,在排空程序接受佇列中不會丟棄任何連線。
注意
在不常見的情況下,如果並行處理在熱重啟期間發生變更,如果並行處理增加,則不會丟棄任何連線。但是,如果並行處理減少,則可能會在舊程序工作程序的接受佇列中丟棄某些連線。