摘要:本文整理自阿里巴巴技术专家郭嘉梁(梁楹)在 阿里云Elasticsearch 自研引擎年度发布 的演讲。主要内容包括:
- 阿里云Elasticsearch 日志场景最佳实践
- 阿里云Elasticsearch 引擎内核优化
- 阿里云Elasticsearch 性能评测
- 阿里云Elasticsearch 产品演示
一、阿里云Elasticsearch 日志场景最佳实践
1. 阿里云Elasticsearch 日志场景概况
阿里云Elasticsearch(简称ES)在线上拥有1W+的集群和6W+节点,为用户提供线上检索和分析服务,在这些集群中,日志集群占比35%,其平均CPU核数超过40个,数据量达到PB级别。日志集群具有数量多、单集群规模大的特点,覆盖包括游戏、医药、汽车等领域。
2. 日志场景集群特点
在进行引擎内核优化之前,首先需要了解日志场景集群的共性特点:
- 写入吞吐高:在线头部用户的单日写入吞吐量可达数十TB级;
- 查询秒级响应:日志场景集群通常会作为微服务的问题排查,或监控数据的大盘展示,因此查询端的响应是否及时,直接影响用户端的体验;
- 存储数据量大:日志场景集群的单日写入量大,数据存储周期长;
- 倾向访问近期数据
3. 日志场景自建集群的痛点:性价比低
- 贵:写入吞吐高, 存储时间长,导致计算资源和存储资源成本高;
- 慢:数据量大,导致扩容/宕机恢复慢, 数据迁移慢;
- 差:冷/热查询没有隔离机制,导致稳定性差;
- 难:索引多, 生命周期不同,导致冷/热数据迁移难管理;
4. 日志场景最佳实践大图
基于以上痛点,ES日志场景进行了诸多优化,主要包含以下五个方面:
- 冷热查询共享计算资源:冷热数据查询隔离,在维持查询稳定性的基础上,将用户计算成本降低50%;
- 低成本自研海量存储引擎:存储成本降低70%;
- 计算存储分离:海量冷数据快速恢复、快速弹性;
- 冷/热数据自动迁移:免运维;
- 托管写入:引入 Indexing Service 写入托管服务,用户无需为索引构建消耗资源,写入性能提升10倍以上;
5. 日志场景最佳实践成果
ES 日志场景最佳实践,为用户提供了高性价比的服务,主要体现在四个方面:
- 高稳定:
- 通过 IndexingService 让写入性能提升10倍;
- 针对自研海量存储引擎进行存储优化使查询秒级响应;
- 低成本:
- 自研海量存储引擎让存储成本降低70%;
- 冷热共享计算资源技术让计算成本降低50%;
- 高易用:
- 冷热数据自动迁移,高级监控功能实现免运维,全观测;
- 高可用:
- 通过自研海量存储引擎共享存储,以及计算存储分离技术,使用户的海量冷数据可以做到快速弹性,快速恢复;
二、阿里云Elasticsearch 引擎内核优化
1. 共享冷/热计算资源
- 计算成本降低50%:ES 提供冷热共享计算规格组,用户无需为冷数据单独购买 ECS 资源;
- AJDK 租户隔离技术:将冷/热查询的线程池置于不同租户中,当冷查询的线程或 CPU 资源影响到热查询,会优先保证热查询返回;
- 查询隔离等;
2. 查询性能优化
- 冷存储(Lucene查询剖析)
自研海量存储引擎的单次IO访问延迟可达到100毫秒以上,使用Lucene原生查询框架的端到端查询,对于这种延迟是无法接受的。
Lucene查询模型分为四个步骤(见下图):
- 根据用户的查询语句进行倒排链求交,获取文档ID列表;
- 如用户有排序或聚合的需求,根据文档ID列表串行查询 DocValue 索引,获取文档ID对应的指定字段值;
- 对指定字段值进行排序和聚合操作;
- 如客户有召回原文的需求,则需要查询原文索引并返回原文;
其中第二步访问 DocValue 的随机查询,是导致查询延迟高的重点。假设用户召回100个文档ID,单次IO查询是100毫秒,那么100个文档的排序或聚合操作就有10秒的端到端查询延迟。
- 冷存储
针对上述查询延迟问题,对Lucene的原生执行模式进行了如下改造:
- 按行查询→按列查询(见下图):由多线程完成获取 DocValue 文档值;
- AJDK 的 Wisp 协程技术:降低多线程间的切换开销;
- 预读:采用块的预读策略,以加速倒排链的访问;
- Codec 优化:采用大块压缩技术使单次IO可以返回多个文档值,从而降低总体IO次数。
- 冷存储(智能缓存)
在查询模式基础上提供智能缓存机制,在自研海量存储引擎中加入 SmartCache,对多种不同类型的索引采用自适应的淘汰策略,可以适配多种查询场景。比如针对 DocValue 索引采用了 N-LRU 的淘汰策略,防止一次对历史数据的分析型查询直接将 DocValue 的 Cache 刷满,导致淘汰一些有效数据。
3. 写入性能优化
使用 Indexing Service 中心化索引构建集群。
- 写入性能提升10倍:用户集群在收到写入请求后,将写入请求转发至 Indexing Service 集群,整个索引构建过程是在中心化集群完成,因此用户集群无需为索引构建消耗计算资源;
- 后端双集群互备保障高可用;
- 写入托管, 按量计费,进一步降低用户的使用成本。
4. 计算存储分离
冷数据采用自研海量存储引擎的存储介质,属于共享存储,用户的写入只在主分片进行构建,所有副本节点都是加载共享存储中的数据,真正做到一写多读,以及计算和存储解耦。由于数据只存储一份,在节点扩容或节点宕机时,无需进行节点间的数据拷贝,彻底消除海量数据迁移的开销。
三、阿里云Elasticsearch 性能评测
1. 自研海量存储引擎查询性能评测
a. 自研海量存储引擎成本
自研海量存储引擎的存储单价是0.15元/GB/月,对比高效云盘的0.35元/GB/月,降低了60%;对比SSD的1元/GB/月,降低80%以上;
b. 自研海量存储引擎查询延迟
优化后的自研海量存储引擎,对比高效云盘在查询延迟方面有显著降低。
在自研海量存储引擎与高效云盘的查询延迟对比图中,查询数据级是1.5TB索引,在24个16C64GB节点进行测试,单位是毫秒,针对两种查询语句分别进行测试,一种是只有对时间字段的简单查询,一种是对指定字段有AGG聚合分析的分析型查询。测试结果表明,自研海量存储引擎的查询性能更好,查询延迟降低了30%左右。
综上对比高效云盘,自研海量存储引擎的成本降低了60%,而总体查询性能提升了30%,自研海量存储引擎为用户提供了高性价比的存储介质选择。
2. IndexingService 写入性能评测
针对开启 Indexing Service 的集群和通用商业版集群进行写入 TPS 对比,对三种不同规格组(2C8GB,4C16GB,8C32GB)进行对比。对比结果显示:无论在哪个规格组,Indexing Service 的写入性能比原生 ES 写入性能提高了7-10倍。
四、阿里云Elasticsearch 产品演示
1. 进入阿里云Elasticsearch 产品控制台
https://elasticsearch.console.aliyun.com/
2. 创建 Elasticsearch 实例
3. 进入阿里云Elasticsearch 购买页面
其中有两种类型的集群供选择:通用商业版和日志增强版。日志增强版提供上面提到的针对日志场景的内核优化,如果用户需要存储日志数据,并希望享受阿里云提供的自研能力,可以选择日志增强版进行创建。
4. 进行集群配置
用户可以选择实例所在区域和可用区。在实例规格栏可以看到提供的冷热共享资源规格组和自研海量存储引擎存储。
5. 进入集群网络资源配置,选择专有网络和虚拟交换机。
6. 设置集群实例名称、登录名称及密码。
7. 进入订单确认页面,注意要勾选服务协议。
8. 通过控制台的 Kibana 访问 ES 实例。
9. Kibana 可视化控制默认公网无法访问,因此需要先配置公网的白名单入口。
配置公网访问的白名单IP:
10. 进入 Kibana 登录页面,输入集群的用户名和密码后进入 Kibana 控制台。
11. 在 Kibana 开发工具中进行 ES 集群 API 访问,如访问集群元数据,创建索引,创建文档并插入数据,搜索数据等。
访问集群元数据:
创建索引:
创建文档并插入数据:
搜索数据:
12. 高级监控和报警功能。
用户在高级监控页面可以看到集群层面和节点层面的监控信息,同时可以根据集群或节点的使用水位,配置相应的报警规则。
13. 日志数据查询。
为方便集群问题排查,系统提供了集群的日志展示,包括主日志,Searching 慢日志,Indexing 慢日志,GC 日志和 ES 访问日志。
用户在搜索框输入自定义查询语句和指定时间范围,即可进行日志数据查询。
以上是 Elasticsearch 控制台中的案例体验 Demo。欢迎大家到阿里云Elasticsearch 平台进行实例体验。
END
阿里云 ES 团队积极参与社区建设,与 Elasticsearch 社区和国内团队紧密合作,基于 Elasticsearch 在云原生的实践,推出了包括开发者报告、Elasticsearch 全观测、技术解析等电子书,对 ES 感兴趣的朋友可以多多关注。同时,在 ES 社区也会有丰富的线上线下活动,欢迎大家参与。