前言:我的Elasticsearch学习历程

        作为一名Java开发者,记得第一次使用ES的Java High Level REST Client时,我被它强大的搜索能力所震撼,但也为复杂的集群调优所困扰。经过多个项目的实战积累和系统性学习,我终于建立了对ES的体系化认知。本文将分享我的学习路径和思考,希望能帮助同样在ES进阶路上的开发者。

一、为什么我们"会用ES却不真正懂ES"?

1.1 开发者视角的局限性

        大多数Java开发者接触ES的典型路径:

  1. 引入elasticsearch-rest-high-level-client依赖
  2. 学习基本的索引CRUD操作
  3. 掌握bool查询组合
  4. 了解聚合分析基础
// 典型的Java客户端使用示例
SearchRequest request = new SearchRequest("orders");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchQuery("productName", "手机"));
sourceBuilder.aggregation(AggregationBuilders.terms("brand_agg").field("brand"));
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);

这种使用方式让我们产生了"已经掌握ES"的错觉,但实际上我们只是停留在API调用层面。

1.2 面试中暴露的知识盲区

常见面试问题与知识缺口对照表:

面试问题

暴露的认知缺陷

"如何优化深分页查询性能?"

不了解游标(scroll)与search_after机制

"ES如何保证写入不丢失?"

不清楚translog与flush的关系

"集群出现脑裂怎么处理?"

缺乏分布式一致性知识

二、构建三维ES知识体系

2.1存储引擎层:三维透视体系

2.1.1、存储形式及组件全景对照表

英文术语

中文名称

数据结构

存储文件类型

是否可禁用

核心用途

Term Dictionary

词项字典

FST压缩有限状态机

.tim

快速定位term

Posting List

倒排列表

SkipList+RoaringBitmap

.doc

存储文档ID集合

Doc Values

文档值

列存+字典编码

.dvd/.dvm

聚合/排序

_source

源数据

原始JSON

_source

数据召回

Store Fields

存储字段

独立二进制

.fdt

特定字段快速访问

2.1.2、双重视角解析(逻辑 vs 物理)

逻辑视角:开发者的抽象模型

物理视角:引擎的存储实现

2.1.3、核心技术深度解构

1. FST(Finite State Transducer)压缩

  • 压缩原理:前缀后缀复用 + 共享状态转移

2. 混合索引策略

数据特征

存储方案

适用场景

稀疏(DF<5%)

纯跳表

长尾词查询

稠密(DF>30%)

Roaring Bitmap

热门词过滤

中间状态

跳表+位图混合

通用场景

3. Doc Values优化

// 典型mapping配置
{"price": {"type": "double","doc_values": true,"index": false  // 禁用倒排索引。当字段‌仅用于聚合(aggregations)或排序(sorting)‌时,禁用倒排索引("index": false)可‌节省存储空间、提升写入速度‌,同时通过保留doc_values仍支持高效分析查询。}
}

2.1.4、写入流程

核心机制

触发条件

数据状态

性能影响

Refresh

1秒间隔/

手动调用

内存→可搜索段

搜索实时性

Flush

30分钟/

512MB/

重启时

日志持久化

数据安全性

Merge

段数量/

大小阈值

段文件合并

查询性能

2.2 分布式协调层:集群的智慧

2.2.1 核心组件全景对照表‌

英文术语

中文名称

数据结构/算法

是否可配置

核心用途

Zen Discovery

节点发现机制

Gossip协议

是(网络拓扑)

集群成员状态探测

Master Election

主节点选举

Bully算法

是(最小节点数)

避免脑裂

Cluster State

集群状态

版本化元数据

全局配置/分片路由表

Shard Allocation

分片分配服务

加权决策树

是(策略插件)

平衡数据分布

Translog Sync

事务日志同步

两阶段提交

是(持久化模式)

保障写入一致性

2.2.2 双重视角解析‌

▍ 逻辑视角:开发者的抽象模型

▍ 物理视角:系统的运行时实现

2.2.3 核心技术深度解构‌

1. 分布式共识协议

# 关键配置项  
discovery:  zen:  fd.ping_interval: 1s          # 心跳检测间隔  ping_timeout: 3s              # 节点响应超时  minimum_master_nodes: 3       # 防脑裂公式:(节点总数/2)+1  

2. 分片分配策略矩阵

策略类型

算法原理

适用场景

配置示例

Balanced

权重轮询(磁盘/CPU)

通用负载均衡

cluster.routing.allocation.balance.shard=0.45

Awareness

故障域隔离

跨机房容灾

cluster.routing.allocation.awareness.attributes: rack

Filter

标签匹配

热冷数据分离

index.routing.allocation.include.region: east

3. 一致性保障机制

// 伪代码:写入quorum检查流程  
public boolean checkQuorum(ShardId shard, int activeShards) {  int required = (numberOfReplicas / 2) + 1;  return activeShards >= required;  // 多数派原则  
} 

2.2.4 关键流程时序图‌

▍ 集群扩容时分片再平衡

‌再平衡的触发条件‌

场景

触发原因

数据影响范围

新增节点

负载不均(新节点无数据)

迁移部分现有分片到新节点

节点下线

副本数不足

在其他节点重建缺失分片

磁盘水位不均

避免磁盘写满

从高水位节点迁出分片

‌再平衡的本质‌

  • 调整物理位置‌:仅改变分片的‌物理存储节点‌(如shard2从NodeA迁移到NodeB),不改变分片ID与文档的路由逻辑。
  • 路由表更新‌:客户端通过更新后的Cluster State知道shard2现在位于NodeB,但哈希取模规则不变。
2.2.5 与存储引擎层的联动‌

协调层行为

存储引擎影响

关键配置桥梁

分片迁移

触发Segment文件网络传输

indices.recovery.max_bytes_per_sec

Master切换

短暂禁用写入(保护Translog)

cluster.publish.timeout

副本同步延迟

降低Merge频率

index.translog.sync_interval

2.3 查询优化层:超越基础查询

‌2.3.1 核心组件全景对照表‌

英文术语

中文名称

数据结构/算法

是否可配置

核心用途

Query DSL Parser

查询语法解析器

抽象语法树(AST)

将JSON查询转换为执行计划

Rewrite Engine

重写引擎

规则匹配优化

是(规则)

简化/转换查询(如bool表达式合并)

Cost Optimizer

成本优化器

动态规划+启发式规则

是(阈值)

选择最优执行路径

Search Executor

查询执行器

分片级并行调度

是(并发)

协调分片查询与结果聚合

Cache Manager

缓存管理器

LRU+TTL策略

是(大小)

缓存查询结果/过滤器位图

‌2.3.2 双重视角解析‌

▍ 逻辑视角:开发者的抽象模型

▍ 物理视角:系统的运行时实现

2.3.3 核心技术深度解构‌

1. 查询重写优化

// 优化示例:range查询合并
{"bool": {"must": [{ "range": { "age": { "gte": 18 } } },{ "range": { "age": { "lt": 30 } } }]}
}
// 重写为→
{ "range": { "age": { "gte": 18, "lt": 30 } } }

2. 成本优化策略矩阵

策略类型

优化目标

实现机制

配置参数

分片路由

最小化网络传输

优先本地分片

preference=_local

执行顺序

降低中间结果集

先执行高选择性条件

search.allow_partial_search

缓存利用

减少磁盘IO

过滤器位图缓存

indices.queries.cache.size

3. 并行执行模型

// 伪代码:分片查询任务调度
List<ShardSearchRequest> requests = buildShardRequests();
List<Future<ShardResponse>> futures = threadPoolExecutor.submitAll(requests);
List<ShardResponse> responses = awaitAll(futures);  // 超时控制
return mergeResponses(responses);

‌2.3.4 关键流程时序图‌

▍ 分布式查询执行流程

三、Elasticsearch深度实践‌

‌3.1 从应用到原理的认知跃迁‌

  1. API调用者 vs 架构设计者的思维差异
    1. 开发者关注点‌:查询语法正确性、响应时间
    2. 架构师关注点‌:查询路径最优性、集群资源利用率
  2. 存储引擎的工程化取舍
    1. FST压缩的代价‌:构建耗时与查询速度的平衡(测试数据:构建耗时增加15%可使查询快30%)
    2. 混合索引的临界点公式‌:DF临界值 = (跳表查询成本 - 位图查询成本) / 位图内存开销

3.2 分布式系统的设计哲学‌

  1. CAP原则的ES实现‌:

    一致性级别

    配置方式

    适用场景

    最终一致性

    wait_for_active_shards=1

    日志写入

    强一致性

    wait_for_active_shards=all

    金融交易数据

  2. 脑裂防护的实战经验‌:
    # 生产环境推荐配置(两重防护机制)
    discovery.zen:minimum_master_nodes: $(($(getClusterSize)/2+1)) # 法定节点数控制ping.unicast.hosts: ["node1:9300","node2:9300"] # 避免广播风暴

3.3 性能优化三维模型‌

维度

优化策略

技术原理

实际案例

参数配置示例

DSL重写

查询条件顺序优化

利用倒排索引特性,高选择性条件优先执行

电商搜索先过滤category=手机再匹配title=旗舰

"filter": [{"term": {"category": "手机"}}]

避免script排序

脚本编译开销大,改用numeric类型字段预计算

将折扣率计算提前写入discount_rate字段

"sort": [{"discount_rate": "desc"}]

缓存策略

分片查询缓存

缓存分片级别结果集,适合重复查询

首页推荐商品固定条件查询

"request_cache": true

文件系统缓存预热

利用OS缓存加速热点数据访问

大促前主动查询历史爆款商品

POST /hot_items/_cache/clear

线程池

写入线程池隔离

防止批量写入阻塞搜索请求

日志采集与商品搜索使用独立线程池

thread_pool.write.size: 32

搜索队列限流

通过队列堆积触发熔断保护

黑五期间设置搜索队列阈值

queue_size: 1000

热点迁移

基于访问频率的分片平衡

监控_nodes/hot_threads动态调整分片位置

将促销商品索引迁移到SSD节点

PUT _cluster/settings

冷热分离

时序数据分层存储

热数据用SSD+多副本,冷数据用HDD+单副本

日志索引按日期划分hot/warm层

"index.routing.allocation.require.box_type": "hot"

字段优化

禁用无用doc_values

减少列存空间占用和IO开销

标记status字段为doc_values: false

"mappings": {"properties": {"status": {"type": "keyword","doc_values": false}}}

四、认知升华‌

4.1 Elasticsearch的边界思考‌

  1. 不该用ES的场景‌:
    1. 高频更新的事务系统(如订单状态)
    2. 强一致性要求的账户余额
    3. 超大规模分析(考虑预计算+ClickHouse)
  2. 决策清单‌:

决策点

评估维度

典型选择

分片大小

查询QPS vs 写入吞吐

20-50GB/分片

副本数量

读负载 vs 存储成本

生产环境≥2

4.2 技术人的成长启示‌

认知升级路径‌:

API调用 → 集群运维 → 原理掌握 → 架构设计 → 技术选型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88639.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88639.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/88639.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高云GW5AT-LV60 FPGA图像处理板

GW5AT-LV60开发板体积小巧&#xff0c;长100mm宽为61.8mm&#xff0c;还没有一部Ipone SE2体积大&#xff0c;该板卡采用了核心板和载板分离的形式&#xff0c;核心板的形式可方便开发者在项目中根据实际需求来开发自己的载板&#xff0c;只需要为核心板提供5V的电源就能满足基…

[XILINX]ZYNQ7010_7020_软件LVDS设计

若该文为原创文章&#xff0c;未经允许不得转载风释雪QQ:627833006WX:Cheng18375816918CSDN博客: 风释雪FPGA知乎&#xff1a;风释雪FPGA 1.版本说明 日期作者版本说明2024xxxx风释雪初始版本 2.概述 ZYNQ 7010/7020 HR/HP Bank LVDS Rx/TX&#xff1b; 3.目标 ZYNQ 7010 LVD…

桌面小屏幕实战课程:DesktopScreen 11 SPI 水墨屏

飞书文档https://x509p6c8to.feishu.cn/docx/doxcnlzpIgj3gosCZufBTCZxlMb SPI说明 SPI是串行外设接口&#xff08;Serial Peripheral Interface&#xff09;的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上占用…

SpringCloud Gateway 组件的使用

作者&#xff1a;小凯 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01; 我发现了一个很有意思的缩写单词 gw、wg&#xff0c;都是网关的意思。因为 gw gateway、wg wangguan&#xff0c;所以在各个系统开发中&#xff0c;既有 gw 也有 wg 的存在。而网关…

随机地址生成器 - Cloudflare Workers

分享一个完全开源免费部署在 Cloudflare Workers 上的随机地址生成器&#xff0c;支持全球 24 个国家/地区。 &#x1f517; 工具地址: https://address.chat-tempmail.com ✨ 特性 &#x1f30d; 支持生成 24 个国家/地区的地址&#x1f4f1; 响应式设计&#xff0c;完美支持…

CNN不是一个模型?

CNN不是一个模型&#xff1f; 结论&#xff1a; CNN 是模型架构而非具体模型&#xff0c;其定位类似深度学习领域的 「设计框架」&#xff0c;而非 LSTM&#xff08;具体单元结构&#xff09;或决策树&#xff08;具体算法实体&#xff09;。CNN 的 「具体模型」 需要结合网络…

爱基百客与真迈生物达成战略合作,共推多组学科研服务升级

近日&#xff0c;武汉爱基百客生物科技有限公司&#xff08;以下简称“爱基百客”&#xff09;与真迈生物正式签署战略合作协议。此次战略合作将聚焦表观组学、单细胞时空组学等前沿科研领域&#xff0c;联合打造基于自主创新技术的多组学科研服务方案&#xff0c;为科研人员提…

吴恩达:从斯坦福到 Coursera,他的深度学习布道之路

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 吴恩达&#xff1a;从斯坦福到 Coursera&#xff0c;他的深度学习布道之路 在人工智能…

开疆智能CCLinkIE转ModbusTCP网关连接测联无纸记录仪配置案例

本案例是通过CCLinkIE转ModbusTCP网关将记录仪数据传送到三菱PLC&#xff0c;具体操作过程如下。 &#xff08;1&#xff09; 无纸记录仪与PT100传感器连接正确后&#xff0c;将无纸记录仪和PC通过网线连接&#xff0c;给无纸记录仪上电&#xff0c;设置无纸记录仪的IP地址及网…

【软考高级系统架构论文】# 论软件设计方法及其应用

论文真题 软件设计 (Software Design,SD) 根据软件需求规格说明书设计软件系统的整体结构、划分功能模块、确定每个模块的实现算法以及程序流程等,形成软件的具体设计方案。软件设计把许多事物和问题按不同的层次和角度进行抽象,将问题或事物进行模块化分解,以便更容易解决…

Spring Boot 3.x 项目搭建 (一)

以下是一个基础 Spring Boot 项目的创建指南&#xff0c;整合了官方推荐方式和实用配置&#xff0c;帮助您快速搭建可运行的项目骨架。 &#x1f31f; 一、项目创建方式 1. 在线工具 Spring Initializr&#xff08;推荐&#xff09; 步骤&#xff1a; 访问 Spring Initializr…

《天行数据查询系统项目介绍》

一、项目概述 天行数据查询系统是一款功能丰富的 Android 应用程序&#xff0c;旨在为用户提供便捷的信息查询服务。该系统集成了多个实用的查询功能&#xff0c;包括空气质量查询、天气预报查询、垃圾分类查询、新闻资讯浏览以及身份证信息查询等&#xff0c;方便用户一站式获…

对于服务器企业该如何进行搭建?

企业搭建服务器能够实现网络服务、数据存储和管理等功能&#xff0c;选择大家服务器不仅能够实现高效的资源管理和对数据信息进行安全保护&#xff0c;还可以满足网站运行的需求&#xff0c;下面&#xff0c;小编就主要来为大家介绍一下企业该如何进行服务器搭建&#xff1f; 搭…

重定向攻击与防御

一、重定向攻击的主要类型与技术原理 ICMP重定向攻击 原理&#xff1a;攻击者伪造网关身份发送虚假ICMP重定向报文&#xff0c;诱导主机修改路由表&#xff0c;将流量导向攻击者控制的节点。 利用工具&#xff1a;如netwox 86可构造恶意重定向包&#xff0c;源IP伪装为网关地…

SAP/S4 MM模块之主数据管理

目录 一、主要功能 1. 主数据管理 2.采购管理 3. 库存管理 二、业务价值 三、主数据常见问题 3.1. 物料主数据维护错误 3.2. 供应商数据不完整或错误 3.3. 数据录入延迟或遗漏 四、最佳实践 1. 物料主数据标准化 2. 供应商主数据优化 3.库存管控精细化 SAP MM&…

Flink Oracle CDC 总结

官方文档 https://nightlies.apache.org/flink/flink-cdc-docs-release-3.3/zh/docs/connectors/flink-sources/oracle-cdc/ 版本 Flink 1.15.3CDC 2.3.0Oracle 11G 12C &#xff08;官网说支持19&#xff0c;未测试&#xff09; Jar包 https://repo1.maven.org/maven2/co…

django request.data.get 判断有没有 某个参数

在 Django 的视图函数中&#xff0c;当你想要判断请求&#xff08;request&#xff09;中是否包含某个特定的参数&#xff0c;你可以使用 request.data.get() 方法。这种方法不仅适用于 POST 请求&#xff08;例如&#xff0c;在创建资源时&#xff09;&#xff0c;也适用于任何…

SD-WAN在可扩展性与未来发展灵活性方面的优势探讨

在企业数字化转型的浪潮中&#xff0c;网络基础设施的灵活性和扩展性成为企业关注的核心议题之一。SD-WAN&#xff08;Software-Defined Wide Area Network&#xff09;作为一种新兴的网络技术&#xff0c;因其灵活、智能、高效的特性&#xff0c;逐渐取代传统WAN&#xff0c;成…

4.9. 环境和分布偏移

目录 4.9. 环境和分布偏移1&#xff09;分布偏移的类型 4.9. 环境和分布偏移 机器学习应用常被忽视数据来源和模型输出处理。许多模型在测试集上表现好&#xff0c;但数据分布改变时会部署失败&#xff0c;甚至模型决策本身可能破坏数据分布&#xff08;如贷款模型基于“穿牛津…

UI前端与数字孪生融合:打造智能工厂的可视化监控平台

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在工业 4.0 与智能制造的浪潮中&#xff0c;数字孪生技术正从概念走向大规模落地。据麦肯锡报…