高可用
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 時:
- 建置以原子操作認領。 兩個節點可以同時搶同一筆佇列中的建置,但只有一個能完成
Queued→Running的轉換,另一個直接放手。 - 節點會主動輪詢。 A 節點排入的建置不會出現在 B 節點的記憶體佇列裡,所以每個節點另外去 資料庫撿。SQLite 模式下完全不走這條路徑。
- 只該做一次的工作靠租約。 Cron 觸發、離線執行器偵測、保留期限清理與排程備份, 由當下持有租約的那個節點負責。租約會過期,持有者掛掉之後別的節點下一輪自然接手—— 不需要額外跑一個協調服務,也就沒有那個服務可以掛掉。
- 中斷回收只認自己的節點。 節點重啟時只回收自己在跑的建置,不會去動別人的。
不變的部分:任務定義、動作、外掛、執行器、通知與 API。遠端執行器 不知道也不需要知道有幾個 API 節點。
從 SQLite 搬到資料庫伺服器
備份檔與資料庫種類無關,所以搬家就是一次備份加一次還原:
- 在 SQLite 的部署上做一次備份(系統設定 → 備份)。
- 把一個節點指向新的資料庫。
- 還原備份。
- 其餘節點用同一組連線字串啟動。
還原會先清空目標,所以要在還沒把流量導過去之前還原。見備份與還原。
HA 買到什麼、買不到什麼
它讓 API 伺服器不再是單點故障,也讓你可以在不安排維護時間的情況下逐台升級。
它不會讓你的建置變成冗餘的。一筆建置就是跑在某一個節點或某一台執行器上;那台機器中途掛了, 建置就是失敗,要重跑。而且資料庫變成那個必須活著的東西——PostgreSQL 本身怎麼做高可用, Walis 沒有意見。