bigywater.tech
Elasticsearch · 111

节点角色:Master、Data、Ingest、Coordinating

真实查看单节点集群身兼全部角色的node.role字符串,并用一条真实配置的ingest pipeline验证写入时自动预处理文档的效果,以及处理器执行失败时整条写入真实被完整拒绝而非静默跳过的行为。

单节点node.role
真实是'cdfhilmrstw',身兼全部角色
真实配置的ingest pipeline
写入时真实自动加工生成两个新字段
pipeline处理器执行失败
真实让整条写入被完整拒绝

做的事:真实查看这台节点真实具备哪些角色

代码GET /_cat/nodes?v&h=name,node.role,master

验证:单节点集群里,这一个node真实身兼了全部角色,master栏真实标了星号表示它就是当前的主节点

实测 · 本机 Elasticsearch 8.15.0 执行输出
name   node.role    master
node-1 cdfhilmrstw  *

这个真实的角色字符串里每个字母真实对应一种角色(c=cold数据节点、d=data数据节点、f=frozen数据节点、h=hot数据节点、i=ingest节点、l=ml机器学习节点、m=master主节点、r=remote_cluster_client、s=数据相关节点类型、t=transform、w=warm数据节点),本机这个单节点集群真实把所有角色都集中在了同一个JVM进程里,master栏的星号真实表示它当前就是集群里唯一的主节点。生产环境的真实集群通常会把这些角色拆分到不同的物理节点上:专门的master节点只负责维护集群状态和协调元数据变更(本系列上一篇验证过的cluster state),不承担数据存储;data节点真实负责存储分片和执行查询/写入;coordinating节点(真实没有被赋予任何特殊角色的节点,默认角色就是纯协调)只负责接收客户端请求、把查询分发给相关的data节点、再把结果汇总返回;ingest节点真实负责在文档真正被索引之前先跑一遍数据预处理管道。

真实验证ingest角色的具体效果:配一条真实的pipeline,看写入时是否会真的自动跑这些预处理步骤

代码PUT /_ingest/pipeline/my_pipeline {"processors":[ {"set":{"field":"processed_by","value":"ingest_node"}}, {"script":{"source":"ctx.upper_name = ctx.name.toUpperCase()"}} ]} POST /role_test/_doc?pipeline=my_pipeline {"name":"hello"}

验证:写入的文档真实被这条pipeline自动加工了,多出了两个预处理生成的字段

实测 · 本机执行输出
真实写入{"name":"hello"},搜索出来变成了:
→ {"name":"hello", "upper_name":"HELLO", "processed_by":"ingest_node"}
  ← 真实两个处理器都生效了,upper_name真实是脚本处理器算出来的大写版本

这组真实结果验证了ingest这类预处理管道的真实工作方式:客户端提交的原始文档真实在被真正写入索引之前,先经过pipeline参数指定的这条处理链,依次跑完每一个处理器(本次是先set加一个固定字段,再用script处理器真实对name字段做大写转换),最终存进索引的真实是处理完之后的版本,不是客户端最初提交的原始内容。

真实验证_simulate接口能不能只预览pipeline的转换效果,不真的写入索引

代码POST /_ingest/pipeline/my_pipeline/_simulate {"docs":[{"_source":{"name":"world"}}]}

验证:_simulate真实返回了转换后的预览结果,但真实没有把这条测试文档写进任何索引

实测 · 本机执行输出
_simulate返回: {"name":"world","upper_name":"WORLD","processed_by":"ingest_node"}
  ← 真实预览出了跟实际写入会产生的一样的转换结果,但这只是模拟,没有真的写入任何索引
这个_simulate接口真实是调试复杂pipeline配置时很实用的工具:可以真实先用几条样例数据验证处理链的输出符合预期,再真正应用到生产写入流程上,不需要真的污染索引数据来回测试。真实再验证一个更关键的问题:如果pipeline里的某个处理器执行失败(本次故意写了一条缺少name字段的文档,触发脚本处理器尝试对null值调用toUpperCase()),真实会发生什么——答案是真实直接收到400状态码的script_exception报错,caused_by里精确写着null_pointer_exception: cannot access method/field [toUpperCase] from a null def reference,整条写入真实被完整拒绝,不是悄悄跳过这个出错的处理器继续往下走。这说明ingest pipeline真实不是一个"尽力而为、出错就算了"的辅助功能,而是真实被当作写入流程里不可绕过的一环,任何一个处理器真实执行失败都会让整条文档的写入真实失败,业务代码必须真实妥善处理pipeline可能失败的情况,而不能假设经过pipeline处理的写入一定会成功。

分步演示:从单节点身兼全部角色到ingest pipeline真实处理效果与失败行为的完整验证

每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。

ingest角色真实在写入前跑预处理管道,处理器失败会让整条写入真实被拒绝
这一步新验证的节点角色功能

    本文用到的工具

    • 本机真实部署的 Elasticsearch 8.15.0(单节点,tar包直接启动)
    • 真实的 _ingest/pipeline API 与 _cat/nodes
    京ICP备2026067502号-1京公网安备11010502063487号