[英]Azure deployment slots and database migrations
TLDR:
如何在臨時插槽中運行的應用程序知道它是否正在升級並連接到測試數據庫上的測試數據庫/運行遷移? 而且,臨時插槽中的同一個應用程序如何自動意識到它已被交換到實時生產槽並且現在負責實時業務操作? (因此它可以切換到使用實時數據庫,遷移實時數據庫等)
長版:
該主題部分由以下問題涵蓋: Azure Web App部署插槽,具有數據庫遷移功能
但我沒有真正得到我的答案..
我的應用程序使用FluentMigrator,在應用程序初始化時由事件/代碼啟動,以運行數據庫遷移。 MSBuild曾經這樣做,但現在我很確定它是以編程方式調用的
似乎最明智的是:
如果登台具有破壞數據庫以便生產理解的遷移,我看不到任何其他方式讓生產保持功能,同時正在證明分段; 兩個DB必須分開
因此,如果數據庫是分開的,那么切換世界到使用暫存插槽中的代碼的唯一(幾乎)零停機方式是,如果交換機導致應用程序重新初始化並更改它以使其指向生產數據庫,然后fluentmigrator(也應該再次調用)可以將同一組遷移應用於生產,並且staging中的代碼在生產數據庫上運行一段時間的業務。
..production codebase已更新,並且發生了回調。 生產代碼永遠不會遷移生產數據庫,因為在生產中的新版本啟動時,它已經由暫存代碼更新
我預見到的事情唯一的另一種方法是擁有兩個DB,兩個插槽,而且你永遠不會執行交換; 您只需部署到暫存,它會更新暫存數據庫,您進行測試並證明是好的,您部署到生產中,它會更新產品數據庫,驗證應用程序正常工作......並且世界在生產時遭受了少量的停機時間(如果構建失敗,則為主要數量)
前者有機制嗎? 當交換發生時,應用程序如何指向新數據庫以及如何再次運行遷移?
如果后者是唯一的方式,那么部署插槽也可能只是另一個Web應用程序,對吧? 用於登台的Web應用程序和用於prod的Web應用程序,以緩解由於它們在門戶中的表示方式而導致的任何混淆槽。
可以通過暫存和生產Azure App Service插槽共享單個生產數據庫,並且仍然可以實現零停機時間部署。
為此,您需要確保所有遷移都向后兼容 ,以便Web應用程序的當前版本和新版本可以與同一數據庫同時運行。 這意味着您可以部署到暫存插槽,對生產數據庫執行冒煙測試,然后交換生產槽的暫存插槽。
允許此工作的一些規則:
當您確實需要進行破壞性更改(例如刪除列)時,您需要有2個版本:
這聽起來像是痛苦,但在實踐中,你可能不會發現自己經常進行破壞性的改變。
我最近一直在解決類似的問題。 我的情況更容易,我只部署到持有數據庫的內容,而數據收集站在一邊而不被觸摸(一旦我們必須升級它們將是具有挑戰性的)。
但是,我們想出了一個似乎是我們最好的解決方案。 我們進行插槽部署,同時在彈性池中有兩組dbs(幾乎沒有任何額外成本),而每個插槽指向一組dbs。 當我們進行部署時,我們更新代碼和插槽相關的數據庫,進行測試以驗證它是否全部工作,然后進行交換 - 代碼和數據庫。 這意味着在交換之后,部署槽中的代碼生效,它指向我們測試過的dbs,而之前的實時代碼和數據庫集不是脫機的,可以進行另一次部署。
我們可以提供這種舒適性,因為dbs中的數據完全在我們的控制之下,因此我們可以阻止在部署和交換之間編寫數據庫。
但是,如果您的數據庫正在從實時應用程序收集數據,您可能會考慮在升級時關閉應用程序,將實時數據合並到暫存數據庫,升級暫存數據庫(已包含最新數據)然后進行交換。 在我看來,這是防止數據丟失最安全的方法。 您還可以先遷移暫存數據庫,然后關閉應用程序並將數據合並到新模式中,具體取決於應用程序的特性,而不知道您的確切情況,在此處提供通用建議非常復雜。
希望這些想法至少對你有所幫助,如果你已經找到了一些更好的方法,我很想知道它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.