从 0 到 1 搭建亿级商品 ES 搜索引擎
建设并维护一个亿级的搜索引擎并非易事,也不存在一劳永逸的最优治理方法。本文是在实践中不断学习和总结的成果,介绍了如何搭建一个可支持从千万级到亿级商品量级的搜索系统,并实现查询总 QPS 从百级增长到千级,写入总 QPS 从百级增加到万级的过程。其中,ES 资源扩容是必不可少的,但除此之外,本文还将重点介绍一些扩容无法解决的 ES 性能问题。希望通过本文大家可以对 ES 的使用场景有更多数据和使用上的参考。由于篇幅有限,关于稳定性治理的部分将在下篇文章中进行介绍。
业务介绍
数据中心
- 指标:指标是被我们用来描述一个实体或者对象的某个属性的元数据,比如商品名称,店铺体验分,达人等级,报名记录 ID,同时它也可以是某个对象的最小更新和获取单位,比如商品比价信息。一切有明确语义的字段我们都可以定义为指标 。
- 集合:表示一组可通过某种共性收敛的集合,比如商品属性集合,店铺属性集合,分别可以用商品 ID,店铺 ID 去获取,也可以是商品报名记录集合,通过报名记录 ID 获取,它在业务上表达一组有关联关系的指标,和指标是1对多的关系。
- Solution:数据获取方案,我们抽象出指标和集合两个概念,是为了数据可以以最小单位获取,并且可以不断横向扩展,Solution 帮我们抽象不同集合下的指标的获取方式。
- 自定义表头:自定义表头即指任何一个二维行数据列表要展示的 Title,它和指标是 1 对多的关系;
- 筛选项:筛选项即指任何一个二维行数据列表需要使用的筛选项,它可指标是 1 对 1 的关系;
- 审核视图:审核视图指的是审核业务场景下,由一组自定义表头和一组筛选项可动态渲染出来的一个审核页面。
从 0 到 1 搭建 ES 集群
- 基本容灾机制,是指当系统因为基础组件,以及读写流量变化使性能受到影响时,业务能及时自我调整。
- 数据最终一致性,指报名记录 DB --> ES 多机房数据是完整的。
方案调研
ES 集群容量评估
- 每个索引应该设置多少分片,后续预估数据增量有多少,读写流量预估;
- 单个集群应该设置几个数据实例,单个数据实例采用什么规格;
- 了解垂直扩容和水平扩容的区别,当数据量超预期激增,或者流量超预期激增,我们的应对策略是什么,以及 ES 集群容灾应该怎样设计。
- ES 索引分片数一旦设定,不可修改,所以确定分片数很重要,通常分片数和 ES 实例成整数倍关系,保证负载均衡;
- 单个分片的大小在 10~30G 是比较合理的,索引过大会影响查询性能;
- 流量激增可以依靠扩容解决,数据激增可删除存量老旧数据或增加分片数解决;并且必须采用多机房容灾部署方案部署,互为容灾机房。
数据同步链路选型
- DB -> ES 需要是准实时数据流,报名记录等信息的变化必须是准实时可搜索到的;
- 报名记录除了本身字段还需要补充其报名商品,店铺,达人等属性字段,也写入到 ES,且 能够支持部分更新,所以 ES 写入方式只能是 Upsert 方式;
- 单条报名记录更新必须是有序的,且不可冲突的。
ES 索引基本配置调研
- {"dynamic": false}避免 es mappings 自动膨胀,或新增非预期索引类型;
- index.translog.durability=async,异步刷新 translog 有利于提升写入性能,但是有丢数据风险;
- ES 默认 refresh interval为 1s,即表示数据写入成功后最快一秒可以查到。
数据同步方案
方案一:通过 异构数据同步(Dsyncer)直接写入 ES 多机房
- 直写在满足 ES 同步部署多机房的诉求上是处于弱势的,因为无法保证多机房同时写成功,那部署多个异构数据分别写可以吗?可以的,即工作量增加三倍,大约十几个索引。
- 直写 Bulk 的写入能力是相对弱的,随着流量波动写入尖刺也会比较明显,对 ES 的写入性能不友好。
- 直写无法保证 ES 多更新入口的情况下单条报名记录的有序更新,增加全局 Version 版本可以?可以的,但太重了。
方案二:通过 RocketMQ 写 ES 单机房
方案三:通过 RocketMQ + Flink 方式写 ES 多机房 ✅
- 首先 ES 写入是基于 Version 版本号做乐观锁控制的,如果同时并发更新同一条记录,那么我们同时拿到的 Version 版本是一样的,假设是1,那么大家都将 Version 更新成2去写入,就会发生冲突,总是发生冲突就会造成丢失更新的问题;
- 一般业务场景都是需要保证基于 Key 有序消费,也是 Partition 有序消费,有序消费需要有两个必要条件:消息被存储时保持和发送的顺序一致;消息被消费时保持和存储的顺序一致。
- 对于指定的一个 Topic,所有消息根据 Sharding Key 分成多个(Queue)。
- 同一个 Queue 内的消息按照严格的 FIFO 顺序进行发布和消费。
- Sharding Key 是顺序消息中用来区分不同分区的关键字段,和普通消息的 Key 是完全不同的概念。
- 适用场景:性能要求高,根据消息中的 Sharding Key 去决定消息发送到哪一个 Queue,一般分区有序就可以满足我们的业务要求,同时性能高。
多层对账机制
业务校验平台(BCP)秒级对账
- 避免多流对账的数据流链路较长,会带来的不可控延迟问题,导致校验准确性偏低。
- BCP 对账的维护成本会大大降低,因为采用多流的话,多机房对账我们需要维护多份 BCP 对账,这其中依赖维护的基础组件更多。
分钟级对账
T+1 离线对账
总结

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
零一万物发布 Yi 大模型 API 并启动公测,支持上下文 200K
零一万物通过其微信公众号宣布,经过一段时间的开发和内测正式发布Yi大模型API,同时启动邀测。目前,Yi 大模型 API 邀测名额限量开放中,申请成功即送1000万tokens。 此次邀测提供了两种模型: Yi-34B-Chat(0205):支持聊天、问答、对话、写作、翻译等功能。 Yi-34B-Chat-200K:200K 上下文,多文档阅读理解、超长知识库构建小能手。 模型优势 超长上下文 本次重磅出台 Yi-34B-Chat-200K API,加速大模型应用进入“长文本时代”。200K 支持处理约 20~30 万个中英文字符(例如,可以轻松处理整本《哈利•波特与魔法石》小说),适合用于多篇文档内容理解、海量数据分析挖掘和跨领域知识融合等,为各行各业提供了极大的便利。例如,金融分析师可以用它快速阅读报告并预测市场趋势、律师可以用它精准解读法律条文、科研人员可以用它高效提取论文要点、文学爱好者可以用它快速掌握作品精髓等,应用场景非常广泛。 例如,以下是 Yi-34B-Chat-200K 对经典文学作品《呼啸山庄》进行复杂角色和角色关系的归纳总结,该小说篇幅庞大(中文字数约 30 万字...
- 下一篇
OSPO 成熟度模型(中文版)
由 TODO Group 出品 原文链接: https://github.com/todogroup/ospology/tree/main/ospo-model/en 本文由 vivo 互联网 OSPO 成员整理翻译, 目前已提交贡献至上游。 vivo 作为 TODO Group会员,推动了 TODO Group官网中文版的发布,并基于全球同行共识,翻译发布了 OSPO 定义2.0、OSPO 思维导图。 OSPO(Open Source Program Office):开源项目办公室,被视为开源治理的最佳实践。 组织 OSPO 模型分类标准 我们希望这是一份动态文件,旨在建立 OSPO 模型的分类标准并确定有助于不同组织学习和实施的关键组件(模式)。 社区可以对五阶段 OSPO 成熟度模型进行颠覆式贡献,以更好地满足特定垂直行业和/或地区的需求。 OSPO 模型 1 —— 五阶段 OSPO 成熟度模型 完整研究可以查阅 OSPO 的演进 欲了解更多 OSPO 特点、组织架构和角色相关信息,请查看深入了解 OSPO(中文版) 随着 OSPO 的激增和普及,这些专项也日趋成熟。通过把 OS...
相关文章
文章评论
共有0条评论来说两句吧...