適用於此 Azure Well-Architected Framework 效能效率檢查清單建議:
| 體育:05 | 最佳化擴展和分割。 納入可靠且受控的縮放和分割。 工作負載的縮放單元設計是調整和分割策略的基礎。 |
|---|
本指南說明調整和分割工作負載的建議。 擴展是根據需求增加或減少分配給工作負載的資源的能力。 分割涉及將工作負載劃分為更小、可管理的單元,以在多個資源之間分配資料和處理。 未調整或分割的工作負載可能會在高需求期間遇到效能不佳,而在低需求期間可能會遇到未充分利用的容量。
定義
| 術語 | Definition |
|---|---|
| 自動縮放 | 根據預先定義的組態自動調整服務的容量限制的功能,允許其根據需要擴展或縮減。 |
| 容量 | 指定服務或功能的上限或最大容量。 |
| 用戶端親緣性 (工作階段親緣性) | 有意將請求從單一用戶端路由到單一伺服器實例,以幫助確保一致的會話管理。 |
| 一致性(分散式資料庫) | 分散式資料庫中多個節點的資料的一致性,確保所有副本在給定時間點具有相同的資料。 |
| 一致性 (關聯式資料庫) | 將資料庫從一個有效狀態帶到另一個有效狀態的交易屬性,以維護資料完整性。 |
| 一致性層級 | 定義在分散式資料庫系統中抄寫資料的方式和時間的配置,決定一致性與效能之間的權衡。 |
| 資料鎖定 | 用來防止同時更新相同資料的機制。 |
| 水平調整 | 新增指定資源類型執行個體的擴展方法。 |
| 樂觀並發控制 | 一種更新資料庫的方法,它使用快照來進行更新,而不是傳統的鎖定機制。 |
| Partitioning | 將資料實體分割成個別資料存放區的程式。 |
| Scalability | 工作負載動態變更其容量限制以適應不同需求層級的能力。 |
| 縮放單位 | 按比例調整在一起的資源群組。 |
| 狀態親和性 | 將用戶端工作階段資料儲存在單一伺服器上,以便同一伺服器處理來自相同用戶端的後續要求。 |
| 垂直調整 | 將運算容量新增至現有資源的擴展方法。 |
擴展和分割都有助於提高效能效率,確保資源得到有效使用,並且工作負載可以處理不同的負載。 這些做法在雲端環境中尤其重要,因為應用程式需要靈活並適應不斷變化的需求。 擴展可確保您可以擴充工作負載容量,以滿足不斷增長的需求。 分區可讓您有效地劃分任務或數據,以處理這些不斷增長的需求。 這兩個程式的基礎是工作負載的縮放單位設計。 它決定了您的工作負載應該如何增長和分配任務。 透過採用可靠且受控的擴展和分割方法,您可以避免潛在的工作負載效率低下。
最佳化擴展
最佳化擴展是調整伺服器、執行個體或資源數量以滿足工作負載波動需求的程序。 它確保工作負載可以處理增加的流量或需求,而不會遇到效能下降或停機。
選擇擴展策略
選擇擴展策略涉及在垂直或水平方法之間做出決定,以根據工作負載的特定要求增強工作負載的容量。 選擇正確的策略可確保有效調整資源以滿足工作負載需求,而不會過度使用或浪費。 若要選擇正確的擴展策略,您需要了解垂直和水平擴展的使用案例,以及它們如何滿足工作負載的需求。
了解垂直擴展。 使用垂直擴展,您可以增加單一資源的容量,例如升級至更大的伺服器或執行個體大小。 當工作負載可以從單一執行個體內增加的處理能力、記憶體或其他資源中受益時,垂直擴展非常有用。 垂直擴展適用於不容易分割成較小部分的工作負載,或應用程式架構不支援水平擴展。
了解水平擴展。 使用水平擴展,您可以新增更多執行個體或資源,以將工作負載分散到多個伺服器。 水平擴展提供了一些好處,例如提高彈性、增加容量以及處理增加的流量或工作負載需求的能力。 它對於設計為在多個節點上運行的雲原生應用程序非常有效。 水平擴展適用於可分割成獨立執行的較小部分的工作負載。
了解工作負載。 垂直或水平擴展的適用性取決於工作負載的特定特徵和要求。 在下列區域進行定期效能監控和測試,有助於隨時間最佳化擴展策略:
需求:透過考慮資源需求、可擴展性需求和工作負載限制等因素,了解工作負載的特定需求。
縮放單位:為預期一起縮放的元件建立縮放單位設計。 例如,100 個虛擬機器可能需要兩個佇列和三個儲存體帳戶來處理額外的工作負載。 縮放單位會是 100 個虛擬機器、兩個佇列和三個儲存體帳戶。 您應該獨立調整所有經歷容量使用量波動的元件。
架構:評估應用程式架構的設計。 某些應用程式可能本質上設計為水平擴展,其無狀態元件可以輕鬆分佈在多個實例之間。 其他應用程式可能具有具狀態元件或相依性,讓垂直擴展更合適。 評估工作負載的延展性和彈性需求。
設計要擴展的基礎設施
設計要擴展的基礎設施是創建一個架構的過程,該架構可以通過根據需要添加或調整資源來處理不斷增長的需求和工作負載。 它涉及規劃和實施可以水平或垂直擴展以適應成長的解決方案。 策略包括避免可能成為瓶頸的單例,以及解耦應用程式元件以確保獨立的可擴展性。 當您將工作負載設計為可擴展時,它可以有效地將工作負載分散到多個資源,從而防止瓶頸並最大限度地提高資源使用率。
避免單例。 您應該避免對整個工作負載使用單一集中式資源。 相反地,請將工作負載分散到多個資源,以獲得更好的可擴展性、容錯性和效能。 探索一些具體範例和設計考量,以避免工作負載資源中的單一:
基於佇列的負載平衡:不要依賴單一佇列來處理訊息,而是考慮將工作負載分割到多個佇列以分配處理負載。 它提供了更好的可擴展性和並行處理。
資料處理:單一模式通常出現在處理未扇出的資料處理場景中。將長時間執行的任務分解為較小的任務,這些任務可以更好地擴展,以將工作負載分散到多個資源並利用平行處理原則。
設計模式:扇出/扇入或管道和過濾器等設計模式有助於避免工作流程中的單例。 這些模式允許在多個資源之間分配處理任務,並提高可擴展性和靈活性。
解耦元件。 解耦應用程式元件是設計可擴展性的一個重要方面。 它涉及將應用程式分解為更小的獨立元件,這些元件可以根據特定的工作負載需求獨立運作和擴展。 例如,如果一個元件因需求增加而需要更多資源,您可以調整該元件而不影響其他元件。 這種靈活性確保了高效的資源分配並防止瓶頸。 透過解耦元件,您可以隔離故障並將對整個應用程式的影響降到最低。 如果一個元件發生故障,其他元件可以繼續獨立運作。
分離的元件更容易維護和更新。 可以對一個元件進行變更或更新,而不會影響其他元件,因為它們是獨立的。 請遵循下列指導方針,將應用程式元件解耦,以實現延展性:
關注點分離:確定應用程式的職責和功能。 根據職責的具體任務將職責劃分為單獨的組成部分。 例如,您可能有用於使用者驗證、資料處理和 UI 的個別元件。
鬆散耦合:設計元件以透過明確定義的介面和協定相互通訊。 這種設計減少了組件之間的依賴性,並允許更輕鬆地替換或擴展單個組件。
非同步通訊:使用非同步通訊模式(例如訊息佇列或事件驅動架構)進一步解耦元件。 這些模式允許元件按照自己的步調獨立處理任務,從而提高整體可擴展性。
微服務:考慮實作微服務,這是專注於特定業務功能的小型獨立服務。 每個微服務都可以獨立開發、部署和擴展,提供更大的靈活性和可擴展性。
設計應用程式以調整規模
當您擴展工作負載時,您應該設計應用程式來分散負載。 僅僅因為您可以在基礎結構層級新增更多複本,並不表示您的應用程式可以使用複本。 設計應用程式以擴展是關於建構應用程式,以便透過在資源之間分配工作負載來處理增加的需求。 如果可能,請避免使用需要單一執行個體的用戶端親和性、資料鎖定或狀態親和性的解決方案。 您想要將用戶端或程序遞送至具有可用容量的資源。 若要設計應用程式可擴展性,請考慮下列策略:
消除伺服器端工作階段狀態。 您應該盡可能將應用程式設計為無狀態。 針對具狀態應用程式,您應該使用伺服器外部的狀態存放區。 外部化階段作業狀態是在應用程式伺服器或儲存器外部儲存階段作業資料的作法。 您可以外部化會話狀態,將會話資料分散到多個伺服器或服務,從而在分散式環境中實現無縫會話管理。 外部化工作階段狀態時,請考慮下列事項:
評估您的工作階段需求。 了解需要儲存和管理的會話資料。 請考慮階段作業屬性、階段作業逾時,以及階段作業複寫或持續性的任何特定需求。 判斷工作階段狀態的大小,以及讀取和寫入作業的頻率。
選擇解決方案。 選擇符合您的效能和可擴展性需求的儲存解決方案。 選項包括使用分散式快取、資料庫或工作階段狀態服務。 做出選擇時,請考慮資料一致性、延遲和可擴展性等因素。
設定您的應用程式。 更新您的應用程式以使用所選的工作階段狀態儲存解決方案。 您可能需要變更應用程式的組態檔或程式碼,才能連線到外部儲存體服務。
更新您的邏輯。 變更應用程式的工作階段管理邏輯,以儲存和擷取外部儲存體解決方案的階段作業資料。 您可能需要使用儲存體解決方案提供的 API 或程式庫來管理階段作業狀態。
消除客戶親和力。 用戶端親緣性也稱為工作階段親和性或黏性工作階段。 當您消除用戶端親和性時,您會將用戶端要求平均分佈在多個複本或伺服器之間,而不會將所有要求從用戶端遞送至相同的複本。 此配置可以允許任何可用的複本處理請求,從而提高應用程式的可擴展性和效能。
檢閱您的負載平衡演算法。 負載平衡演算法可能會導致無意和人為的用戶端釘選,其中將太多請求傳送到一個後端實例。 如果演算法設定為一律將相同使用者的要求傳送至相同的執行個體,則可能會發生釘選。 如果請求彼此過於相似,也會發生這種情況。
消除資料鎖定。 資料鎖定可確保一致性,但有效能缺點。 它可能會導致鎖定升級,並對並行、延遲和可用性產生負面影響。 若要消除資料鎖定,您應該實作 樂觀並行。 非關聯式資料庫應該使用 樂觀並行控制 ,並具有正確的 一致性層級。 您的資料分割策略也應該支援您的並行需求。
使用動態服務探索。 動態服務發現是在分散式系統中自動偵測和註冊服務的過程。 它允許客戶端發現可用的服務,而無需與特定實例緊密耦合。 用戶端不應該能夠直接相依於工作負載中的特定實例。 若要避免這些相依性,您應該使用 Proxy 來分發和重新分發用戶端連線。 代理充當客戶端和服務之間的中介,提供一層抽象,允許在不影響客戶端的情況下新增或刪除服務。
使用背景工作。 當應用程式進行調整時,它可以處理不斷增加的工作負載或更多並行請求。 將密集型任務卸載為背景任務,可讓主應用程式處理使用者請求,而不會因資源密集型操作而壓垮它。 請遵循下列步驟,將工作卸載為背景工作:
在應用程式中尋找您可以卸載的 CPU 密集型和 I/O 密集型作業。 這些任務通常涉及繁重的計算或與外部資源(例如資料庫或網路操作)的互動。
設計您的應用程式以支援背景工作。 將密集工作與主要應用程式邏輯分離,並提供啟動和管理背景工作的機制。
使用適當的技術或框架實現後台任務處理。 包括程式語言或平台提供的功能,例如非同步程式設計、執行緒或任務佇列。 在單獨的任務或執行緒中包含密集操作,這些任務可以並發運行或排程以特定時間間隔運行。
如果背景工作很多,或者工作需要大量時間或資源,請分發背景工作。 如需一種可能的解決方案,請參閱競爭 取用者模式。
設定縮放
設定擴展是設定和調整參數的程序,以根據工作負載需求動態配置資源。 它包含使用自動擴展功能、了解服務擴展邊界和實施有意義的負載指標等策略。 正確的配置可確保應用程式能夠回應不同的需求,同時最大限度地提高效率。 當您設定擴展時,請考慮下列策略:
使用具有自動調整功能的服務。 自動調整功能會自動調整基礎結構以符合需求。 使用具有內建自動調整功能的平台即服務 (PaaS) 供應專案。 在 PaaS 上擴展的便利性是一個主要優勢。 例如,向外延展虛擬機器需要個別的負載平衡器、用戶端要求處理和外部儲存狀態。 PaaS 產品會處理大部分這些工作。
限制自動調整。 設定自動擴展限制,以盡量減少可能導致不必要成本的過度擴展。 有時您無法設定縮放限制。 在這些情況下,您應該設定警示,以便在元件達到最大縮放限制且過度縮放時通知您。
了解服務擴展界限。 當您了解服務擴展限制、增量和限制時,您可以在選擇服務時做出明智的決策。 擴展界限決定您選擇的服務是否可以處理預期的工作負載、有效率地擴展並滿足應用程式的效能需求。 要考慮的擴展界限包括:
擴展限制:擴展限制是位置或服務可以處理的最大容量。 請務必瞭解這些限制,以協助確保服務能夠容納預期的工作負載,並處理尖峰使用量,而不會降低效能。 每個資源都有一個規模上限。 如果您需要超出規模限制,您應該分割工作負載。
擴展增量:服務以定義的增量擴展。 例如,運算服務可能會依執行個體和 Pod 進行調整,而資料庫可能會依執行個體、交易單位和虛擬核心進行調整。 了解這些增量對於優化資源分配並防止資源抖動非常重要。
擴展限制:某些服務可讓您擴展或擴展,但限制了自動反向擴展的能力。 您必須手動縮減,或可能必須重新部署新資源。 這些限制通常是為了保護工作負載。 縮減或縮減可能會對工作負載的可用性和效能產生影響。 服務可能會強制執行某些限制或限制,以協助確保工作負載有足夠的資源來有效運作。 這些限制可能會影響資料的一致性和同步性,特別是在分散式系統中。 服務可能具有適當的機制,可在相應放大或相應放大期間處理資料複寫和一致性,但可能無法提供相同層級的縮減或縮減支援。
使用有意義的負載指標。 擴展應使用有意義的負載指標作為擴展觸發器。 有意義的負載指標包括簡單的指標,例如 CPU 或記憶體。 它們還包括更高級的指標,例如隊列深度、SQL 查詢、自定義指標查詢和 HTTP 隊列長度。 請考慮使用簡單和進階負載指標的組合作為擴展觸發器。
使用緩衝區。 緩衝區是未使用的容量,可用來處理需求尖峰。 精心設計的工作負載針對工作負載的意外尖峰進行規劃。 您應該新增緩衝區來處理水平和垂直縮放的尖峰。
防止拍打。 翻動是一種迴圈條件,當一個縮放事件觸發相反的縮放事件時,就會發生這種情況,從而創建連續的來回縮放動作。 例如,如果縮減減少執行個體數目,可能會導致其餘執行個體的 CPU 使用率上升,從而觸發橫向擴充事件。 反過來,橫向擴充事件會導致 CPU 使用率下降,重複此過程。
請務必在橫向擴充和縮減臨界值之間選擇足夠的邊界,以避免變動。 您可以設定提供 CPU 使用率顯著差異的臨界值,以防止頻繁且不必要的橫向縮減和橫向擴展動作。
使用部署戳記。 有一些技術可讓您更輕鬆地擴展工作負載。 您可以使用 部署戳記 模式,藉由新增一或多個縮放單位,輕鬆調整工作負載。
風險:雖然擴展有助於透過調整容量來滿足需求來優化成本,但在長期高需求期間,它可能會導致整體成本增加。
測試縮放
測試擴展涉及在受控環境中模擬各種工作負載場景,以評估工作負載如何響應不同級別的需求。 它有助於確保工作負載有效擴展,在不同負載期間最大限度地提高性能效率。
您需要確保您的工作負載在實際條件下有效擴展。 在反映生產設定的環境中執行負載和壓力測試至關重要。 這些測試在非生產環境中進行,可讓您評估垂直和水平擴展策略,並判斷哪一種策略最有效地最佳化效能。 以下是測試縮放的建議方法:
定義工作負載案例。 識別您需要測試的關鍵工作負載案例,例如增加使用者流量、並行請求、資料量或資源使用量。
使用類似生產環境的測試環境。 建立個別的測試環境,在基礎結構、組態和資料方面與生產環境非常相似。
設定效能指標。 定義要測量的效能指標,例如回應時間、輸送量、CPU 和記憶體使用率,以及錯誤率。
開發測試案例。 開發模擬不同工作負載場景的測試案例,逐漸增加負載以評估各個層級的效能。
執行和監控測試。 使用定義的測試案例執行測試,並在每個負載層級收集效能資料。 監控工作負載行為、資源消耗和效能降低。
分析和優化擴展。 分析測試結果以識別效能瓶頸、可擴展性限制或需要改進的領域。 優化配置、基礎設施或程式碼以增強可擴展性和效能。 擴展需要一些時間才能完成,因此請測試擴展延遲的影響。
解決依賴關係。 尋找潛在的相依性問題。 在工作負載的一個區域中擴展或分割可能會導致相依性發生效能問題。 工作負載的可設定狀態部分 (例如資料庫) 是相依性效能問題的最常見原因。 資料庫需要仔細設計才能水平擴展。 您應該考慮採取措施,例如 樂觀並行 或資料分割,以使資料庫的輸送量更高。
調整後重新測試。 實作最佳化之後,請重複延展性測試,以驗證改進,並協助確保工作負載能夠有效率地處理預期的工作負載。
取捨:考慮工作負載的預算限制和成本效益目標。 垂直擴展可能涉及更高的成本,因為需要更大、更強大的資源。 水平擴展可使用可根據需求新增或移除的較小執行個體,以節省成本。
分割區工作量
分割是將大型資料集或工作負載分割成更小、更易於管理的部分(稱為分割區)的過程。 每個分割區都包含資料或工作負載的子集,而且通常會個別儲存或處理。 分割可實現並行處理並減少爭用。 將工作量劃分為較小的單元,可讓應用程式獨立處理每一個單元。 結果是更好地利用資源和更快的處理時間。 分區還有助於將資料分佈在多個儲存設備之間,從而減少單一設備的負載並提高整體效能。
瞭解分割區
您使用的特定分割方法取決於您擁有的資料或工作負載類型,以及您使用的技術。 一些常見的分割策略包括:
水平分割:在這種方法中,資料集或工作負載會根據特定條件進行劃分,例如值範圍或特定屬性。 每一個分割區都包含符合定義準則的資料子集。
垂直分割:在此方法中,資料集或工作負載會根據特定屬性或資料行進行分割。 每個分割區都包含列或屬性的子集,以便更有效率地存取所需的資料。
功能分割:在這種方法中,根據需要執行的特定功能或操作來劃分資料或工作負載。 每個分割區都包含特定功能所需的資料或元件,從而實現最佳化的處理和效能。
規劃分割
分割時,請務必考慮資料散發、查詢模式、資料成長和工作負載需求等因素。 正確的規劃和設計對於幫助確保分割區的有效性並最大限度地提高效能效率至關重要。 如果您事後才想到分割,則更具挑戰性,因為您已經有即時工作負載需要維護。 您可能需要變更資料存取邏輯、跨分割區配送大量資料,以及支援資料配送期間的持續使用。
實作分割
在決定要使用哪種類型的分割時,分析資料的特性、存取模式、並行需求和可擴展性目標非常重要。 每種類型的分區都有其自身的優點和注意事項。 以下是每種類型的分割需要考慮的一些因素:
當您想要將資料分散到多個資源或伺服器以獲得更好的延展性和效能時,水平分割是合適的。 當工作負載可以在每個分割區上平行處理和獨立處理時,它會很有效。 當多個使用者或進程需要能夠同時存取或更新資料集時,請考慮水平分割。
當經常存取某些屬性或資料行,而存取頻率較低的屬性或資料行時,垂直分割是合適的。 垂直分割允許透過最大限度地減少不必要的資料檢索來有效存取所需的資料。
當不同的函數需要不同的資料子集,且可以獨立處理時,功能分割是適當的。 功能分割區可以透過允許每個分割區專注於特定操作來優化效能。
測試和最佳化分割
測試分割方案以驗證策略的有效性和效率,以便您可以進行調整以提高效能。 測量回應時間、輸送量和可擴展性等因素。 將結果與效能目標進行比較,並識別任何瓶頸或問題。 根據分析,識別潛在的最佳化機會。 您可能需要跨分割區重新分配資料、調整分割區大小或變更分割條件。
取捨:分割會增加工作負載設計和開發的複雜性。 分割需要開發人員和資料庫管理員之間的對話和規劃。
風險:分割引入了一些需要考慮和解決的潛在問題,包括:
資料傾斜:分割區可能會導致資料傾斜,即某些分割區與其他分割區相比接收的資料或工作負載量不成比例。 資料偏差可能會導致效能不平衡,並增加特定分割區的爭用。
查詢效能:設計不當的分割區配置可能會對查詢效能產生負面影響。 如果查詢需要跨多個分割區存取數據,則可能需要分割區之間的額外協調和通信,從而導致延遲增加。
Azure 促進
優化擴展。 Azure 具有支援垂直和水平調整的基礎結構容量。 Azure 服務有不同的效能層,稱為 SKU。 SKU 可讓您垂直調整。 許多 Azure 的資源都支援自動調整或其他就地調整選項。 某些資源支援進階指標或自訂輸入,以支援微調擴展行為。 Azure 中的大部分調整實作都可以設定限制,並支援必要的可觀察性,以警示變更。
Azure 監視器 可讓您監視應用程式和基礎結構中的各種計量和條件。 您可以使用 Monitor 根據預先定義的規則觸發自動擴展動作。 例如,在 Azure Kubernetes Service (AKS) 中,您可以使用監視來啟用水平 Pod 自動調整 (HPA) 和叢集自動調整。 使用 Monitor 的監視和警示功能,您可以有效地促進 Azure 中的調整,並協助確保您的應用程式和基礎結構可以動態調整以滿足需求。
您也可以在 Azure 中建置自訂自動調整。 您可以在監視中針對沒有自動調整功能的資源使用警示。 這些警示可以設定為以查詢為基礎或以計量為基礎,而且可以使用 Azure 自動化來執行動作。 自動化提供平台,可在 Azure、雲端和內部部署環境中裝載和執行 PowerShell 和 Python 程式碼。 它提供的功能包括隨需部署或按排程部署 Runbook、執行歷史記錄和記錄、整合式秘密存放區和原始檔控制整合。
設計應用程式以調整:以下是 Azure 協助應用程式調整設計的一些方式;
消除資料鎖定:在 Azure SQL 資料庫中,您可以啟用 最佳化鎖定 ,以改善需要嚴格一致性的資料庫的效能。
使用背景工作:Azure 提供實作背景作業的服務和指引。 如需詳細資訊,請參閱 背景作業。
實作負載平衡:Azure 提供不需要用戶端親和性的負載平衡器。 這些負載平衡器包括 Azure Front Door、 Azure 應用程式閘道和 Azure 負載平衡器。
分割工作負載:Azure 為不同的資料存放區提供各種分割策略。 這些策略透過將資料分佈到多個分割區來幫助提高效能和可擴展性。 如需詳細資訊,請參閱 資料分割區策略。
相關連結
效能效率檢查清單
請參閱完整的建議集。