原文:https://mp.weixin.qq.com/s/FVbjGTvZP97u5CAydDx7dwjava
Elasticsearch(ES)是近年來煊赫一時的開源分佈式搜索分析引擎,經過簡單部署,它能夠輕鬆實現日誌實時分析、全文檢索、結構化數據分析等多重訴求,並將挖掘數據價值的成本大幅下降。程序員
ES在騰訊內部和騰訊雲用戶中擁有豐富的大規模落地場景,它們持續地推進着原生ES朝着高可用、高性能、低成本的方向優化。本文即將介紹騰訊在ES的應用落地過程當中,遇到的挑戰、優化思路、優化成果和將來探索方向,但願能爲開發者們提供參考。面試
運營日誌:如慢日誌、異常日誌(用來定位業務問題);
算法
業務日誌:如用戶的點擊、訪問日誌(用來分析用戶行爲);
api
審計日誌:可用於安全分析。
數組
Elastic生態完整:任何一個開發者,可經過簡單部署成熟的組件,搭建起一個完整的日誌實時分析系統。
緩存
時效性極高:日誌從產生到可訪問的耗時通常在10S級。相比於傳統大數據解決方案几十分鐘~幾小時的耗時,時效性提升了數百倍。
安全
靈活的搜索分析能力:因爲支持倒排索引、列存儲等數據結構,ES擁有很是靈活的搜索分析能力。
服務器
搜索響應時間短:ES支持交互式分析,即便有萬億級的日誌,其搜索響應時間也是秒級。
網絡
典型場景以下:
商品搜索:即各大電商平臺中的商品搜索;
高性能:單個服務最大達到 10w+ QPS,平均響應時長約20ms,P95延時小於100ms。
強相關:搜索體驗主要取決於「搜索結果」與「用戶意圖」之間的匹配度,可經過正確率、召回率等指標進行評估。
高可用:搜索場景一般要求4個9的可用性,並支持單機房故障容災。
Metrics:即傳統的服務器監控。
APM:應用性能監控。
傳感器數據:由物聯網數據,智能硬件、工業物聯網等產生。
高併發寫入:線上單集羣最大規模高達 600+節點,寫入吞吐量爲1000w/s 。
高查詢性能:要求單條曲線或者單個時間線的查詢延時在10ms級。
多維分析:要求靈活、多維度的統計分析能力,如在查看監控時,能夠按照地域、業務模塊等不一樣維度進行統計分析。
在業界,ES的主要應用場景更多見於電子商務平臺上,好比對商品、標籤、店鋪的搜索。
年GMV達到200億的電子商務網站M就是一個典型的例子,它在ES的應用場景也很是普遍,包括商品搜索推薦、日誌分析監控、統計分析等。其業務團隊運行着幾十個ES集羣,而且規模不斷在增加。
高可用:以電商搜索、APP 搜索、站內搜索爲例,它們重視可用性,服務SLA爲4個9以上,須要考慮單機故障、單機房網絡故障等災備場景。
高性能:它們對性能有極高的標準,如 20w QPS、平響 20ms、P95延時100ms。
時序類場景包含日誌、Metrics、APM 等。相比於搜索類業務聚焦高可用、高性能的問題,時序類業務會更注重成本、性能。
1系統健壯性:指 ES 內核自身的健壯性,這也是分佈式系統面臨的共性難題。例如:
2.容災方案:如經過建設管控系統,保障機房網絡故障時快速恢復服務、天然災害下防止數據丟失、誤操做後快速回滾等。
3.系統缺陷:這是任何系統在發展的過程當中都不可避免的問題,好比Master 節點堵塞、分佈式死鎖、滾動重啓緩慢等。
服務不穩定:經過服務限流,容忍機器網絡故障、異常查詢等異常狀況。
集羣擴展性問題:經過優化集羣元數據管控邏輯,提高了10倍的集羣擴展能力,支持千級節點集羣、百萬分片;
集羣均衡問題:經過優化節點、多硬盤間的分片均衡,保證大規模集羣的壓力均衡。
數據可恢復:
經過擴展 ES 的插件機制支持備份回檔,把 ES 的數據備份回檔到廉價存儲,保證數據的可恢復;
故障容忍:
騰訊雲ES支持跨可用區容災,用戶能夠按需部署多個可用區,以容忍單機房故障。
此外,騰訊雲ES還支持COS備份的功能,用戶能夠經過操做ES的api,直接備份底層的數據文件到騰訊雲對象存儲COS上,實現了低成本、操做簡便的數據備份功能。
異常恢復:
經過垃圾桶機制,保證用戶在欠費、誤操做等場景下,集羣可快速恢復。
在服務限流部分,騰訊作了 4 個層級的限流工做:
權限層級:優化後,ES支持 XPack 和自研權限來防止攻擊和誤操做;
隊列層級:經過優化任務執行速度、重複、優先級等細節,解決用戶常常遇到的Master 任務隊列堆積、任務餓死等問題;
內存層級:從ES 6.x 開始,支持在全鏈路上( 包括HTTP 入口、協調節點、數據節點等)進行內存限流:同時使用 JVM 內存、梯度統計等方式進行精準控制;
多租戶層級:使用 CVM/Cgroups 方案保證多租戶間的資源隔離。
這裏展開介紹下聚合場景限流的問題,用戶在使用 ES 進行聚合分析時,常常因聚合分桶過多打爆內存。官方在 ES 6.8 中提供 max_buckets 參數控制聚合的最大分桶數,但這個方式侷限性很是強:內存是否會被打爆還取決於單分桶的大小(在某些場景下,用戶設置 20 萬個分桶能夠正常工做,但在另外一些場景下,可能 10 萬個分桶內存就已經打爆),所以用戶並不能準確把握該參數應設置爲多少。此時騰訊採用梯度算法進行優化,每分配 1000 個分桶檢查一次 JVM 內存,當內存不足時及時中斷請求,保證了ES集羣的高可用。
基於這些瓶頸分析和數據訪問特性,成本優化的解決方案以下:
(1)採用冷熱分離架構,使用混合存儲的方案來平衡成本、性能;
(2)既然對歷史數據一般都是訪問統計信息,那麼經過預計算來換取存儲和性能;
(3)若是歷史數據徹底不使用,能夠備份到更廉價的存儲系統;
(4)基於時序數據的訪問特性,內存成本方面能夠利用 Cache 進行優化。
(5)其餘一些優化方式:如存儲裁剪、生命週期管理等。
這裏展開介紹下 Rollup 部分。Rollup 相似於大數據場景下的Cube、物化視圖,它的核心思想是經過預計算提早生成統計信息,釋放原始粒度數據,從而下降存儲成本、提升查詢性能。這裏舉個簡單的例子:在機器監控場景下,原始粒度的監控數據是10 秒級的,而一個月以前的監控數據,通常只需查看小時粒度,這便是一個 Rollup 應用場景。官方從 ES 6.x 開始推出 Rollup,實際上騰訊在 5.x 已經着手研究。
前文說起不少用戶在使用大存儲機型時,內存優先成爲瓶頸、硬盤不能充分利用,這類問題主要瓶頸在於索引佔用大量內存。考慮到時序類場景不多訪問歷史數據,部分場景下某些字段基本不使用,所騰訊經過引入 Cache 來提升內存利用效率。
(1)寫入優化:針對主鍵去重場景,利用索引進行裁剪,加速主鍵去重的過程,使寫入性能提高 45%。此外,經過向量化執行優化寫入性能,經過減小分支跳轉、指令 Miss,也是騰訊探索中的方向之一,預計性能可提高1倍。
(2)CPU利用率優化:針對部分壓測場景下 CPU 不能充分利用的問題,經過優化 ES 刷新 Translog 時的資源搶佔,使性能提高 20%。
(3)查詢優化:經過優化 Merge 策略提高查詢性能。基於每一個 Segment 記錄的 min/max 索引進行查詢剪枝,提高了30%的查詢性能 。經過CBO策略,避免查詢 Cache 操做致使查詢耗時10+倍的毛刺。此外,經過一些新硬件(如英特爾的 AEP、Optane、QAT 等)來優化性能也是不錯的探索方向。
下面,詳細談談Merge 策略優化部分:ES 原生的 Merge 策略主要關注大小類似性(Merge 時儘可能選擇大小類似的 Segments)和最大上限(考慮儘可能把 Segment 拼湊到 5GB)。那麼有可能出現:某個Segment中包含了1月整月、3月1號的數據,當用戶查詢3月1號某小時的數據時,就必須掃描大量無用數據,導致性能損耗嚴重。
以大數據圖譜爲思路,整個大數據領域按照數據量、延時要求等特色,能夠分爲三部分:
(1) DataEngineering,包含你們熟悉的批量計算、流式計算;
(2) DataDiscovery,包含交互式分析、搜索等;
(3) DataApps,主要用於支撐在線服務。
雖然 ES 被視爲搜索領域內的技術,可是 ES 也支持在線搜索、文檔服務等場景;另外,有很多成熟的 OLAP 系統,也是基於倒排索引、行列混存等技術棧。由此能夠看出, ES 往這兩個領域發展的可行性很是強。所以,騰訊會重點朝「在線服務」和「OLAP 分析」等方向探索ES技術。
歡迎你們關注個人公衆號【程序員追風】,2019年多家公司java面試題整理了1000多道400多頁pdf文檔,文章都會在裏面更新,整理的資料也會放在裏面。
喜歡文章記得關注我點個贊喲,感謝支持!