引文

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;可能导致整个应用的数据库连接失败、服务启动异常&#…