【八股消消樂】Elasticsearch優化—檢索Labubu

在這里插入圖片描述

😊你好,我是小航,一個正在變禿、變強的文藝傾年。
🔔本專欄《八股消消樂》旨在記錄個人所背的八股文,包括Java/Go開發、Vue開發、系統架構、大模型開發、具身智能、機器學習、深度學習、力扣算法等相關知識點,期待與你一同探索、學習、進步,一起卷起來叭!

目錄

  • 題目
  • 答案
    • Elasticsearch 節點角色
    • 寫入數據
    • Translog
    • Elasticsearch 索引與分片
    • 簡歷準備
      • 限流保護節點
      • 利用消息隊列削峰
      • 保護協調節點
      • 雙集群

題目

💬技術棧:Elasticsearch

🔍簡歷內容:熟悉Elasticsearch節點角色、索引與分片基本原理。

根據業務定制Elasticsearch插件,實現基于內存使用率和CPU 使用率限流;針對xx業務實時性不高,引入消息隊列Kafka,通過監聽binlog并將生成消息丟到Kafka中,實現削峰和限流;針對高并發業務設計策略保護協調節點;設計簡易雙集群方案來替換CCR方案,成本節約了近80%。

🚩面試問:主分片是由主節點選出來的,那么主節點自己又是怎么選出來的呢?


在這里插入圖片描述

💡建議暫停思考10s,你有答案了嘛?如果你有不同題解,歡迎評論區留言、打卡。


答案

對于中間件,常見的兩個問題:

  1. 中間件是如何做到高可用/高性能的?
  2. 你在實踐中怎么做到高可用/高性能?

Elasticsearch 節點角色

Elasticsearch 的節點可以分成很多種角色,并且一個節點可以扮演多種角色。常見的有:

  • 候選主節點(Master-eligible Node):可以被選舉為主節點的節點。主節點主要負責集群本身的管理,比如說創建索引。類似的還有僅投票節點(Voting-only Node),這類節點只參與主從選舉,但是自身并不會被選舉為主節點。
  • 協調節點(Coordinating Node):協調節點負責協調請求的處理過程。一個查詢請求會被發送到協調節點上,協調節點確定數據節點,然后讓數據節點執行查詢,最后協調節點合并數據節點返回的結果集。大多數節點都會兼任這個角色。
  • 數據節點(Data Node):存儲數據的節點。當協調節點發來查詢請求的時候,也會執行查詢并且把結果返回給協調節點。類似的還有熱數據節點(Hot Data Node)、暖數據節點(Warm Data Node)、冷數據節點(Cold Data Node),你從名字就可以看出來,它們只是用于存儲不同熱度的數據。

在這里插入圖片描述

寫入數據

寫入數據的整體流程如下:

在這里插入圖片描述

  1. 文檔首先被寫入到 Buffer 里面,這個是 Elasticsearch 自己的 Buffer。
  2. 定時刷新到 Page Cache 里面。這個過程叫做 refresh,默認是 1 秒鐘執行一次
  3. 刷新到磁盤中,這時候還會同步記錄一個 Commit Point

數據遷移存在的問題:

  • 在寫入到 Page Cache 之后會產生很多段(Segment),一個段里面包含了多個文檔。文檔只有寫到了這里之后才可以被搜索到。
  • 不斷寫入會不斷產生段,而每一個段都要消耗 CPU、內存和文件句柄,所以需要考慮合并。

整個過程:

  1. 已有的段不動
  2. 創建一個新的段,把已有段的數據寫過去,標記為刪除的文檔就不會寫到段里面。
  3. 告知查詢使用新的段
  4. 等使用老的段的查詢都結束了,直接刪掉老的段。

在這里插入圖片描述

查詢怎么知道應該使用合并段了呢?

這都依賴于一個統一的機制,就是 Commit Point。你可以理解成,它里面記錄了哪些段是可用的。所以當合并段之后,產生一個新的 Commit Point,里面有合并后的段,但是沒有被合并的段,就相當于告知了查詢使用新的段

Translog

Elasticsearch 在寫入的時候,還要寫入一個東西,也就是 Translog。如果宕機了,Elasticsearch 可以用 Translog 來恢復數據

對比一下 MySQL 的寫入過程:

  • MySQL 寫入的時候,其實只是修改了內存里的值,然后記錄了日志,也就是 binlog、redo log 和 undo log
  • Elasticsearch寫入的時候,也是寫到了 Buffer 里,然后記錄了 Translog

不同的是,Translog 是固定間隔刷新到磁盤上的,默認情況下是 5 秒

在這里插入圖片描述

Elasticsearch 索引與分片

一個 Elasticsearch 的索引并不僅僅指倒排索引,還包括了對應的文檔。這個和關系型數據庫下的語義是不同的。Elasticsearch 的一個索引有多個分片,每個分片又有主從結構。

  • 一個索引就是一個邏輯表
  • 分片就是分庫分表
  • 每個分片都有主從結構,在分庫分表里面,一般也是用主從集群來存儲數據。

在這里插入圖片描述

簡歷準備

問題收集:

  • 你們公司有沒有使用 Elasitcsearch?用來解決什么問題?
  • 你用的 Elasticsearch 的性能怎么樣?讀寫流量多大?存儲的數據量又有多大?
  • 你創建的索引有多大?多少個分片?你是怎么確定分片數量的?
  • 你們公司有沒有使用一些措施來保證 Elasticsearch 的可用性?有沒有用過 Elasticsearch 的網關?
  • 你們公司的 Elasticsearch 有沒有出過問題?出了什么問題?最終又是怎么解決的?

Elasitcsearch 高可用的核心:

  • 分片,并且每個分片都有主從之分。萬一主分片崩潰了,還可以使用從分片,從而保證了最基本的可用性。
  • Translog,類似于 MySQL 里的 redo log。后面 Elasticsearch 崩潰之后,可以利用 Translog 來恢復數據。Elasticsearch 在寫入數據的過程中,為了保證高性能,都是寫到自己的 Buffer 里面,后面再刷新到磁盤上。所以為了降低數據丟失的風險,Elasticsearch 還額外寫了一個 Translog。

在 Elasticsearch 的基礎上,還可以做一些額外的優化,來保證 Elasticsearch 的高可用。

限流保護節點

通過 Elasticsearch 的插件機制來實現自定義的限流策略,例如設計一個限流插件,根據 Elasticsearch 當前的內存使用率和 CPU 使用率來判斷是否需要執行限流。不管是內存使用率還是 CPU 使用率,只要超過閾值一段時間,就觸發限流。

也可以考慮其他兩種策略,一種是在 Elasticsearch 之前加一個網關,查詢經過網關的時候會被限流、熔斷或者降級。當然,引代理也可以

在這里插入圖片描述

這里客戶端也可以進行限流,各個業務方需要限制住自己的查詢頻率,防止把整個 Elasticsearch 打崩,這種方式是最好落地的。

利用消息隊列削峰

場景:數據實時性要求不高。

方案:在業務方和 Elasticsearch 中間加入一個消息隊列。削峰和限流

優化前:雙寫,一方面寫數據庫,一方面寫 Elasticsearch。那么在業務高峰期,Elasticsearch 就會有性能瓶頸。

優化后:引入了消息隊列。業務方只是寫入數據庫就返回。然后我們監聽 binlog,并且生成消息丟到 Kafka 上。在這種情況下,Elasticsearch 空閑的話,消費速率就高;如果 Elasticsearch 性能比較差,那么消費就比較慢。這樣就起到了削峰和限流的效果。

在這里插入圖片描述
在這個架構的基礎上,還可以考慮引入降級,也就是在 Elasticsearch 真的有性能問題的時候,關閉一部分消費者。

我有兩類消費者寫入數據到 Elasticsearch。一類是核心數據消費者,一類是非核心數據消費者。如果我在監控到 Elasticsearch 性能已經比較差了,比如說寫入的時候會遇到超時問題,那么我就把非核心數據消費者停下來。等 Elasticsearch 恢復過來再啟動。

在這里插入圖片描述
對于大促或者秒殺這種活動中,你可以把整個數據同步都停掉,讓 Elasticsearch 只支持查詢操作。如果你所在的業務是電商類的,那么你可以考慮使用這個策略。

保護協調節點

問題:突發大請求打崩協調節點。

場景:你有一個查詢命中了十個分片,并且每個分片都返回了幾萬條數據,那么協調節點本身的資源使用量一下就會上去,甚至出現 CPU 100% 或者 OOM 等問題。

解決方案:如果公司內部資源比較多,那么可以考慮 部署純粹的協調節點。比如說專門部署一批節點,只扮演協調節點的角色。

在這里插入圖片描述

如果客戶端能夠判定自己是大請求,就將請求發送到純粹的協調節點上,否則發送到其他兼任的協調節點上。

好處:大請求即便把協調節點打崩了,也只會影響到其他大請求。但是占據絕大多數的普通請求,并不會受到影響。

在這里插入圖片描述

對 Elasticsearch 進行二次開發,可以修改協調節點的邏輯,讓協調節點在資源快不足的時候,直接拒絕這種大請求。

雙集群

鈔能力方案:直接使用付費的 CCR 跨集群復制。

簡單方案:假設有A、B兩個集群。

  • 使用消息隊列來保持雙寫。寫入的時候并不是直接寫入到 Elasticsearch,而是寫入到消息隊列,而后啟動兩個消費者,分別消費消息,然后寫到兩個集群 AB 里面。
  • 在查詢的時候,優先使用 A 集群,當確認 A 集群出了問題的時候,切換到 B 集群。

在這里插入圖片描述
如何實現自動切換:對 Elasticsearch 的客戶端進行了二次封裝。在封裝之后,正常情況下,會訪問集群 A。同時客戶端監控集群 A 的響應時間。如果響應時間超出預期,又或者返回了比較多超時響應,客戶端就會自動切換到集群 B 上。

在這里插入圖片描述


往期精彩專欄內容,歡迎訂閱:

🔗【八股消消樂】20250619:構建微服務架構體系—保證服務高可用
🔗【八股消消樂】20250615:構建微服務架構體系—鏈路超時控制
🔗【八股消消樂】20250614:構建微服務架構體系—實現制作庫與線上庫分離
🔗【八股消消樂】20250612:構建微服務架構體系—限流算法優化
🔗【八股消消樂】20250611:構建微服務架構體系—降級策略全總結
🔗【八股消消樂】20250610:構建微服務架構體系—熔斷恢復抖動優化
🔗【八股消消樂】20250609:構建微服務架構體系—負載均衡算法如何優化
🔗【八股消消樂】20250608:構建微服務架構體系—服務注冊與發現
🔗【八股消消樂】20250607:MySQL存儲引擎InnoDB知識點匯總
🔗【八股消消樂】20250606:MySQL參數優化大匯總
🔗【八股消消樂】20250605:端午節產生的消費數據,如何分表分庫?
🔗【八股消消樂】20250604:如何解決SQL線上死鎖事故
🔗【八股消消樂】20250603:索引失效與優化方法總結
🔗【八股消消樂】20250512:慢SQL優化手段總結
🔗【八股消消樂】20250511:項目中如何排查內存持續上升問題
🔗【八股消消樂】20250510:項目中如何優化JVM內存分配?
🔗【八股消消樂】20250509:你在項目中如何優化垃圾回收機制?
🔗【八股消消樂】20250508:Java編譯優化技術在項目中的應用
🔗【八股消消樂】20250507:你了解JVM內存模型嗎?
🔗【八股消消樂】20250506:你是如何設置線程池大小?
🔗【八股消消樂】20250430:十分鐘帶背Duubo中大廠經典面試題
🔗【八股消消樂】20250429:你是如何在項目場景中選取最優并發容器?
🔗【八股消消樂】20250428:你是項目中如何優化多線程上下文切換?
🔗【八股消消樂】20250427:發送請求有遇到服務不可用嗎?如何解決?

📌 [ 筆者 ]   文藝傾年
📃 [ 更新 ]   2025.6.20
? [ 勘誤 ]   /* 暫無 */
📜 [ 聲明 ]   由于作者水平有限,本文有錯誤和不準確之處在所難免,本人也很想知道這些錯誤,懇望讀者批評指正!

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84441.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84441.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84441.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何實現基于場景的接口自動化測試用例?

🍅 點擊文末小卡片,免費獲取軟件測試全套資料,資料在手,漲薪更快 自動化本身是為了提高工作效率,不論選擇何種框架,何種開發語言,我們最終想實現的效果,就是讓大家用最少的代碼&…

FreeRTOS 任務管理學習筆記

FreeRTOS 任務管理學習筆記 引言 本文檔旨在通過在STM32微控制器上使用FreeRTOS來理解和實現任務管理。實驗的重點是創建和管理多個任務、處理任務同步以及通過簡單的硬件接口控制任務狀態。 實驗概述 實驗涉及創建三個任務: LED1_Task: 每300毫秒切換一次LED。…

c++set和pair的使用

set是C中的一種關聯容器,具有以下特點: 存儲唯一元素(不允許重復) 元素自動排序(默認升序) 基于紅黑樹實現(平衡二叉搜索樹) 插入、刪除和查找的時間復雜度為O(log n) 前言 在C…

終端命令行執行具體的方法名測試用例

你可以使用如下命令單獨執行 test_mutation_login_by_email 方法:python3 manage.py test apps.login.test_client.LoginTestCase.test_mutation_login_by_email 注意事項: 路徑 apps.login.test_client 要與你項目實際的 Python 包路徑一致(即 test_client.py 文件所在的包…

20250620在Ubuntu20.04.6下編譯KickPi的K7的Android14系統

【處理SDK】 rootrootrootroot-X99-Turbo:~/Android14$ tar zxvf rk3576-android14.0-20250217.tar.gz rootrootrootroot-X99-Turbo:~/Android14$ ll rootrootrootroot-X99-Turbo:~/Android14$ rm rk3576-android14.0-20250217.tar.gz rootrootrootroot-X99-Turbo:~/Android1…

碳中和時代的家電革命,從華為智選IAM看科技企業的環保擔當

在"雙碳"戰略與品質消費浪潮的雙重加持下,家電產業正經歷一場前所未有的綠色革命。華為智選與空凈十大品牌IAM的深度協同,不僅構建了智能家電領域的技術新高地,更通過系統性創新持續拓展著行業可持續發展的想象空間。從凈水科技的突…

(C語言)Map數組的實現(數據結構)(鏈表)(指針)

源代碼&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h>// 鍵值對節點 typedef struct Node {char* key;int value;struct Node* next; } Node;// Map結構 typedef struct {Node* buckets[100]; // 固定大小的哈希桶&#xff08;…

Logback示例解析

<configuration><!-- 環境變量 --><springProperty scope"context" name"app.name" source"spring.application.name" defaultValue"application"/><!-- 日志存放路徑 --><property name"log.path&qu…

elementui響應式數據類型變更情況

背景。vue2。data中定義的響應數據類型是[]數組。應用在el-select中&#xff08;非multiple情況&#xff09;。當發生響應數據有變更渲染視圖時&#xff0c;發現定義的數組轉換成了字符串。 本身不是問題。但因為疏忽引發了watch監聽formData數據時產生了產生了多次監聽事件。…

人機融合智能 | 人智交互語境下的設計新模態

本章旨在探討技術與設計領域在人智交互語境下的關系及其影響,討論通過傳統設計對人智交互的優化方法。通過回顧大數據和發展趨勢,以 AI技術作為重要的技術推力,我們認為 AI技術將會在未來成為設計領域不可缺少的重要環節,并能夠幫助設計師更加高效、準確地開展設計工作。本章著…

C++設計模式分類(GOF-23種設計模式)

文章目錄 GOF-23 設計模式分類一、從目的分類1. 創建型&#xff08;Creational&#xff09;模式2. 結構型&#xff08;Structural&#xff09;模式3. 行為型&#xff08;Behavioral&#xff09;模式 二、從范圍分類1. 類模式&#xff08;Class Pattern&#xff09;2. 對象模式&…

AbMole| LY294002(M1925)

LY294002是一種廣譜的PI3K抑制劑&#xff0c;對PI3Kα/δ/β的IC50分別為0.5 μM/0.57 μM/0.97 μM。LY294002 也可以抑制 CK2 的活性&#xff0c;IC50 為 98 nM。LY294002 還是一種競爭性 DNA-PK 抑制劑&#xff0c;可逆結合 DNA-PK 的激酶結構域&#xff0c;IC50 為 1.4 μM…

第1章,[標簽 Win32] :第一個 WIn32 程序,MessageBox 函數

專欄導航 上一篇&#xff1a;第1章&#xff0c;[標簽 Win32] &#xff1a;第一個 WIn32 程序&#xff0c;程序入口 回到目錄 下一篇&#xff1a;無 本節前言 本節的學習&#xff0c;需要前兩節的內容作為先修知識。如果還沒有去看本專欄的前兩節&#xff0c;請你先去學習它…

求助帖:學Java開發方向還是網絡安全方向前景好

最近網絡安全被一個培訓機構吹得天花亂墜&#xff0c;雖然他家既有網安又有java和UI&#xff0c;我也是學軟件工程的&#xff08;山西某211&#xff0c;此機構是每年和我們學校合作的校企公司&#xff09;&#xff0c;但那里的老師仍然大力推薦我學網絡安全&#xff08;滲透、代…

OpenCV 圖像仿射變換之旋轉

一、知識點 1、void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags INTER_LINEAR, int borderMode BORDER_CONSTANT, …

HCIP-數據通信基礎

前言&#xff1a;本博客僅作記錄學習使用&#xff0c;部分圖片出自網絡&#xff0c;如有侵犯您的權益&#xff0c;請聯系刪除 本篇筆記是根據B站上的視頻教程整理而成&#xff0c;感謝UP主的精彩講解&#xff01;如果需要了解更多細節&#xff0c;可以參考以下視頻&#xff1a;…

C語言基本數據類型與變量詳解

# C語言基本數據類型與變量詳解 ## 數據類型概述 在C語言中&#xff0c;數據類型決定了變量在內存中的存儲方式和大小&#xff0c;以及可以對其執行的操作。合理選擇數據類型能夠提高程序的效率和準確性&#xff0c;避免內存浪費和數據溢出等問題。 C語言的基本數據類型主要包括…

Babylon.js學習之路《十、高級幾何體:自定義模型與復雜形狀生成》

文章目錄 1. 引言&#xff1a;高級幾何體的應用場景2. 參數化建模&#xff1a;Babylon.MeshBuilder2.1 擴展幾何體類型2.2 自定義多邊形&#xff08;ExtrudePolygon&#xff09; 3. 頂點級建模&#xff1a;自定義VertexData3.1 手動定義頂點數據3.2 動態生成地形&#xff08;高…

【趙渝強老師】Kubernetes的安全框架

Kubernetes集群的安全框架主要由以下認證、鑒權和準入控制三個階段組成。這三個階段的關系如下圖所示。 視頻講解如下 【趙渝強老師】Kubernetes的安全框架 認證&#xff08;Authentication&#xff09; 當客戶端與Kubernetes集群建立HTTP通信時&#xff0c;首先HTTP請求會進…

CDN與靜態資源優化

CDN與靜態資源優化 在現代Web系統和AI應用中&#xff0c;隨著用戶訪問量的不斷攀升&#xff0c;靜態資源&#xff08;如HTML、CSS、JavaScript、圖片、音視頻、模型文件等&#xff09;帶來的負載日益沉重。尤其在大模型推理、前端渲染、廣告投放等場景中&#xff0c;靜態資源的…