Skip to content

高可用

Walis 預設以單一程序執行,也可以多個程序共用同一個資料庫。兩種模式下,任務的寫法完全一樣。

選資料庫

資料庫多節點說明
SQLite不行預設值。單一檔案,不必另外跑伺服器。
PostgreSQL可以
MySQL / MariaDB可以
SQL Server可以含 Azure SQL。

SQLite 是單一檔案。把兩個 API 節點指到同一個 SQLite 檔不會得到高可用,只會得到損毀的資料—— 所以 Walis 直接把 SQLite 視為單節點,不去做任何協調。

明確指定資料庫:

ConnectionStrings__Walis=Host=db.internal;Database=walis;Username=walis;Password=…
Database__Provider=postgresql

不指定 Database__Provider 時,Walis 會從連線字串猜。猜錯的代價是啟動就失敗, 比跑到一半才發現方言不合便宜得多。

多節點時有什麼不一樣

/health 會告訴你目前是哪一種模式:

json
{ "status": "ok", "database": "PostgreSQL", "node": "walis-a", "clustered": true }

clustered: true 時:

  • 建置以原子操作認領。 兩個節點可以同時搶同一筆佇列中的建置,但只有一個能完成 QueuedRunning 的轉換,另一個直接放手。
  • 節點會主動輪詢。 A 節點排入的建置不會出現在 B 節點的記憶體佇列裡,所以每個節點另外去 資料庫撿。SQLite 模式下完全不走這條路徑。
  • 只該做一次的工作靠租約。 Cron 觸發、離線執行器偵測、保留期限清理與排程備份, 由當下持有租約的那個節點負責。租約會過期,持有者掛掉之後別的節點下一輪自然接手—— 不需要額外跑一個協調服務,也就沒有那個服務可以掛掉。
  • 中斷回收只認自己的節點。 節點重啟時只回收自己在跑的建置,不會去動別人的。

不變的部分:任務定義、動作、外掛、執行器、通知與 API。遠端執行器 不知道也不需要知道有幾個 API 節點。

從 SQLite 搬到資料庫伺服器

備份檔與資料庫種類無關,所以搬家就是一次備份加一次還原:

  1. 在 SQLite 的部署上做一次備份(系統設定 → 備份)。
  2. 把一個節點指向新的資料庫。
  3. 還原備份。
  4. 其餘節點用同一組連線字串啟動。

還原會先清空目標,所以要在還沒把流量導過去之前還原。見備份與還原

HA 買到什麼、買不到什麼

它讓 API 伺服器不再是單點故障,也讓你可以在不安排維護時間的情況下逐台升級。

不會讓你的建置變成冗餘的。一筆建置就是跑在某一個節點或某一台執行器上;那台機器中途掛了, 建置就是失敗,要重跑。而且資料庫變成那個必須活著的東西——PostgreSQL 本身怎麼做高可用, Walis 沒有意見。

以 MIT 授權釋出。