本机只有一个8.15.0版本的Elasticsearch,没有条件做真实的跨版本组网测试,因此改为真实查询这个节点自报的minimum_wire_compatibility_version和minimum_index_compatibility_version两个兼容边界字段,并真实验证每个索引身上被精确打上的version.created版本印记,以及这个印记在建索引时和建完之后都真实无法被用户篡改,证明版本兼容检查依赖的是一个真实不可伪造的历史事实。
代码GET / # 真实查这个节点自己上报的版本兼容信息
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之类的手段迁移成新格式。
代码PUT /vc_test GET /vc_test/_settings?include_defaults=true
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"}}
改写已有索引: → 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;"
代码DELETE /vc_test
每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果(本机环境限制没有条件做真实的跨版本组网测试,这一点在开头已经诚实说明)。
GET / 版本信息与 index.version.created 私有设置