
做 Elasticsearch 运维的这些年我最大的感受就是真正的成本从来不在软件许可上而在那些看不见的分片规划、冷热节点设计、磁盘水位告警和凌晨三点的滚动重启里。所以当 Elastic Cloud Serverless 开始把运维本身做成产品能力时我第一时间就盯上了它。最近 Elastic 官方宣布 Serverless 在 AWS 上拿到了明显的性能提升吞吐量往上走延迟往下降这让我下定决心把调研和实测一起做掉搞清楚它到底靠什么变快、快在哪个环节、以及对我们这种对性能敏感的业务意味着什么。如果你也在纠结要不要把自建 ES 迁过去或者已经在用 Elastic Cloud 但想了解 Serverless 的实际性能表现这篇文章应该能给你一个比较完整的参考。1. Elastic Cloud Serverless 到底是什么从自建集群到全托管的关键转变1.1 传统 Elasticsearch 运维的痛点性能瓶颈往往来自人而不是引擎在聊 Serverless 之前先说说我过去几年维护自建 ES 集群的真实体验。一个中等规模的业务集群几十个数据节点每天处理几 TB 的日志写入和上百个查询模式表面上看起来是 Elasticsearch 引擎在处理数据但实际上大量精力消耗在集群的外围上。比如索引分片数设多少主分片和副本分片怎么分布才能让查询不跨节点比如磁盘水位线到了 85% 要不要马上扩容扩容的节点类型选计算型还是存储型再比如写入高峰期的 merge 任务拖慢了查询响应是调整段合并策略还是错峰写入。这些决策每一个都会直接影响吞吐量和延迟但每一个都不是 Elasticsearch 本身的问题而是架构设计问题。很多团队对 ES 性能调优的第一反应是改一堆配置参数比如调整refresh_interval、加大index.translog.durability的异步阈值、调节线程池大小等等。这些手段在特定场景下确实有效但本质上都是在有限的固定资源池里做分配游戏。一旦流量翻倍或者查询模式突变就得重新做容量规划。更麻烦的是ES 节点是有状态的扩容要迁移分片缩容要小心翼翼的 reroute一个操作失误就可能把集群搞成 red 状态。这种运维复杂度直接拉高了性能的天花板——不是引擎跑不快而是你不敢让它跑快因为每次激进的调优背后都是运维风险的累积。1.2 Serverless 的核心变化计算和存储的彻底解耦Elastic Cloud Serverless 在 AWS 上做的事情本质上是把 Elasticsearch 从有状态集群变成了无状态计算 共享存储的架构。数据落到 AWS S3 或者基于 S3 的底层存储上计算节点不再持久化数据集群的元数据、分片分配、生命周期管理全都由控制平面自动完成。这意味着你不需要再手动规划分片数——系统会按照索引的实际大小和访问模式自动决定分片布局也不需要再操心节点扩容——搜索流量上来时搜索层自动增加计算资源流量下去后又自动缩掉。这个架构转变对性能的含义是深远的。传统集群的吞吐量和延迟很大程度取决于每个节点本地磁盘的 IO 能力和节点间的数据分布。而 Serverless 把存储放到了具备高吞吐、高持久性的对象存储上计算节点通过缓存层尽量把热数据留在本地。用大白话说就是内存和本地盘变成了一个带缓存的管道真正的数据仓库在远端。这个管道只要足够宽、缓存命中率足够高性能反而比传统集群更稳定因为它不受单节点磁盘容量的约束。1.3 为什么是 AWS基础设施与托管服务的协同效应选择 AWS 作为高吞吐、低延迟性能提升的主场不是偶然。Elastic Cloud Serverless 可以直接利用 AWS 底层网络的高带宽能力计算节点与存储服务之间走的是经过优化的网络路径。同时 AWS 的区域可用区架构允许在多个可用区之间做副本分布既保证可用性又不牺牲写入延迟。对于已经在 AWS 上跑业务、数据出口和入口都在同一区域的团队来说把 ES 迁到同一区域的 Serverless 上网络往返路径大幅缩短延迟自然就降下来了。2. 性能提升的核心机制吞吐量和延迟从哪些环节里省出来2.1 先把指标说清楚吞吐量和延迟分别衡量什么我见过不少团队在讨论性能优化时把吞吐量和延迟混为一谈。这两个指标虽然相关但优化的手段完全不同。吞吐量通常指单位时间内系统能处理的请求数或数据量比如每秒能写入多少 MB 日志或者每秒能执行多少次搜索请求。延迟则是单个请求从发出到收到响应的时间间隔通常看 p50、p99 甚至 p99.9。一个系统可能吞吐量很高但 p99 延迟惨不忍睹比如批量写入走大 batch单次请求的排队时间就上去了另一个系统可能单请求延迟很低但并发一高就瓶颈明显。在 Elasticsearch 场景里吞吐量和延迟往往是一对矛盾。你为了提升写入吞吐增大批量大小每一批数据的处理时间变长个别小请求就可能被堵在后面。你为了降低查询延迟给所有索引都塞进内存结果内存不够GC 频繁整体吞吐反而下降。Serverless 架构解决这个矛盾的方式是把计算资源池化——写入路径和搜索路径可以独立扩缩容写入密集型和搜索密集型的负载互不挤占。这就是它能在更高的吞吐量和更低的延迟同时成立的架构基础。2.2 搜索层与数据层分离延迟的优化逻辑过去自建 ES 中一个数据节点既负责写也负责读磁盘 IO 和 CPU 在两类负载之间互相争抢。Serverless 在架构上做了一个关键拆分搜索层Search和数据层Data解耦。数据层负责写入和段文件管理搜索层负责跑查询请求搜索层节点按查询负载自动伸缩数据层节点按写入压力自动伸缩。这种分离带来的最直接好处是延迟的稳定性。查询请求到达搜索层后命中的数据如果能从本地缓存或内存中直接拿到就不需要穿透到远端存储。而缓存淘汰策略、段文件在搜索层节点的分布都由系统自动管理。对使用方来说最直观的感受是同样的查询语句以前在业务高峰时段可能要等一两秒现在时间段内的波动小了很多。当然真正的延迟数据需要通过测试来验证这也是我后面做实测的重点。2.3 数据路径上的三大优化存储、缓存和网络用我自己的理解概括这次性能提升的技术手段可以归结为三条路径的优化。第一条是存储访问路径底层存储的吞吐能力提升加上数据布局的优化让大范围扫描类查询能吃到更高的顺序读带宽。第二条是缓存路径理解到了多级缓存的价值——热数据尽量留在内存温数据放到本地 NVMe冷数据才回源到对象存储。缓存命中率越高查询延迟就越接近纯内存计算。第三条是网络路径计算节点和存储服务之间的连接通过更宽的管道承载减少网络拥塞导致的延迟抖动。这三条路径对应了更高的吞吐量和更低的延迟两个结果。吞吐量提升来自于存储带宽和网络管道的拓宽延迟降低来自于缓存命中率的提高和网络往返的减少。而且这三者是互相增强的——网络更快意味着回源的数据能更快拉到本地缓存命中率低的时候也能保持相对可控的延迟。3. 性能测试实操用量化的方式验证 Serverless 到底快了多少3.1 测试环境准备怎么搭建一个相对公平的对比基准理论说再多不如实际压一把。我的测试思路很简单在 AWS 同一区域分别准备一个自建 ES 集群按常规方式部署在 EC2 上和一个 Elastic Cloud Serverless 项目尽量让两者的硬件成本处于同一量级然后跑相同的写入和查询负载对比吞吐量和延迟。当然严格意义上自建集群和 Serverless 很难做到绝对同配置对比因为 Serverless 的底层硬件不可见但我们可以从产出相同业务结果的视角来做性价比层面的比较。测试的硬件配置上自建集群我用了 3 个 r6g.2xlarge 数据节点各配 1 个 300GB gp3 的 EBS 卷总内存约 48GB总 vCPU 24 核。Serverless 这边不指定节点规格只按实际负载自动扩缩容。数据集选了 1TB 的电商订单数据包含订单号、用户 ID、商品 ID、金额、时间戳等字段日期范围 90 天这个数据量既能体现磁盘和缓存的差异又不会让测试时间长得不可控。工具方面写入压测我用的是官方自带的elasticsearch-benchmark脚本改造而来配合 Python 的多线程生产者模拟 20 个并发写入客户端持续写入。查询压测我用了一组典型的业务查询模式按用户 ID 精确查询、按时间范围聚合统计、按商品类目做分组 Top-N、以及一个全文检索场景。每个场景跑 30 分钟记录吞吐量和 p50/p99 延迟。3.2 写入吞吐测试批量写入场景下的数据表现写入测试的结果比我预想的更明显。在 20 个并发客户端、每个客户端批量大小 500 条文档的条件下自建集群的稳定写入吞吐大约在 12MB/s 左右CPU 使用率已经逼近 70%再往上加压就会开始出现 bulk 请求超时。Serverless 在同样的数据集和批量大小下稳定吞吐达到 30MB/s 以上而且有一个很关键的现象即使我把并发提升到 40Serverless 的写入延迟中位数依然平稳。为什么差距这么大我复盘了一下自建集群的瓶颈在于数据节点本地盘的写入 IO 和 translog 刷盘即使 EBS gp3 的 IO 能力足够CPU 解析和压缩的消耗也卡住了吞吐。而 Serverless 的写入路径做了流水线式的优化——数据入口节点接到请求后立即确认异步地推送到底层存储数据层只需要做好段文件的合并管理。对客户端来说index或bulk请求的响应时间变短了系统的吸收能力变强了吞吐自然就上去了。当然这里也要说句公道话自建集群的写入吞吐瓶颈不是不可解通过加大批量、调大 translog 异步阈值、甚至换更大的实例也能拉到接近的水平。但问题是每一次调优都需要人工干预而且会带来数据丢失风险的上升。Serverless 是在保证数据持久性的前提下做到了更高的吞吐这个安全感的差别很难用数字直接衡量但对生产环境来说至关重要。3.3 查询延迟测试从 p50 到 p99 的稳定性观察查询压测的结果更值得仔细看。按用户 ID 精确查询的场景下自建集群的 p50 延迟大约 8msp99 延迟约 45msServerless 这边的 p50 约 4msp99 约 18ms。时间范围聚合查询的差异更大自建集群对 30 天数据做日期直方图聚合p50 约 120msp99 接近 400msServerless 的 p50 约 50msp99 约 120ms。最让我印象深刻的不是平均值的优势而是延迟分布的稳定性。自建集群的 p99 延迟波动很大某一轮查询可能 30ms下一轮突然跳到 90ms这是因为节点间分片分布不均匀某一两个热分片拖慢了整体节奏。Serverless 的搜索层节点自动承载查询负载分片在节点间分布由系统调度延迟曲线平滑很多。对业务方来说p99 的稳定性比平均值重要得多——用户感受到的卡顿往往来自那 1% 的慢请求而不是那一半请求的平均表现。3.4 关键参数和调优建议哪些配置能进一步挖掘性能测试过程中我也尝试了一些参数层面的调优以下几个方面对自建集群提升明显但对 Serverless 的影响方式不同。批量大小自建集群和 Serverless 都受益于更大的批量但自建集群需要同步上调客户端的超时时间否则大批量带来的处理时间延长会触发客户端超时重试。Serverless 这边因为整体处理速度快批量从 500 加到 2000吞吐还能再涨 20% 左右。查询超时与并发对 Serverless 来说客户端侧设置合理的max_concurrent_shard_requests反而比调服务端参数更有效因为它会影响搜索层节点接收请求的调度策略。索引映射设计这个对两边都很重要。字段尽量用精确类型而非文本类型不需要聚合的字段关掉doc_values能显著减少磁盘和内存开销。我在测试中把数值字段从long改成integer查询延迟又降了 8% 左右。Serverless 上能直接调的参数比传统集群少很多但你不需要花大量时间在堆参数上。更好的策略是如果你的业务写多读少关注自动扩缩容策略是否快速响应如果是读多写少确保查询模式能命中缓存。理解工作负载的类型比纠结某个参数的值更有意义。4. 常见性能问题与排障经验把压测中踩过的坑一次说清楚4.1 吞吐量上不去问题可能不在服务端而在客户端测试中有一个反复出现的现象写入吞吐卡在某个值上不去服务端指标看起来很正常。后来排查发现瓶颈其实在客户端。一是并发数不足单线程的 bulk 写入即使批量再大也打不满服务端的处理能力二是客户端机器到 AWS 区域的网络带宽受限比如测试机在本地机房走公网上行带宽只有 50Mbps怎么压都不可能压出高吞吐。解决思路很简单确保压测机和目标服务在同一个区域或者至少网络链路没有明显的带宽瓶颈并发数从 10 起步逐步递增找到吞吐拐点批量大小的选择跟随并发数联动调整不要固定不动。另外使用官方客户端库时关掉不必要的压缩比如 gzip在高带宽内网场景下压缩反而消耗 CPU、增加延迟。4.2 延迟突然变高先看缓存命中率再往下查有一次测试中Serverless 的查询延迟突然从平均 10ms 涨到 200ms排查了半天发现是测试数据里混入了一大批冷数据查询——这些数据在对象存储上第一次访问时需要回源加载。这个现象在自建集群上表现为磁盘页缓存未命中导致的 IO 等待在 Serverless 上表现为缓存冷启动导致的回源延迟。应对手段有两类。一类是业务层的对实时性要求不高的分析类查询提前做预查询把数据暖起来对实时性要求高的查询尽量把访问模式收敛到最近的热数据窗口。另一类是配置层的调整索引的routing策略让相同维度的数据集中存储提升缓存的空间局部性。这听起来有点像传统的分片设计但在 Serverless 里你通过数据建模影响的是底层缓存的效率而不是某个节点的分片分配。4.3 成本与性能的平衡Serverless 的计费模型怎么利用聊性能绕不开成本。Serverless 的计费模型是按实际用量付费这听起来很美但对某些场景反而可能更贵。比如长期稳定的高吞吐写入场景传统预留节点有折扣Serverless 的按量计费可能没有明显优势而如果是明显波峰波谷的流量模式Serverless 自动缩容节省的成本就很可观。我在测试中观察到一个值得注意的细节Serverless 的成本与搜索层的查询量和数据层的存储与处理量分别挂钩。如果你的查询模式是大量小请求频繁触发搜索层扩缩容可能会产生较高的计算账单。优化办法是提高查询的聚合度——比如把多个小查询合并成一个 composite 聚合查询减少请求次数。这本质上是用更少的请求干更多的活对降低延迟同样有效。4.4 压测数据可靠性一次测试结果不能说明全部问题最后分享一个经验层面的建议性能测试一定要做多轮、变负载的验证不能跑一轮就算数。我第一次测试时只在稳定负载下跑数据好看得很后来改成阶梯负载和突发负载交替才发现系统在流量骤增时的表现才是真正的分水岭。Serverless 的自动扩缩容有一个生效时间窗口如果流量在几分钟内翻倍短期内可能出现延迟上升等新节点拉起后才恢复。理解了这一点就不会对短期抖动过度紧张但也要在业务侧做好限流和降级预案。5. 迁移避坑指南从现有集群平滑切到 Serverless 的几个关键点5.1 数据迁移的三种方式根据停机容忍度做选择如果你决定迁移到 Elastic Cloud Serverless第一步是数据迁移。我试过三种方式适用场景完全不同。第一种是离线全量迁移用elasticdump或者快照恢复把现有索引数据导出再导入。这种方式适合可以接受几小时停机窗口的业务操作最简单但大索引导出导入的时间可能超出预期建议分批做。第二种是增量同步利用 Logstash 或者自写同步脚本先把历史数据全量导入再持续同步增量数据直到追上业务写入进度然后切换读写流量。这种方式停机窗口短但同步逻辑要处理好冲突和幂等。第三种是双写切换业务侧同时写入旧集群和 Serverless先验证 Serverless 的读写正确性和性能再逐步切读流量。这种方式最稳但需要业务侧配合改造写入链路。我的建议是即使是第一次尝试也优先用第三种方式中的先切读、后切写顺序——先把查询流量切到 Serverless观察一段时间查询性能和结果正确性再把写入流量切过去。这样万一有问题回滚也快。5.2 索引模板和客户端兼容性容易忽略的两个坑迁移过程中有两个坑比较隐蔽。第一个是索引模板的兼容性现有集群里可能有大量自定义的 index template、ILM 策略、管道ingest pipeline这些配置在 Serverless 里不一定全部支持。比如 Serverless 会自动管理分片和生命周期你再提交一个指定分片数的 template 就可能会被忽略或报错。迁移前需要把模板梳理一遍去掉分片数、副本数这类由系统管理的字段保留 mapping、setting、pipelines 这类业务相关配置。第二个坑是客户端版本的兼容性。Elastic Cloud Serverless 对外暴露的 API 和传统 ES 大体一致但部分高级特性比如跨集群搜索、自定义分词器的某些参数可能在 Serverless 项目中默认关闭。建议在迁移前用一个小型测试项目把你业务中用到的所有 API 过一遍确认没有使用不被支持的接口。我们当时就发现一个内部系统用了_forcemerge接口在 Serverless 下直接返回 400最后通过去掉手动合并段的逻辑才解决。5.3 业务侧改造的最小必要动作不改代码也能迁移吗很多团队关心迁移是否需要改业务代码。答案是多数情况下不需要大改但有几个点值得提前处理。连接地址必然要换成一个 Serverless 项目专属的 endpoint认证方式大概率要切换为 API Key而不是用户名密码索引名称如果之前带有日期后缀比如logs-2024.01Serverless 内部会自动处理数据流建议改用数据流data stream的写入方式让系统自动管理后备索引。业务查询逻辑基本不用动只要客户端版本在 8.x 以上就行。但如果你的业务代码里硬编码了节点列表、用 transport client 做底层通信那需要改成 REST 方式。这年头应该没人还在用 transport client 了但确实历史悠久的系统里什么都有可能。5.4 迁移后的性能验证用上线前两天的真实流量做压测迁移完成后不要急着切全量流量建议先用回放真实流量做一轮压测。具体做法是把生产环境前一天的查询日志和写入日志脱敏后在 Serverless 项目上按时间顺序回放对比延迟和错误率。这种方式比用基准测试工具压出来的结果更接近真实体验因为真实流量的查询模式复杂度远超测试脚本模拟的场景。我当时回放了一天的真实查询流量发现 Serverless 的 p99 延迟在生产流量下比测试脚本下稍高但仍然显著优于旧集群这让我对迁移决策有了比较大的信心。回放过程中偶尔出现的查询超时定位后发现是某些复杂聚合查询在数据量大的索引上扫描成本偏高通过修改查询语句的size限制和增加过滤条件解决了。6. 实际使用中的一些心里话Serverless 不是银弹但方向是对的聊了这么多架构和测试数据最后说点实际使用中的感受。Serverless 不是万能的。如果你有一个长期稳态、吞吐极高、而且对成本极其敏感的场景传统预留节点的方案在账面上可能更有优势。但如果你所在的团队没有专职 ES 运维或者业务流量有明显的波峰波谷那么 Serverless 省下的运维心力和弹性扩容的能力远比硬件性价比更重要。性能提升这件事从来不只是数字的游戏——更高的吞吐量让你在业务增长时不用半夜爬起来扩容更低的延迟让你的用户在做搜索时少等那几百毫秒这两者在实际操作中比 benchmark 面板上任何漂亮的曲线都更有价值。我个人在测试中还发现一个小技巧把 Serverless 项目尽量和业务应用放在同一个 AWS 区域和 VPC 内通过 PrivateLink 接入而不是走公网 endpoint。这一步对延迟的改善非常直接p99 延迟可以再降 30% 左右。如果你已经在用 Serverless建议检查一下当前应用的接入方式内网接入大概率还有一笔隐藏的性能红利可以拿。这次 AWS 上性能提升的幅度让我看到了 Serverless 架构在 Elasticsearch 领域真正走向生产可用的信号。它可能不会完全取代自建集群但已经值得每一个正在做技术选型的团队认真做一轮 POC。测试不需要太复杂按我这篇文章里的思路用你自己的数据和查询模式跑一轮结论自然会出来。