为什么ElasticSearch应用开发者需要了解cluster state
原文链接: https://www.loggly.com/blog/p...在前面的文章(ES vs Solr)中我们提到, ES构建了Loggly的很多核心功能. 在把这项通用搜索技术用于我们的日志管理系统, 并为超过5000多客户提供准实时服务的过程中, 我们在技术上成长颇多. 按照我们对开源社区的尊重, 在此希望能把我们所学到的知识回馈到社区.本文将探讨对ES扩展过程中的性能有深远影响的关键概念:cluster state.什么是cluster stateES的一个突出优点是其无模型规则约束. 起初, 你可以把一个包含任意字段数目的文档添加到索引中, 而并不需要提前在ES中定义这些字段的类型. 能把这些字段添加到索引并随后进行搜索是件让人兴奋的事情. 但这些字段的名称, 类型以及它们被添加到的索引信息则会自动添加到ES的cluster state信息中(假设你使用了默认的动态mapping设置. 当然像ES的其他配置一样, 你可以调整或禁用该行为).当然,这里还有些秘密: 如果你向一个已存在的字段(例如integer)中试图添加另外一种类型(例如string)的字段值时, ES将会失败.同一个索引中的相同字段不能同时具有两种不同类型. 这称为mapping冲突. ES的处理取决于涉及的具体类型. 例如:如果向一个字符串类型中添加整数值, 则会进行强制类型转换如果向一个整数类型中添加字符串值, 则会遇到异常, ES拒绝接收该文档.所以关注下你的ES响应,尤其在使用bulk做批量索引时.cluster state是你的重要参考像其他倒排索引一样, 当你搜索数据时, ES需要知道这些数据的元信息及其存储位置. 当节点接收到查询请求, 首先要做的就是你要查询的对象在哪些分片上, 然后判断这个索引上有哪些字段以及它们的类型.(你不能在一个字符串类型的字段上进行数字范围查询). 而这些信息都记录在cluster state之中.顾名思义, cluster state是全局性信息, 包含了整个群集中所有分片的元信息(规则, 位置, 大小等信息), 并保持每个每节的信息同步.在一个包含众多节点的集群中, ES是如何做到信息同步的呢? 原来ES的cluster state信息是由master节点维护的, 当它收到data节点的状态更新变化后, 就把这些信息依次广播到其他节点, 仅此而已.假如你的cluster state每2½分钟更新300磅请记住: cluster state是你的群集中每个节点上的每个索引包含的每个分片的所有字段信息. 如果你有大量的字段, 例如把ES作为大量易变且无固定规则文档的存储, 那么cluster state将会变得庞大. 在Loggly服务中恰恰如此. 因为客户发送给我们的文档格式随意, 包含任意数据的唯一字段, 并且数量跨度较大. 我们每秒处理数十万次请求, 所以Loggly的cluster state可达数百兆大小.希望你看到光明之门也许警告声已在你脑海中响起: 你是说当有任何变化时, ES会广播数百兆的数据到不同节点?. 也许事实并不像你想像的那么糟糕. 在cluster state管理方面, ES已经做了几个优化:从ES2.0以来, 只有变化的cluster state信息才会被广播. 相比以前的版本, 这带来了巨大的性能提升.在ES节点前传递信息之前, ES对cluster state做了效果显明的压缩.ES在合并cluster state更新以及批量处理上相当明智, 特别是最近的ES版本中.(在后面的文章Pending Tasks会介绍前期版本中未做这些优化时的内部处理)即便如此, 经常关注你的cluster state也是很有必要的. 另外, 我们发现在规模化运行ES集群早期, 索引大量数据之前要做的第一件事, 就是为ES的cluster state数据量设置上限, 以避免超出ES处理能力而导致集群故障. 关于cluster state更严重的问题--以及在Loggly, 我们是如何解决cluster state问题的--将会在以后的文章出介绍, 希望能对你有所帮助.cluster state示例下面是一个具有两个节点的集群, 其中包含了只有一条文档的一个索引的cluster state信息. 当然这与我们真实场景中的数据有很大区别, 因为在我们的集群中有很多机器和大量的索引节点以及超出你想象的mapping数量. 但这个例子已经足够让你了解cluster state所包含的信息了.{ cluster_name : elasticsearch, version : 11, master_node : -mq1SRuuQoeEq-3S8SdHqw, blocks : { }, nodes : { sIh5gQcFThCcz3SO6txvvQ : { name : Max, transport_address : inet[/162.245.23.194:9301], attributes : { } }, -mq1SRuuQoeEq-3S8SdHqw : { name : Llyron, transport_address : inet[/162.245.23.194:9300], attributes : { } } }, metadata : { templates : { }, indices : { blog : { state : open, settings : { index : { uuid : UQMz5vbXSBqFU_8U3u4gYQ, number_of_replicas : 1, number_of_shards : 5, version : { created : 1030099 } } }, mappings : { user : { properties : { name : { type : string } } } }, aliases : [ ] } } }, routing_table : { indices : { blog : { shards : { 4 : [ { state : STARTED, primary : true, node : sIh5gQcFThCcz3SO6txvvQ, relocating_node : null, shard : 4, index : blog }, { state : STARTED, primary : false, node : -mq1SRuuQoeEq-3S8SdHqw, relocating_node : null, shard : 4, index : blog } ], 0 : [ { state : STARTED, primary : true, node : sIh5gQcFThCcz3SO6txvvQ, relocating_node : null, shard : 0, index : blog }, { state : STARTED, primary : false, node : -mq1SRuuQoeEq-3S8SdHqw, relocating_node : null, shard : 0, index : blog } ], 3 : [ { state : STARTED, primary : false, node : sIh5gQcFThCcz3SO6txvvQ, relocating_node : null, shard : 3, index : blog }, { state : STARTED, primary : true, node : -mq1SRuuQoeEq-3S8SdHqw, relocating_node : null, shard : 3, index : blog } ], 1 : [ { state : STARTED, primary : false, node : sIh5gQcFThCcz3SO6txvvQ, relocating_node : null, shard : 1, index : blog }, { state : STARTED, primary : true, node : -mq1SRuuQoeEq-3S8SdHqw, relocating_node : null, shard : 1, index : blog } ], 2 : [ { state : STARTED, primary : true, node : sIh5gQcFThCcz3SO6txvvQ, relocating_node : null, shard : 2, index : blog }, { state : STARTED, primary : false, node : -mq1SRuuQoeEq-3S8SdHqw, relocating_node : null, shard : 2, index : blog } ] } } } }, routing_nodes : { unassigned : [ ], nodes : { sIh5gQcFThCcz3SO6txvvQ : [ { state : STARTED, primary : true, node : sIh5gQcFThCcz3SO6txvvQ, relocating_node : null, shard : 4, index : blog }, { state : STARTED, primary : true, node : sIh5gQcFThCcz3SO6txvvQ, relocating_node : null, shard : 0, index : blog }, { state : STARTED, primary : false, node : sIh5gQcFThCcz3SO6txvvQ, relocating_node : null, shard : 3, index : blog }, { state : STARTED, primary : false, node : sIh5gQcFThCcz3SO6txvvQ, relocating_node : null, shard : 1, index : blog }, { state : STARTED, primary : true, node : sIh5gQcFThCcz3SO6txvvQ, relocating_node : null, shard : 2, index : blog } ], -mq1SRuuQoeEq-3S8SdHqw : [ { state : STARTED, primary : false, node : -mq1SRuuQoeEq-3S8SdHqw, relocating_node : null, shard : 4, index : blog }, { state : STARTED, primary : false, node : -mq1SRuuQoeEq-3S8SdHqw, relocating_node : null, shard : 0, index : blog }, { state : STARTED, primary : true, node : -mq1SRuuQoeEq-3S8SdHqw, relocating_node : null, shard : 3, index : blog }, { state : STARTED, primary : true, node : -mq1SRuuQoeEq-3S8SdHqw, relocating_node : null, shard : 1, index : blog }, { state : STARTED, primary : false, node : -mq1SRuuQoeEq-3S8SdHqw, relocating_node : null, shard : 2, index : blog } ] } }, allocations : [ ] }

相关新闻

Elasticsearch索引的数据存储路径是如何确定的

Elasticsearch索引的数据存储路径是如何确定的

Elasticsearch中,在node的配置中可以指定path.data用来作为节点数据的存储目录,而且我们可以指定多个值来作为数据存储的路径,那么Elasticsearch是如何判断应该存储到哪个路径下呢?今天我就记录一下这个问题。Elasticsearch的索引…

2026/7/10 12:27:11阅读更多 →
Adobe-GenP 3.0:打破Adobe订阅壁垒的专业级激活方案

Adobe-GenP 3.0:打破Adobe订阅壁垒的专业级激活方案

Adobe-GenP 3.0:打破Adobe订阅壁垒的专业级激活方案 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 当创意工作者面临Adobe Creative Cloud高昂的订阅费…

2026/7/10 12:27:11阅读更多 →
别再乱放文件了,Python项目结构这么搭最省心

别再乱放文件了,Python项目结构这么搭最省心

项目中建新文件的时候,我经常想一个问题:这个文件放哪?工具类放 utils?还是 helpers?还是 common?还是 lib?每个项目都有自己的叫法。换了项目又要重新猜。去年重构了一个老项目,把这…

2026/7/10 12:27:11阅读更多 →
ChatGPT API并发瓶颈突破指南:从50→5000 RPS的4步熔断+异步批处理架构落地实录

ChatGPT API并发瓶颈突破指南:从50→5000 RPS的4步熔断+异步批处理架构落地实录

更多请点击: https://codechina.net 第一章:ChatGPT API并发调用优化的演进背景与挑战全景 随着大语言模型应用从单点实验快速走向生产级服务,ChatGPT API 的调用模式正经历从串行试探到高并发调度的根本性转变。早期开发者常以简单循环逐条…

2026/7/10 13:17:18阅读更多 →
AQS源码解读

AQS源码解读

retrantlock:A、B、C3个线程,假设A线程lock()时候拿到了锁,state被A设置成了1。static final class NonfairSync extends Sync {private static final long serialVersionUID 7316153563782823691L;/*** Performs lock. Try immediate barg…

2026/7/10 13:17:18阅读更多 →
LangChain Memory 架构演进全图谱(2022–2024核心迭代路径与企业级选型决策树)

LangChain Memory 架构演进全图谱(2022–2024核心迭代路径与企业级选型决策树)

更多请点击: https://intelliparadigm.com 第一章:LangChain Memory 的本质与演进动因 LangChain Memory 并非传统意义上的数据缓存,而是一种面向对话状态管理的抽象层,其核心职责是在链式调用(Chain)中持…

2026/7/10 13:17:18阅读更多 →
Java 8种基本数据类型实战:从内存占用到精度丢失的3个关键场景分析

Java 8种基本数据类型实战:从内存占用到精度丢失的3个关键场景分析

Java 8种基本数据类型实战:从内存占用到精度丢失的3个关键场景分析1. 基本数据类型概述与内存占用对比Java作为一门强类型语言,其8种基本数据类型构成了程序中最基础的数据存储单元。理解它们的特性和适用场景,是写出高效、健壮代码的前提。让…

2026/7/10 13:17:18阅读更多 →
Python 库 functools 详解

Python 库 functools 详解

functools模块是Python的标准库的一部分,它是为高阶函数而实现的。高阶函数是作用于或返回另一个函数或多个函数的函数。一般来说,对这个模块而言,任何可调用的对象都可以作为一个函数来处理。 functools 提供了 11 个函数: 1. …

2026/7/10 13:17:18阅读更多 →
Claude Code 回复完成?让鼠标告诉你

Claude Code 回复完成?让鼠标告诉你

不只是提示音——用 RGB 鼠标做 Claude Code 的状态指示灯用 Claude Code 写代码时,经常切到其他窗口等回复。切回来早了打断推理,切晚了浪费时间。它自带的提示音一闪而过,很容易错过。我直接把桌面上那只吃灰的罗技 G102 改成了**物理状态灯…

2026/7/10 13:12:18阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/10 12:10:00阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/10 12:29:21阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/10 4:59:05阅读更多 →
浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比

浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比

浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比当你在浏览器地址栏敲入一个网址时,背后可能隐藏着一场关于"要不要重新下载资源"的精密博弈。这场博弈的裁判是HTTP缓存机制,而304状态码则是这场博弈…

2026/7/10 0:00:01阅读更多 →
RoboWits:面向创造性问题求解的双臂机器人认知推理基准

RoboWits:面向创造性问题求解的双臂机器人认知推理基准

1. 项目概述:这不是又一个机器人抓取数据集,而是一次对“思考力”的压力测试 RoboWits——这个名字里藏着两个关键信号:“Robo”直指物理世界中的具身智能体,“Wits”则毫不掩饰地指向人类最核心的认知能力:机敏、判断…

2026/7/10 0:00:01阅读更多 →
5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能

5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能

5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI TegraRcmGUI是一款专为Windows…

2026/7/10 0:00:01阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/9 9:45:20阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/9 15:50:44阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/9 14:14:17阅读更多 →