Leo Yeh's Blog

SAS Viya (97)

教學目標

初步了解 SAS Event Stream Processing 故障轉移的基本概念。

重點概念

首先 SAS Event Stream Processing 容器化部署目前版本還無法對於有狀態的相關服務進行完整的故障移轉實作,但是對於無狀態的相關服務我們主要能夠針對輸入和輸出的發布和訂閱連接器進行故障轉移機制整合實作。所謂事件觸發故障轉移 (Failover) 主要會發生在某些特定情況下,分別為存在硬體故障,以及伺服器上的處理程序失敗,並且導致伺服器停止執行,此時在故障轉移期間主要有兩種方法可以更新模型,分別為動態模型替換和完整模型替換。使用新模型更新每個伺服器之後,我們就能夠可以重新啟動故障轉移叢集,如果故障轉移叢集可以從 Message Bus 恢復模型的狀態,則就能夠使用新模型停止並啟動每個伺服器,如果故障轉移叢集無法恢復引擎狀態,則必須停止模型中發佈者和訂閱者的所有實例,並且當我們需要實施故障轉移時,請注意必需滿足軟體元件和硬體元件的要求。

接著所謂軟體元件的要求主要是以 Solace、Tervela、RabbitMQ 或 Kafka 發布和訂閱連接器進行實作,訂閱連接器必須設定熱故障轉移 (Hot Failover),對於客戶端發布者和訂閱者應用程式皆必須使用隨 SAS Event Stream Processing 所提供對應的發佈和訂閱 API,其中針對不同程式語言將會有不同的實作方式,分別為:

  1. 對於 C 或 C++ 應用程式主要是透過在呼叫 C_dfESPpubsubInit() 之前呼叫 C_dfESPpubsubSetPubsubLib() 來請求對應的傳輸選項。
  2. 對於 Python 應用程式主要是透過在呼叫 init() 之前呼叫 SetPubsubLib() 來請求對應的傳輸選項。
  3. 對於 Java 應用程式主要是透過加入 dfx-esp-solace-api.jar、dfx-esp-tervela-api.jar、dfx-esp-rabbitmq-api.jar 或 dfx-esp-kafka-api.jar 在加入 dfx-esp-api.jar 前面呼叫對應的傳輸選項。

請注意我們必須在承載連接器和客戶端執行實例的平台上安裝 Solace、Tervela、RabbitMQ 或 Kafka 相關的函式庫,此外 SAS Event Stream Processing 不提供任何設備標準 API 函式庫,所以在執行環境時必須定義這些函式庫的路徑,像是在 Linux 平台上使用 LD_LIBRARY_PATH 設定函式庫路徑。

再來所謂硬體元件的要求則必須以冗餘方式安裝消息總線,以避免單點故障,通常基於軟體的 Message Bus 通常需要三個或更多伺服器來實現冗餘,基於冗餘的角度考慮,應該在主要和備援伺服器傳輸 heartbeat 控制訊息,這樣才能夠避免在一個網路故障或線纜故障時導致兩個節點同時認為自已是唯一處於活動狀態的伺服器,導致出現爭用資源的情況,這種爭用資源的情境就是所謂的腦裂 (split-brain),當兩個節點共享同一個物理設備資源的情況下,將會產生相當可怕的後果,所以為了避免出現腦裂,可採用在主要和備份的節點間建立一個冗餘的、可靠的物理連接來同時傳送控制信息,一旦發生腦裂時,就能夠藉助額外設備強制性地關閉其中一個節點。

最後基於軟體的消息總線可能與兩個或多個冗餘 ESP 伺服器集合在一起,並且也可能不在同一位置,此外我們需要特別注意如果滿足以下條件,評估 SAS Event Stream Processing 是否為容器化部署就已經無關緊要,反之若無法滿足以下條件才需要評估 SAS Event Stream Processing 是否需要容器化部署,分別為:

  1. ESP 伺服器和 Message Bus 之間的 IP 連接始終保持不變。
  2. 實體機器或虛擬機器的 CPU 核心和記憶體大小適當,將能處理最大的 ESP 伺服器和 Message Bus 負載,這也代表著所有伺服器的大小都相同,其中任何一個都必須能夠處理完整的 ESP 伺服器和 Message Bus 負載,即使只是在伺服器故障之後暫時處理。

總結目前針對 SAS Event Stream Processing 的故障排除機制主要是針對輸入和輸出的發布和訂閱連接器進行 Failover 機制整合實作,雖然 SAS Event Stream Processing 有提供 Cluster Manager 能夠將來自邊緣設備的來源對應至網格或雲端中設定的事件串流處理引擎,並且透過管理連接器和引擎實例之間的對應,將有助於彈性部署 SAS Event Stream Processing 並且簡化大規模部署,但是需要特別注意若已經在 SAS Event Stream Processing 引擎的記憶體中處理有狀態服務的資訊目前還是無法進行故障移轉,所以當我們在設計和實作 SAS Event Stream Processing 故障排除機制時,需要先了解是否存在有狀態服務,以利進行設計和實作的完整評估和測試。

相關資源

⬅️ Go back