高可用性叢集(HA cluster)運作模式 - 以 Kong CP 為例

前言 某天我在公司 Kong 測試環境的 control plane 上作業時,才發現其中一台 control plane 的服務竟然沒啟用。好奇之下問了之前負責維護的同事,結果他說:「本來就只會啟用一台啊!」於是我又多學了一課,身為啥都學來者不拒的工程師,當然要記錄下來。 HA cluster 高可用性叢集 根據 wikipedia 的定義:「高可用性叢集(High-availability clusters)是以最短的中斷時間為目標而可靠地運作的,支撐伺服器應用的一組電腦。它們通過使用高可用性軟體來管理叢集中的冗餘電腦,當系統組件出現故障時,這些電腦可以繼續提供服務。」簡單來說,就是有備援主機能在其中一台掛掉時接手,讓服務不中斷。 在接手 Kong 之前,我手上的系統也幾乎都是一個服務同時掛載在由兩個節點組成的 cluster 上,流量會透過 NLB(Network Load Balancer,網路負載平衡器)分流到兩個 node 上。 HA cluster 常見有兩種運作模式:Active-Passive 和 Active-Active。 Active-Passive 模式:一台節點(主節點)負責運行服務並處理所有流量,另一台節點則處於待命(備援)狀態,只有主節點故障時才會接手服務。 Active-Active 模式:兩台或多台節點同時運行服務,互相備援,平時都在積極處理流量。當其中一台節點故障時,其他節點會接手其服務。 所以,這次 control plane 採用的是 Active-Passive 模式。But why? 一定有什麼原因吧?(後來想起其實同事很久以前有說過,但我忘了,且當時也沒說那麼細,所以說做筆記很重要)。 Control plane v PostgreSQL Kong 的 Control Plane 負責集中管理 API Gateway 的所有設定、認證,以及 policy 和各種 plugins 的管理操作。不過 control plane 本身並不保存資料,只是管理和派送設定任務。所有設定與狀態資料都必須儲存在獨立運行的 PostgreSQL 資料庫裡,control plane 會以資料庫客戶端身份,透過網路連線到 PostgreSQL 資料庫伺服器,每次有設定變更、查詢、同步請求時都會讀寫這個資料庫。 根據官方文件1,PostgreSQL 不支援多台主機或多個資料庫 instance 同時掛載、讀寫同一份 data directory,否則可能會有資料毀損的風險。事實上,有人實驗過2,即使強行繞過 PostgreSQL 的檢查機制,在你啟用另一個 instance 時,原本掛載的 instance 也會被強制斷開。 ...

July 25, 2025 · 1 分鐘

簡述 Kong API Gateway Control Plane 與 Data Plane 設置同步機制

我喜歡在文章裡面放張圖,雖然現在 AI 生圖很方便,但還是喜歡放自然一點的,不論是自己拍的或是網路上看到的(from unsplash) 前言 在 Kong API Gateway 的日常維運中,Control plane 與 Data plane 的同步機制是個蠻值得關注的概念。最近在檢視公司架構圖時,我發現到 Control plane 與 Data plane 之間的 policy sync 方向標示為 Data plane 向 Control plane「拉取」最新設置。 簡單畫,公司實際架構圖沒這麼醜 在看到公司架構圖標示 Data plane 會「拉取」設定時,其實我一開始沒有多想,且防火牆確實只開了 Data plane 到 Control plane 的 8005 port。 但後來仔細思考,覺得這種設計有點奇怪——如果是 Data plane 不斷輪詢 Control plane 是否有設定變更,那輪詢頻率要怎麼抓?萬一設定異動很頻繁,會不會造成不必要的流量和效能浪費?而且從系統設計的角度來看,應該是由管理端(Control plane)主動通知執行端(Data plane)有異動才比較合理。這讓我開始思考,究竟同步機制的實際運作方式是什麼? 這些疑問促使我去查官方文件,才發現實際上是 Control plane 主動推送設定(如下圖),和我原本的認知有落差。 Control plane 與 Data plane 先簡單說明一下這兩個東西是什麼。 Kong Gateway 在 hybrid mode 下,有兩個重要的角色,分別為 Controle plane 與 Data plane,其功能分別為: ...

July 18, 2025 · 2 分鐘

紀錄 DevOps 相關名詞

最近聽到幾個沒有聽過的名詞覺得蠻值得記錄一下,也算是跟 DevOps 有關。 綠地專案 vs. 棕地專案: 我們站在什麼樣的基礎上開發? 這兩個詞彙本來是都市計畫的術語,我查是這樣,但我沒印象我大學時有學過,我記得以前是用「素地」來表示沒有建築物的土地。「素地」與「空地」不同,空地是指已有道路、排水、電力設施,可利用而仍未依法作建築使用,或已作建築使用,其建物價值不及基地申地價的 10%。 好,扯遠了,總之,這兩個詞用來比喻專案開發時所面對的環境。「綠地專案」指的是從頭開始的專案,而「棕地專案」指的是從既有的專案上開發。 對綠地專案而言,一切從頭開始,沒有既有專案的歷史包袱,理論上可以自由地選擇最新的技術、架構與工具,例如新創團隊開啟一個全新的專案,大概是這樣的概念。而相反地,棕地專案則像是在一塊已經開發過、甚至可能受到污染的「棕地」上進行翻新或擴建。開發團隊必須在既有的、可能充滿技術債的程式碼基礎上工作。例如我目前手上的專案全部都是棕地專案,充滿著大量 legacy code,牽一髮動全身的程式碼,讓我改起來膽戰心驚,到最後就很容易抱著能不改就不改的心態(If it works, don’t touch it.)。 總而言之,這表示在評估一個專案時,不能只看要開發的功能,更要理解它所處的狀況。是從零開始的創造?還是在既有框架下的奮鬥?這會影響策略的擬定。 平台工程(Platform engineering) 平台工程(Platform engineering)可將開發人員的部分工作和基礎架構相關手動作業移至 IDP(Internal Developer Platform),讓團隊能專心開發應用程式及投入創新1。 這聽起來有些抽象,但可以想像如果在一間公司中,AP 人員(開發團隊)需要自己處理伺服器、資料庫、CI/CD 等 infra 上,那就是一種資源的錯置,這會讓開發人員無法真正專注於在開發上2。平台工程團隊的角色,就是將這些繁瑣但必要的工作,整合成一個自助式的平台。開發人員可以透過這個平台,完成環境建置、部署、監控等任務。 在我們的場景,例如伺服器、資料庫這類 infra,是不需要自己建置,我們是透過需求單系統,填寫工單請專責人員建置3,這中間要經過層層關卡(雙方主管)的審核,最後才會成功把需求傳遞到專責人員手上開始作業。而作業過程中依據 SOP 需要留存大量的「軌跡」,這些軌跡最後都有可能會被稽核檢視其是否合規。簡單來說,有平台,但不好用。 至於 CI/CD,我們在導入 Azure DevOps 後算是有完成了這一塊拼圖,建立起一個可用的平台,畢竟我們原本的部署上線方式真的令人太痛苦了,這個有機會以後可以再分享一下。 https://cloud.google.com/solutions/platform-engineering?hl=zh-TW ↩︎ 在敝公司雖然不用自己建置基礎設施,但很多時候都要自己管理,因為我們的角色某種程度上是開發人員兼維運人員。 ↩︎ 在《獨角獸專案》這本書當中看到無極限零件公司裡面也要填寫類似的工單系統時,令我倍感熟悉。 ↩︎

July 16, 2025 · 1 分鐘

軟體架構學習紀錄(一)

AI 工具雖然快速,但我仍偏好用書本學習一些需要深層理解的知識。軟體架構一直是我想補強的領域。平常工作中會嘗試從架構的角度理解問題,但我希望能讀些更嚴謹、系統化的書籍,從底層建立起紮實的認知框架。 軟體架構是什麼? 軟體架構可以類比為房屋的結構設計。建築中可能包含承重牆、樑柱與屋頂等結構元件,沒有這些結構,房子就無法成立。至於地板材質、顏色,甚至沙發要擺在哪裡,這些並不會出現在建築的結構圖中,因為它們與設計相關,而非結構。 類似地,軟體系統也有其結構,而我們對這種結構的理解,可以從四個維度來思考1: 架構特性(Architectural Characteristics):系統著重於效能或是妥善性? 架構決策(Architectural Decisions):例如系統的使用者介面是否允許與資料庫直接溝通,或是必續透過資料存取服務(如 API)來溝通? 邏輯組件(Logical Components):每個業務功能的原始碼集合(成立訂單、付款) 架構風格(Architectural Styles):微服務、分層架構等。 因此當有人說「我們的架構是微服務」這句話只定義了一個維度(架構風格),不足以描述整體架構。 架構角度 & 設計角度 上面提到,地板材質、顏色這些設計,對系統而言是設計角度問題。舉例來說,更改網頁的背景顏色,這種較偏向設計,而非架構。 但事實上架構與設計並沒有辦法那麼容易截然二分,他們是位於光譜的兩端。例如,將一個服務拆分為兩個獨立模組,這不僅涉及程式結構的重構與介面設計,也可能影響部署策略與服務間依賴關係。這類決策就處於設計與架構之間的模糊地帶。 待續 參《深入淺出軟體架構》, Raju Gandhi, Mark Richards & Neal Ford。 ↩︎

July 13, 2025 · 1 分鐘

Goals vs Systems

前言 今天重新打開 Algomonster 時,點開了之前沒特別注意的 Getting Started 章節。其中一句話讓我停下來反覆思考: At AlgoMonster, we love systems. We are big believers in systems over goals. – 在 AlgoMonster,我們熱愛系統。我們堅信系統比目標更重要。 這句話讓我產生好奇:「系統比目標更重要(systems over goals.)」這是什麼意思?點進連結後,發現是漫畫家 Scott Adams 的部落格文章1,內容來自他的一本書《How to Fail at Almost Everything and Still Win Big》2。這裡整理出我讀完後的理解與想法。 目標(Goals) Scott Adams 指出,目標是「限制性的 (limiting)」。如果你只專注於一個特定的目標,雖然達成它的機率可能比沒有目標時高,但你可能會「錯過可能遠比你的目標更好的機會」 (miss out on opportunities that might have been far better than your goal)」。 舉例來說, 減重多少公斤:這類目標很常見,但實際上很難持之以恆(我自己也經歷過)。 每週去健身房三到四次:這也是一個目標,對於不喜歡運動的人來說可能感覺像懲罰,導致最終因為感到痛苦而放棄。 系統 (Systems) 而 Scott Adams 認為,「系統」旨在將你從低勝算的情況轉移到高勝算的情況 (move you from a game with low odds to a game with better odds)。 透過系統,你不太可能因為過於專注於一個機會而錯過另一個 (less likely to miss one opportunity because you were too focused on another),並且總是在掃描任何機會 (always scanning for any opportunity)。 ...

July 12, 2025 · 1 分鐘