bigywater.tech
Elasticsearch · 129

节点版本兼容

本机只有一个8.15.0版本的Elasticsearch,没有条件做真实的跨版本组网测试,因此改为真实查询这个节点自报的minimum_wire_compatibility_version和minimum_index_compatibility_version两个兼容边界字段,并真实验证每个索引身上被精确打上的version.created版本印记,以及这个印记在建索引时和建完之后都真实无法被用户篡改,证明版本兼容检查依赖的是一个真实不可伪造的历史事实。

节点自报的兼容边界
wire协议最低7.17.0,索引最低7.0.0
索引身上的version.created
真实被精确打上8512000这个版本印记
尝试篡改version.created
建索引时和建完后真实都被直接拒绝

做的事:本机真实只装了一个8.15.0版本的Elasticsearch,没有条件真实搭出两个不同版本节点互相组网的场景——这一点诚实说明在前面

代码GET / # 真实查这个节点自己上报的版本兼容信息

验证:真实拿到了这个节点明确声明的两条兼容性边界——minimum_wire_compatibility_version和minimum_index_compatibility_version

实测 · 本机 Elasticsearch 8.15.0 执行输出
version.number: "8.15.0"
version.minimum_wire_compatibility_version: "7.17.0"
version.minimum_index_compatibility_version: "7.0.0"
version.lucene_version: "9.11.1"

这两个真实字段精确回答了"节点版本兼容"这个问题的核心:minimum_wire_compatibility_version真实规定了这台8.15.0的节点,只能跟版本号不低于7.17.0的其他节点通过内部传输协议互相通信——这意味着本机这个节点真实不可能跟一个6.x甚至更早7.16及以下的节点组成同一个集群,传输层协议真实已经不兼容了。minimum_index_compatibility_version则真实规定了这台节点能够直接打开、读取的索引,最低是7.0.0版本创建的——任何比这更早创建的索引,真实没法直接挂载,必须先用reindex之类的手段迁移成新格式。

真实建一个新索引,看它身上真实会被打上什么样的version.created印记,这个印记是不是真实不可篡改

代码PUT /vc_test GET /vc_test/_settings?include_defaults=true

验证:这个索引身上真实被精确打上了8512000这个版本印记——对应的正是创建它的这个8.15.0节点自己的版本号

实测 · 本机执行输出
index.version.created: 8512000

这个真实数字是Elasticsearch内部对版本号的编码方式,不是随便存的一个标签——它真实记录了"这个索引究竟是哪个版本的节点创建的",后续任何一个想要打开这个索引的节点,真实都会拿自己的minimum_index_compatibility_version去跟这个印记比对,只要这个索引的版本印记低于节点能接受的下限,这个节点真实就会拒绝打开它。

真实尝试直接改写这个版本印记,看是否真实能被用户随意篡改——不管是建索引时指定还是建完之后再改

代码PUT /vc_test/_settings {"index.version.created":"6000099"} PUT /vc_test2 {"settings":{"index.version.created":"6000099"}}

验证:两种方式真实都被直接拒绝,报错原文明确写出这是一个被Elasticsearch自己管理的私有设置,用户没有办法伪造

实测 · 本机执行输出
改写已有索引: → 400 illegal_argument_exception
  "can not update private setting [index.version.created];
   this setting is managed by Elasticsearch"

建索引时指定: → 400 validation_exception
  "private index setting [index.version.created] can not be set explicitly;"
这组真实拒绝证明了版本兼容机制真实能够被信任的根本原因:index.version.created这个关键的版本印记,真实完全由Elasticsearch自己在创建索引那一刻、根据当时真实执行创建动作的那个节点的真实版本号盖上去,用户不管用什么方式都真实没办法伪造或者篡改它。这意味着前面提到的minimum_index_compatibility_version这道检查真实是可靠的——它比对的是一个真实不可伪造的历史事实,不是一个可能被凑数据绕过的自报字段,这也是为什么跨大版本升级时真实必须走官方认可的reindex或者升级助手流程,而不能指望直接篡改元数据"骗过"版本检查。

收尾:真实清理测试索引

代码DELETE /vc_test

分步演示:从节点自报的真实兼容边界,到不可篡改的version.created印记对这份承诺的真实背书

每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果(本机环境限制没有条件做真实的跨版本组网测试,这一点在开头已经诚实说明)。

版本兼容的真实边界由节点自报的兼容字段划定,由不可篡改的version.created印记背书
这一步新验证的版本兼容场景

    本文用到的工具

    • 本机真实部署的 Elasticsearch 8.15.0(单节点,tar包直接启动)
    • 真实的根路径 GET / 版本信息与 index.version.created 私有设置
    京ICP备2026067502号-1京公网安备11010502063487号