隨著現代應用程式在處理即時數據處理和檢索方面的需求不斷增加,擴展性也變得越來越重要。Elasticsearch 是一個開源的分佈式搜尋和分析引擎,非常有效地處理大型數據集和高速查詢。然而,有效擴展 Elasticsearch 的過程可能會很微妙,因為需要對其背後的架構和性能折衷有正確的理解。
雖然 Elasticsearch 的分佈式特性使其能夠水平擴展,但這也帶來了更多關於數據分佈和查詢處理的複雜性。與 Elasticsearch 擴展相關的一個理論挑戰是其本質上的分佈式特性。在大多數實際情況下,獨立節點上的讀取性能總是優於分片集群中的讀取性能。這是因為在分片集群中,數據所有權分散在多個節點上。這意味著每個查詢可能需要向不同節點發送多個請求,將結果聚合回協調節點,然後返回結果。這種額外的網絡開銷很容易導致與數據訪問簡單的單節點架構相比,增加的延遲。
在這方面,分片集群對於將 Elasticsearch 擴展到大型數據集、高流量和近實時索引至關重要。了解如何在節點之間分散數據並保持查詢延遲低的微妙平衡是實現最佳性能的關鍵。此外,本文還涵蓋了 Elasticsearch 擴展性的理論方面、集群性能優化的實際策略,以及從實際部署經驗中學到的教訓。
在 Swoo,我們的直播和遊戲應用程式中,Elasticsearch是所有搜索相關事項的支柱,隨著用戶增長,它一直運作良好。當平行用戶數超過 150,000 時,搜索頁面開始不時失敗,很明顯 Elasticsearch 集群中存在一些瓶頸。這對於直播遊戲環境來說很快變得無法接受,促使我們進行了一系列的優化,最終穩定了我們的搜索和首頁體驗。
了解 Elasticsearch 可擴展性的架構
Elasticsearch 原生支持分佈式架構,使系統高度可擴展,但與傳統單節點解決方案相比更為複雜。Elasticsearch 將數據劃分為索引,每個索引再分為分片。分片是 Elasticsearch 中的基本數據存儲和索引單元,因為系統在集群的多個節點上分發和並行化搜索操作。
一個典型的集群將包含多個數據節點,這些節點托管一部分數據並執行搜索查詢。默認情況下,Elasticsearch 可以自動跨節點分發數據,因此每個節點僅執行部分查詢負載。通過這種方式,Elasticsearch 水平擴展:通過簡單地向其中添加節點,處理更多數據並提供更多請求。
在設計Elasticsearch集群時,考慮到擴展性與查詢性能之間的折衷是非常重要的事情之一,特別是對於那些需要高寫入吞吐量和低讀取延遲的應用程序。這樣的挑戰確實需要仔細配置集群以及一系列優化技術的結合。
因此,在本質上,我們的Elasticsearch集群為Swoo的案例提供了一些數據節點和三個專用的主節點。每個節點運行在一個8核CPU和16 GB RAM上,主要用於即時索引和遊戲事件的即時搜索。由於我們在高並發下工作,我們需要提供非常大的網絡帶寬,以確保節點之間的最低延遲。
規劃您的擴展策略
換句話說,有效地擴展Elasticsearch需要分析當前性能指標,確定瓶頸,並設定明確的擴展性目標。例如,監控查詢延遲、吞吐量和集群健康狀況將是很好的做法,以便了解集群的限制。通過識別熱分片、CPU利用率的波動和內存問題,您將能夠創建優化路線圖。
另一個在擴展Elasticsearch時需要注意的重要活動是容量規劃。估算磁碟使用量、流量模式和數據保留要求將確保您的集群大小正確。一般來說,橫向擴展(添加節點到集群)通常是處理增加數據和流量量的最佳方法。然而,在這種情況下,垂直擴展-升級單個節點的資源-可能是有效的。
我們的預測顯示,活躍用戶每月將增長約10-15%,每個用戶在使用遊戲過程中將產生大量事件數據。根據這些預測,我們預計我們的集群將承受並行查詢的健康增長,並伴隨索引文檔量的增加。因此,我們分析了通過添加更多數據節點進行橫向擴展或通過升級我們當前節點進行垂直擴展,哪種方法對於這種增加更加合適。
核心擴展技術
Elasticsearch的優化將涉及多種策略,每種策略針對系統的不同方面。其中,最有效的技術包括數據輸入優化、分片管理和記憶體使用優化。
重點將集中在數據載入方面。Elasticsearch本身支持批量索引,這意味著您可以在一個請求中發送非常大的文檔批次。這樣可以減少開銷,通常能加快索引過程。其次,微調刷新間隔可能會在快速載入數據時起到關鍵作用。您可以將默認的刷新間隔(一秒)覆蓋為更高的值,比如十秒,因為這樣可以減輕集群過於頻繁刷新的壓力,從而加快寫入速度。
造成Elasticsearch可擴展性特點的其他重要原因包括分片管理。雖然Elasticsearch能夠通過分片進行水平擴展,但不適當的分片大小實際上會導致性能下降。分片數量過高或過低將導致索引速度和/或查詢性能下降。關鍵在於在Elasticsearch中實現最佳性能的平衡。
當然,內存管理也是Elasticsearch擴展的另一個非常重要因素。通過優化JVM堆大小、配置字段數據緩存和啟用查詢緩存,您可以減少資源消耗並提高查詢性能。正確使用內存和適當的緩存設置可以防止內存溢出錯誤並最小化垃圾回收開銷。
Elasticsearch 的許多負擔來自於持續插入即時遊戲數據。我們通過使用 Bulk API 進行文檔批處理來優化插入管道。在某些高峰負載期間,我們可以進一步增加批處理大小並增加刷新周期,以在近實時索引和一般集群穩定性之間達到適當的折衷。
高級擴展解決方案
當規模變得巨大時,Elasticsearch 需要更多先進的技術來確保性能。其中,查詢優化尤為重要。通過撰寫高效的查詢,最小化參與搜索的分片數量,您可以大大降低查詢延遲。例如,您可以通過自定義路由,使用鍵(如客戶 ID 或產品類別)將查詢路由到特定的分片。這樣可以避免 Elasticsearch 搜索所有分片,從而減少所用時間和資源。
ILM,或索引生命週期管理,是另一個可用於調優 Elasticsearch 的出色功能,隨著數據集的年齡增長,您可以將較舊的數據轉移到更慢、更便宜的存儲空間,同時保留最相關的數據在更快、更易訪問的存儲空間中,通過構建熱-溫-冷架構來進行擴展。這樣可以保持集群在不斷擴大的情況下的出色性能。
關於 Elasticsearch 可擴展性的最後討論話題是硬件考慮因素。隨著集群的擴大,您需要確保為增加的負載合理配置硬件。這意味著確保節點具有適當的 CPU、內存和磁盤 I/O 以高效運行。SSD 或 NVMe 驅動器將顯著提高性能,特別是對於需要高數據訪問速度的索引和搜索操作。
其中一個艱深的教訓是,將新索引僅分配給默認的 shard 數量會讓我們陷入熱點問題。我們還發現了一個甜蜜點,即沒有一個 shard 真正過載,由於來自我們遊戲平台的大量實時更新由重寫索引重新分配到多個較小的 shard,相應地調整副本。
理論見解和優化折衷
除了上述的實際優化之外,對於 Elasticsearch 的擴展還有一些有趣的理論考量。其中一個關鍵見解涉及分佈式系統內的可擴展性和查詢性能折衷。特別指出,雖然分片集群在水平方面是可擴展的,但它確實增加了查詢開銷,因為必須將來自多個節點的結果組合起來。這與數據存儲在本地機器上的單個節點形成對比,查詢可以在無需“與其他節點交談”的情況下執行。如果要設計需要在性能和可擴展性之間平衡的 Elasticsearch 集群,了解這種折衷是很重要的。
另一個更加理論性的 Elasticsearch 擴展方面是數據局部性的概念。您可以使用 preference=local
查詢參數僅對承載相關 shard 數據的本地節點運行查詢。這可以最大程度地減少節點間的通信,降低查詢延遲。這也可能減輕來自數據複製和負載平衡的挑戰。Elasticsearch 自適應副本選擇算法試圖通過在當前條件下選擇最佳副本節點來優化查詢的執行。然而,這並不一定帶來查詢的最有效執行。
我們在環境中經歷的第一波失敗與高JVM堆壓力有關。 Elasticsearch伺服器最初運行時使用了最小堆分配-在高查詢負載下導致相當頻繁的垃圾回收循環。我們通過調整JVM來解決這個問題,特別是將最小和最大堆大小調整為8 GB,這樣Elasticsearch就有足夠的空間來處理查詢而不會過度負擔堆。
常見問題和解決方案
當然,擴展Elasticsearch也不是沒有挑戰。人們應該避免的常見錯誤包括錯誤的分片大小、缺乏監控、過度依賴緩存以及未使用適當的索引生命周期管理。通過積極的配置調整及早診斷這些問題可以節省大量時間和資源。
其中一個主要問題是沒有調整Elasticsearch的默認設置,無論是在記憶體分配還是分片管理方面。在中等流量條件下默認設置運作正常,但在高峰流量下則不堪重負。我們的解決方案是多層次的:修改堆分配、熱索引複製和短期緩存以處理重複查詢。總的來說,這阻止了整個集群中的重複失敗,並顯著減少了超時。
實施指南
擴展Elasticsearch將涉及規劃、測試、部署以及隨後的維護。良好的實踐、配置模板以及在將新更改部署到生產環境之前對集群進行大量測試,將使您的集群能夠無問題地擴展成一個長期穩定的集群。
- 優化JVM參數。 我們在每個Elasticsearch伺服器上將Xms和Xmx都設置為8 GB,以在系統可用內存和堆需求之間取得平衡。
- 分片分佈優化。 將大型索引劃分為較小的分片,以防止熱點並對最活躍的索引進行複製擴展。 這確保了查詢流量在整個集群中均勻分佈。
- 啟用短TTL緩存。 我們在首頁上對頻繁使用的靜態查詢應用了1秒的緩存窗口,注意到這大大減少了對Elasticsearch的重複請求的負載,同時保持了實時響應性。
- 監控與迭代。 我們使用Kibana,配合一些自定義儀表板來實時觀察分片健康、JVM性能和查詢延遲。 根據這些指標,持續進行微調。
前瞻性計劃或技術堆棧擴展
此外,為了增長,我們希望通過將不太經常訪問的數據移至更便宜的節點,同時保留頂級硬件用於實時索引和查詢,來探索熱-暖-冷索引生命週期的管理。 我們正在研究先進的監控解決方案和AI驅動的異常檢測,以確保提前發現異常查詢中的尖峰或減速,而不會影響用戶體驗。
結論
Elasticsearch 的擴展需要對架構有深入的了解、仔細的規劃,並且實施最佳實踐。儘管 Elasticsearch 通過分片實現水平擴展,但也存在一些挑戰,必須維持在一定範圍內以確保最佳性能。通過適當的數據輸入、分片管理、內存使用和查詢優化,可以確保 Elasticsearch 集群具有高度擴展性和性能。
在我們的情況下,對於 Solr 來說,遷移到 Elasticsearch 也是必要的,毫無疑問,除了純粹的技術問題之外,一個重要的貢獻在於理解分散式系統中實際隱藏的理論困難。這種謹慎調整和創造性的問題可能會使整體系統得以大幅增長 — 一個跨供應商的單一 Elasticsearch 集群 — 通過提高查詢性能來應對每天接收數百萬次查詢的需求,大大降低響應時間。在將 Elasticsearch 部署擴展到長期成功的過程中,理論和實踐元素相互融合。
Source:
https://dzone.com/articles/how-to-scale-elasticsearch-to-solve-scalability-issues