從源碼角度了解Elasticsaerch(分布式協調排序、深分頁問題)

引文

Elasticsearch基于Lucene所以很多系統實現都在其中,所以可以先看看Lucene的實現:
https://blog.csdn.net/qq_35040959/article/details/147931034

項目組件

不像Kafka這種頂級項目核心性能組件全自己實現,ELK中有很多引用至第三方開放庫;

網絡模型-Netty

網絡模型多重要不必多說,Elasticsearch基于Netty,一個認可度&社區活躍度都非常高的NIO多路復用模型;

存儲模型-Lucene

Elasticsearch基于Lucene上提供分布式服務;具體可以看看這篇文章對存儲模型的介紹
https://blog.csdn.net/qq_35040959/article/details/147931034

分布式查詢

//GET http://localhost:9200/my-index-000001/_search
{"from": 10, //第二頁"size": 10, //查詢十條"_source": ["title", "priority"], //指定字段返回"query": {"bool": {"must": [{ "match": { "title": "guide" } }//全匹配]}}
}

構建查詢
org.elasticsearch.action.search.TransportSearchAction#executeSearch

分發到每個shard
org.elasticsearch.action.search.AbstractSearchAsyncAction#run

發送shard請求
org.elasticsearch.transport.TransportService#sendLocalRequest

單條查詢(查詢Lucene)
org.elasticsearch.search.query.QueryPhase#searchWithCollector

[Query]階段查詢結果,只包含指定范圍的score與docid
org.elasticsearch.action.search.QueryPhaseResultConsumer#consumeResult

聚合數據(對多個shard的數據聚合排序后決定實際獲取的)
org.elasticsearch.action.search.FetchSearchPhase#innerRun -> resultConsumer.reduce();

[Fetch]階段,讀取指定docid文檔
org.elasticsearch.action.search.FetchSearchPhase#executeFetch

[Query]&[Fetch]步驟基于Lucene的相關性查詢與指定docid查詢

深分頁-search_after分頁查詢

**<<分布式查詢>>**是基于相關性的查詢,這種查詢會掃描倒排表構建K-TOP堆,這種方法在深頁后(如10000頁后)查詢成本非常高;

search_after必須指定"sort"排序字段后通過"search_after"定位在排序中的其實位置,這種方式沒有構建K-TOP的流程,定位到指定的排序偏移量后直接獲取,更加快速;
缺點就是不再是相關性排序;

//GET http://localhost:9200/my-index-000001/_search
{"from": 0,   "size": 10,     "_source": ["title", "priority"], "query": {"bool": {"must": [{ "match": { "title": "guide" } }]}},"sort": [{ "_id": "asc" } //強制要求:指定排序(不難理解:沒有固定的排序規則,那么給定的search_after將沒法用于排查此前已經吐出的數據)],"search_after": [ "QHHnZ5cBTxKf9WaM2zpf"]  //強制要求:上一頁最后一條文檔_id
}

基于DocValues實現

深分頁-scroll查詢

search_after不是基于快照,會受到同步數據插入影響,scroll查詢對索引打快照;

資源占用與性能對比:

特性Scroll APISearch After API
上下文維護需要維護 _scroll_id 上下文無上下文,僅需傳遞排序值
內存占用高(需緩存快照和游標狀態)低(無持久化狀態)
CPU 開銷低(順序掃描,無需動態排序)中等(需動態定位排序值位置)
網絡傳輸批量高效(適合大數據量導出)單頁高效(適合高頻分頁請求)

實時性與一致性對比

特性Scroll APISearch After API
數據一致性強一致性(基于快照,數據靜態)弱一致性(實時數據,可能變化)
反映更新否(快照期間索引更新不可見)是(每次查詢讀取最新數據)
適用場景全量導出、離線分析(如日志備份)實時分頁、深度檢索(如用戶搜索)

todo 快照原理

一致性協議

分布式問題

主節點

Elastic有一下節點角色[Master Node(主節點)]、[Data Node(數據節點)]、[Coordinating Node(協調節點)]三個核心角色(還有其他的角色),主要介紹主節點:

??主節點(Master Node)??

  • ??職責??:管理集群元數據(索引創建/刪除、分片分配、節點狀態監控)。

  • 細分類型??:
    – 候選主節點(Master-Eligible)??:參與選舉,可成為主節點(配置:node.roles: [master])。
    – 僅投票主節點(Voting-Only)??:僅參與選舉投票,不擔任主節點(配置:node.roles: [master, voting_only])。

  • ??最佳實踐??:
    – 生產集群需至少 ??3個候選主節點??,且半數以上非僅投票節點,避免腦裂。
    – 與數據節點分離,確保穩定性。

集群中將會只有一個節點成為[Master Node]并為集群中需要強一致性的行為做唯一決策出口

主節點選舉

Elasticsearch 的選舉機制是對 Raft (論文)的??工程化改良??,通過犧牲部分理論嚴謹性換取分布式搜索場景下的實操效率,核心差異本質是??性能與強一致性之間的權衡??

1. 多票制??

??節點在同一任期內可多次投票,支持多個候選人同時當選。
??沖突解決??:若多個候選人同時當選,ES 采用 ??“最后當選者有效”?? 原則(如 Node2 先當選,但收到 Node3 的投票請求后主動退位,最終 Node3 成為主節點)。
??目的??:避免小規模集群中因節點同時競選導致選舉失敗(如 3 節點均自投),提升選舉速度

2. 預投票流程(PreVote)的差異??

??Raft :
候選人需確認日志足夠新(term 更大或 index 更大)且獲得多數支持,才發起正式投票。
??Elasticsearch 的 PreVote??:
檢查條件更寬松:僅需候選人 term ≥ 當前節點 term,或 term 相同時候選人版本號 ≥ 當前節點版本號。
??風險??:寬松條件可能導致網絡分區節點頻繁發起無效選舉,但提高選舉速度,同時 ES 通過動態退避機制(back_off_time)降低影響。

3. 狀態轉換規則的靈活性??

??Raft 的嚴格轉換??:
節點狀態需按 Follower → Candidate → Leader 順序轉換,且 Leader 退位后需先回退至 Follower。
??Elasticsearch 的靈活轉換??:
??Leader 退位規則??:Leader 收到任何更高 term 的投票請求(RequestVote)時,??立即退位為 Candidate??(而非 Follower)。
??目的??:加速新主節點產生,避免舊 Leader 阻塞選舉進程

4. 腦裂處理策略??

??Raft 的嚴格多數票??:
僅獲得多數票的分區可選出 Leader,天然避免腦裂。
??Elasticsearch 的妥協方案??:
允許多個分區同時選出 Leader,但通過 ??“最后當選者有效”?? 和 ??Leader 主動退位?? 解決沖突(非實時避免腦裂)。
??風險??:極端情況下可能短暫存在多主,但數據一致性通過分片分配機制(主節點唯一管理元數據)保障。

5. 性能與規模適應性??

??選舉速度??:
ES 的并行投票和寬松 PreVote 使??小規模集群選舉更快??(通常 < 500ms)。
Raft 的嚴格流程在大規模集群中??穩定性更優??,ES 需依賴參數調優(如增大 cluster.election.duration)減少競爭。
??大規模集群挑戰??:
ES 在超 40 節點時可能出現??頻繁主節點切換??,Raft 可穩定支持 50+ 節點。

在這里插入圖片描述

cluster.election.initial_timeout: 100ms   # 初始等待時間
cluster.election.back_off_time: 100ms     # 退避增量
cluster.election.max_timeout: 10s          # 最大等待時間

僅投票節點(Voting-only Node)??:專用于投票但不存儲數據,提升大規模集群選舉穩定性。

??小規模集群??(<10 節點):ES 默認配置即可,利用多票制提升選舉效率。
??大規模集群??(>20 節點):
部署專用??主節點??(無 data 角色)和??僅投票節點??;
調大 cluster.election.duration(如 1s)減少競爭。

添加新分片&重平衡的影響

一、修改副本分片數(Replicas)??
??場景??:增加或減少副本分片數(如從number_of_replicas=1改為2)。
??特點??:在線操作,無需重建索引,數據不會丟失。

添加副本可以在線操作:看過raft論文的添加新節點的流程就能理解為什么可以在線操作;

二、修改主分片數(Primary Shards)??
??場景??:調整主分片數量(如從number_of_shards=3改為6)。
??特點??:必須重建索引!原始索引數據不會自動遷移到新分片布局。

ES數據使用計算Hash分配數據,修改只能重建索引;

寫一致性

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

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

相關文章

共讀AI新圣經-深度學習讀書筆記01

提示&#xff1a;本文是我參加datawhale活動的讀書筆記&#xff0c;這是第一章的閱讀筆記 文章目錄 前言一、深度學習能做什么&#xff1f;二、教學案例總結 前言 隨著大數據和算力的大幅提升&#xff0c;基于數據學習的解決方案正取代基于人工設計的解決方案 提示&#xff1a…

Android項目資源字符串內容多語言對齊工具 Python

Android項目資源字符串內容多語言對齊工具&#xff1a; #!/usr/bin/env python3import re from dataclasses import dataclass, field from typing import Optional, Dict, List from pathlib import Path import tkinter as tk from tkinter import filedialog, messageboxda…

創客匠人分享:知識變現時代的創始人 IP 打造路徑

當知識付費市場規模突破千億&#xff0c;創始人 IP 已成為知識變現的 “流量引擎”。創客匠人結合陳雷教授的實戰經驗&#xff0c;拆解創始人 IP 從 0 到 1 的打造路徑&#xff0c;為內容創業者提供從流量引流到商業變現的全鏈路思路。 一、破局認知&#xff1a;IP 打造的核心…

【數據分析五:Feature Engineering】特征工程

一、特征工程定義 在數據預處理以后&#xff08;或者數據預處理過程中&#xff09;&#xff0c;如何從數據中提取有效的特征&#xff0c;使這些特征能夠盡可能的表達原始數據中的信息&#xff0c;使得后續建立的數據模型能達到更好的效果&#xff0c;就是特征工程所要做的工作…

標桿確立!永洪科技位于IDC報告Data Analytics領域象限排頭位!

近日&#xff0c;全球知名市場研究機構IDC發布的《數據管理分析與生成式AI發展趨勢及最佳實踐》報告&#xff0c;為正處于數字化轉型深水區的企業描繪了清晰的技術演進藍圖。在這幅權威繪制的產業圖譜中&#xff0c;“Data Analytics”&#xff08;數據分析&#xff09;作為連接…

啟動tomcat控制臺日志出現亂碼

當我們啟動tomcat控制臺日志出現亂碼怎么辦&#xff1f; 解決方案&#xff1a; 在tomcat根目錄中config文件夾下將log.properties文件中將默認控制臺日志輸出編碼UTF修改成GBK或者GB2312都可以。 java.util.logging.ConsoleHandler.encoding UTF-8 修改為&#xff1a; j…

【橘子的AI | 每日一課】Day4!機器學習 (ML) 基礎

機器學習 (ML) 基礎介紹 一、機器學習的定義 從廣義上來說&#xff0c;機器學習是一種能夠賦予機器學習的能力以此讓它完成直接編程無法完成的功能的方法。但從實踐的意義上來說&#xff0c;機器學習是一種通過利用數據&#xff0c;訓練出模型&#xff0c;然后使用模型預測的…

【C語言】藥店藥品管理系統 -丨完整源碼與實現解析

系統概述 這是一個功能完善的藥店藥品管理系統&#xff0c;使用C語言開發&#xff0c;基于鏈表數據結構實現。系統提供藥品信息的增刪改查、排序和持久化存儲功能&#xff0c;適用于藥店日常藥品管理工作。 數據結構設計 #define MAX_NAME_LEN 50 #define MAX_ID_LEN 20 #de…

sass-loader與webpack版本沖突解決方案

#npm i 錯誤解決記錄# 最開始錯誤 &#xff1a;拉取代碼&#xff0c;增加依賴時&#xff0c;報錯 問題&#xff1a; 在安裝sass-loader10.1.1時&#xff0c;發現與現有的webpack版本有沖突。 當前項目已經安裝了webpack4.28.4&#xff08;通過peer dependency requirements f…

常見誤區解讀之三:超融合只適合外圍/輕量業務場景,無法承載數據庫等關鍵業務?

作者&#xff1a;SmartX 金融團隊 祝志剛 在前兩期“超融合常見誤區解讀”中&#xff0c;我們分別解讀了如何以超融合建云并進行大規模部署。而對于生產業務場景&#xff0c;部分行業用戶和業界人士可能還會有這樣的認知&#xff1a; “超融合管理簡單、成本也低&#xff0c;…

Kafka重平衡機制深度解析:原理、觸發條件與應對策略

引言 在Kafka分布式消息系統中&#xff0c;重平衡&#xff08;Rebalance&#xff09;是一個至關重要的機制&#xff0c;它確保消費者組中的各個消費者實例能夠公平地分擔主題分區的消費任務。然而&#xff0c;重平衡過程也可能帶來短暫的消費停頓和性能波動&#xff0c;處理不…

使用 Docker Compose 安裝 Milvus(單機版)

1. 創建專用目錄并進入 mkdir milvus-standalone && cd milvus-standalone 2. 下載 docker-compose.yml 文件 使用官方提供的配置文件&#xff08;以 Milvus v2.3.3 為例&#xff09;&#xff1a; wget https://github.com/milvus-io/milvus/releases/download/v2.3…

【MySQL篇05】:事務的 ACID 性(數據庫原理篇)

文章目錄 一、事務的ACID特性二、數據庫原理例題與 ACID 特性判斷三、拓展&#xff08;undolog 與 redolog&#xff09; 一、事務的ACID特性 綜述&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事務是不可分割的最小操作單元&#xff0c;要么全部成功&…

crawl4ai 框架的入門講解和實戰指南——基于Python的智能爬蟲框架,集成AI(如NLP/OCR)實現自動化數據采集與處理

一、crawl4ai 框架簡介 1. 框架定位 核心功能&#xff1a;基于Python的智能爬蟲框架&#xff0c;集成AI&#xff08;如NLP/OCR&#xff09;實現自動化數據采集與處理 關鍵特性&#xff1a; 零配置快速啟動&#xff08;自動識別網頁結構&#xff09; 內置反反爬機制&#xff…

受夠垃圾翻譯!CodeBuddy 8 分鐘造神器,劃詞秒翻 + 自動適配所有網頁

本文所使用的 CodeBuddy 免費下載鏈接&#xff1a;騰訊云代碼助手 CodeBuddy - AI 時代的智能編程伙伴 前言 作為一個天天泡在 GitHub 上扒項目的人&#xff0c;翻譯問題簡直是我 “挖寶” 路上的頭號絆腳石&#xff01;想研究國外大神的優質開源項目&#xff0c;不是被機翻軟…

零基礎設計模式——總結與進階 - 2. 反模式

第五部分&#xff1a;總結與進階 - 2. 反模式 (Anti-Patterns) 在軟件開發中&#xff0c;我們追求良好的設計模式以構建健壯、可維護的系統。然而&#xff0c;同樣存在一些常見的、導致不良后果的解決方案&#xff0c;這些被稱為“反模式”。理解反模式&#xff0c;可以幫助我…

音視頻流媒體高級開發-學習路線

原文作者&#xff1a;Linux 原文鏈接&#xff1a;音視頻流媒體高級開發-學習路線 如果你想往音視頻方向發展&#xff0c;那么本文一定要認真閱讀~ 大家都知道音視頻開發薪資高、門檻高、發展空間大&#xff0c;心里蠢蠢欲動&#xff0c;卻不知道怎么入門&#xff0c;怎么進階…

LINUX 通過rsync同步 免密備份

1&#xff0c;增加免密碼用戶密碼 useradd backup echo "5566777" | passwd --stdin backup echo "backup ALL(ALL) ALL" >> /etc/sudoers # 源服務器操作 ssh client_usersource_server ssh-keygen -t rsa # 一路回車 ssh-copy-id serv…

在使用 HTML5 的 <video> 標簽嵌入視頻時,有時會遇到無法播放 MP4 文件的問題

原因分析&#xff1a; 只能播放聲音&#xff0c;卻無法播放視頻。這通常是由于視頻編碼格式不兼容導致的。雖然 MP4 是一種常見的視頻格式&#xff0c;但它包含多種編碼方式&#xff0c;并非所有編碼方式都受 HTML5 支持。 解決方案&#xff1a; 確認視頻編碼格式&#xff1a; …

【bugfix】記一次Spring Boot 配置層級錯誤導致數據庫連接失敗

前言&#xff1a;為什么你的數據庫配置讀不到&#xff1f; 在 Spring Boot 項目中&#xff0c;配置文件的層級&#xff08;prefix&#xff09; 是決定屬性能否被正確解析的核心因素。一個看似微小的縮進錯誤&#xff0c;可能導致整個應用的數據庫連接失敗、服務啟動異常&#…