Elasticsearch 7.x(以7.17 LTS) VS Elasticsearch 8.x
7.17 是7系列最后一个长期支持版,也是升级8唯一允许的跳板版本,下文所有对比均以7.17作为7.x基准版本
一、安全体系(最大、最容易踩坑的分水岭)
| 项目 | Elasticsearch 7.17 | Elasticsearch 8.x |
|---|---|---|
| 安全开关默认值 | xpack.security.enabled: false,裸奔出厂 ,http://ip:9200 无需账号密码 |
默认开启全部安全 true;强制认证+HTTPS+集群TLS加密,无密码无法访问9200端口 |
| HTTP 9200通信 | 默认HTTP明文;开启安全后可自选http/https | 默认HTTPS ,访问地址必须写 https://ip:9200 |
| 集群内部通信9300 | 开启安全后才需要TLS证书加密;可单向/双向认证 | 强制双向TLS认证,节点之间通信必须证书校验 |
| 首次启动证书 | 不会自动生成证书;开启安全需要手动执行elasticsearch‑certutil生成CA、transport证书、http证书,整套配置yml非常繁琐 |
自动生成自签名根证书 http_ca.crt ,存放在config/certs/;开箱即用,无需手动生成即可开启HTTPS |
| 超级管理员elastic密码 | 开启安全后需要手动执行脚本设置密码 | 第一次启动自动随机生成elastic密码打印控制台;也可以重置密码脚本 elasticsearch‑reset‑password |
| Kibana接入集群 | 手动配置账号密码,证书可选 | 引入注册令牌 enrollment‑token,一键绑定ES集群;kibana必须导入http_ca.crt信任证书 |
| 证书两套区分 | transport(p12集群内部)、http(PEM对外)证书都需要自己生成 | 内置http证书;集群证书仍可自定义生成 |
| 客户端连接 | http明文无需证书;https时客户端按需导入证书 | 所有Java/Python/Postman等客户端必须信任http_ca.crt根证书,否则SSL握手失败,报证书不受信任错误 |
一句话总结:ES7安全是可选附加功能 ;ES8安全是基础底座,默认强制启用。
二、底层内核、JDK、硬件环境
| 对比项 | ES 7.17 | ES 8.x |
|---|---|---|
| Lucene搜索引擎内核 | Lucene 8.x | Lucene 9.x;倒排索引新编码、存储压缩率提升,keyword/text字段存储空间下降;聚合、直方图查询性能优化,geo地理字段索引速度提升 |
| 内置JDK版本 | OpenJDK 11;最低运行环境Java11 | OpenJDK 17;硬性最低Java17,旧JDK直接启动失败 |
| ARM架构支持 | 支持不完善,部分功能问题 | 原生完善支持ARM64(Mac M系列、鲲鹏服务器) |
| 索引主分片默认值 | 新建索引默认1主分片(7.0开始废除5分片) | 依旧默认1主分片 |
| 集群协调算法 | 全新投票集群协调(移除minimum_master_nodes) | 沿用同一套集群协调;删除zen2相关旧配置参数 |
三、REST API 破坏性变更(升级最容易线上报错)
1. Type文档类型
-
ES7:废弃type,警告不报错;仍然兼容
PUT index/type/1,控制台输出deprecated告警。 -
ES8:彻底删除type ,带type路径请求直接返回400报错 ,只允许
PUT index/_doc/1ES7可跑(告警) ES8报错!
PUT /test_index/my_type/1
标准写法,7&8都兼容
PUT /test_index/_doc/1
2. 删除所有_xpack前缀接口
7.x旧接口 →8.x新接口
GET /_xpack/security/user → GET /_security/user
GET /_xpack/watcher → GET /_watcher
GET /_xpack/sql → GET /_sql
ES8访问带
/_xpack路径接口直接404报错
3. 危险操作保护开关
- ES7:
action.destructive_requires_name默认关闭;DELETE test‑*通配符删除索引可以直接执行,风险高 - ES8:默认开启 ;禁止通配符
*删除索引,只能写完整索引名称;防止误删大批索引
4. 7兼容请求头(临时过渡方案)
ES8提供兼容头,可以让7.x老代码短期不用改动就能访问8集群
Content‑Type: application/json
Elastic‑Api‑Version: 7
只是临时兼容方案,不支持8的新API,长期必须迁移
5. 被彻底移除的旧配置项(写到yml启动直接报错)
discovery.zen.*全部zen集群旧参数minimum_master_nodes(7.x已经废弃,8彻底删除)bootstrap.system_call_filterlistener线程池配置、fixed_auto_queue_size线程池类型xpack.ilm.enabled:false、xpack.ml.enabled:false,ILM、ML、Watcher模块永久启用,不能关闭,配置该参数启动报错
6. 索引模板变更
- ES7同时支持旧版模板 + V2 composable可组合索引模板
- ES8 默认优先使用V2组合模板,旧模板逐步淘汰。
四、Java客户端重大变化(后端开发最大痛点)
ES7客户端:Rest‑High‑Level‑Client(HLRC)
<!-- ES7主流客户端 -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch‑rest‑high‑level‑client</artifactId>
<version>7.17.16</version>
</dependency>
- 状态:7.17之后停止维护、不再迭代,不会适配ES8新增能力
- 连接ES8:7.17版本HLRC可以访问ES8集群,仅作为过渡方案,无法使用向量搜索、Inference等8新接口
ES8全新官方强类型客户端 elasticsearch‑java
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch‑java</artifactId>
<version>8.15.0</version>
</dependency>
- 全新API、流式构建器、强类型对象,告别7的一堆
Request/Response;支持异步客户端;Lambda链式调用 - API写法完全不一样,代码改动量大,是升级成本最高的一块
重要提醒:旧的
TransportClient早在7.x就废弃,ES8彻底移除,完全不可用。
五、向量搜索&AI语义检索能力(8最大的新能力亮点)
| 项目 | ES7.17 | ES8.x |
|---|---|---|
| dense_vector字段 | 支持字段定义;但是只有暴力扫描script‑score查询;向量数据集一大查询性能极差,仅适合小样本测试 | 原生支持 HNSW ANN近似最近邻算法(k‑nn搜索),大规模向量查询速度提升几十上百倍;可以作为轻量级向量库做RAG检索 |
| 稀疏向量 | 无原生支持 | ELSER内置稀疏向量模型,原生语义搜索,不需要外部Embedding服务 |
| NLP推理Inference API | 无 | 内置推理接口,可部署文本嵌入、分类NLP模型 |
六、新查询语言与功能特性对比
- EQL事件查询语言
- ES7:无
- ES8:原生EQL,专门用来检索日志安全事件序列,适合排查攻击链路、事件先后顺序
- 分层存储(数据生命周期)
- ES7 ILM冷热分层可用,配置繁琐
- ES8 数据层Tier默认开启,数据自动冷热迁移优化;搜索快照性能大幅提升
- 系统索引保护:ES8加强系统内置索引(.security等)防护,普通用户无法直接修改系统索引
七、运维、集群升级、降级规则
升级路径硬性约束
- 7.x → 8.x:必须先升级到7.17.LTS,执行升级助手Upgrade‑Assistant检查所有弃用API;禁止7.16及更早版本直升8.x
- 降级:升级到8之后,无法直接降级回7!如需回滚只能使用升级前的快照文件进行数据恢复,风险很高。
单节点模式
discovery.type: single‑node 单节点开发模式依旧可用,但是安全、证书规则不变,默认开启HTTPS。
八、Python等其他客户端变化
-
ES7客户端:
elasticsearch‑py 7.x -
ES8:新版客户端要求关键字传参,不支持位置参数调用
ES7写法(8.x报错)
es.indices.get("*")
ES8正确写法
es.indices.get(index="*")
九、存储&性能优化
- Lucene9索引压缩:text、keyword字段存储占用下降;磁盘占用更少
- 聚合查询、日期直方图查询CPU开销降低,大数据量聚合速度提升
- JDK17带来ZGC垃圾回收性能优化,大堆内存GC停顿改善
十、选型决策对照表
✅ 新项目优先ES‑8.x
- 优点:开箱安全、原生向量检索、长期官方维护、JDK17性能更好、ARM适配完善
- 代价:客户端代码重写;业务改造HTTPS证书接入
✅ 存量老业务(ES7集群)推荐留在7.17.x LTS
- 如果当前业务没有向量检索需求,升级收益不大;升级改动成本高(客户端代码、证书改造、全链路https改造);7.17还拥有较长支持周期。
十一、常见升级踩坑清单
- 所有客户端地址
http://改成https://,忘记改会报连接拒绝 - Java程序没有导入
http_ca.crt根证书,SSL握手失败 - 代码中残留旧type路径、/_xpack接口,请求报错404/400
- yml配置文件里面遗留
discovery.zen、关闭ilm/ml等废弃配置,集群启动失败 - 定时脚本里面使用通配符删除索引
DELETE test‑*执行失败