Knock於最近從Postgres 11.9升級至15.3版本時,透過邏輯複製(logical replication)、一套支援腳本,以及在Elixir和Erlang的BEAM虛擬機器上的工具,實現了零停機時間升級。Knock依賴Postgres來支持其通知工作流引擎,從儲存工作流配置和訊息模板到處理數百萬筆日誌,Postgres是其系統核心的一部分。
升級關聯式資料庫如Postgres通常需要至少重啟資料庫。對於重大版本升級,資料庫經常需要完全關閉數分鐘以升級磁碟上的資料儲存和索引方式【8†來源】。為了避免任何停機時間,Knock採用了基於複製的升級方法。此方法涉及設置新資料庫的PUBLICATION
和舊資料庫的SUBSCRIPTION
,並逐一添加表格到發行端(publication),直到全部複製完成後,再測試以確保沒有風險,最後將應用程式指向新資料庫。
針對不同大小和特性的表格,Knock採用了不同的策略。例如,對於小型表格,可以直接添加到發行端並更新訂閱;對於大型、僅附加(append-only)的表格,則先複製未來的變更,然後從備份或快照中回填舊資料;對於大型且經常更新的表格,則需要更多的關注和照顧。
在整個升級過程中,Knock需要密切監控系統性能,以確保不會影響到服務的可靠性。最終,在確保新舊資料庫的資料一致後,Knock通過一系列精心設計的腳本實現了向新資料庫的平滑過渡。