一、引言

随着移动互联网、物联网、云计算等信息技术蓬勃发展,数据量呈爆炸式增长。如今我们可以轻易得从海量数据里找到想要的信息,离不开搜索引擎技术的帮助。

作为开源搜索引擎领域排名第一的 Elasticsearch,能够让我们无需深入了解背后复杂的信息检索原理,就可实现基本的全文检索功能,在数据量达到十亿,百亿规模仍然可以秒级返回检索结果。

对于系统容灾、数据安全性、可扩展性、可维护性等用户关注的实际问题,在Elasticsearch 上也能得到有效解决。

二、Elasticsearch 介绍

Elasticsearch(ES)是一个基于 Lucene 构建的开源分布式搜索分析引擎,可以近实时的索引、检索数据。具备高可靠、易使用、社区活跃等特点,在全文检索、日志分析、监控分析等场景具有广泛应用。

由于高可扩展性,集群可扩展至百节点规模,处理PB级数据。通过简单的 RESTful API 即可实现写入、查询、集群管理等操作。

除了检索,还提供丰富的统计分析功能。以及官方功能扩展包 XPack 满足其他需求,如数据加密、告警、机器学习等。

另外,可通过自定义插件,如 COS 备份、QQ 分词等满足特定功能需求。

1. Elasticsearch 架构与原理

基本概念 :

  • Cluster「集群」:由部署在多个机器的ES节点组成,以处理较大数据集和实现高可用;

  • Node「节点」:机器上的ES进程,可配置不同类型的节点;

  • Master Node「主节点」:用于集群选主。由其中一个节点担任主节点,负责集群元数据管理,如索引创建,节点离开加入集群等;

  • Data Node「数据节点」:负责索引数据存储;

  • Index「索引」:索引数据的逻辑集合,可类比关系型数据的DataBase;

  • Shard「分片」:索引数据子集,通过将分片分配至集群不同节点,实现数据横向扩展。以解决单个节点CPU、内存、磁盘处理能力不足的情况;

  • Primary Shard「主分片」:数据分片采用主从模式,由分片接收索引操作;

  • Replica Shard「副本分片」:主分片的拷贝,以提高查询吞吐量和实现数据高可靠。主分片异常时,其中一个副本分片会自动提升为新的主分片。

为了便于大家理解ES里的数据模型,将它与关系型数据库 MySQL 做类比:

从上面架构图可以看出,ES 架构非常简洁。内置自动发现实现 Zen discovery,当一个节点启动后,通过联系集群成员列表即可加入集群。

由其中一个节点担任主节点,用于集群元数据管理,维护分片在节点间的分配关系。当新节点加入集群后,Master 节点会自动迁移部分分片至新节点,均衡集群负载。

分布式集群难免有节点故障。主节点会定期探测集群其他节点存活状态,当节点故障后,会将节点移出集群,并自动在其他节点上恢复故障节点上的分片。

主分片故障时会提升其中一个副本分片为主分片。其他节点也会探活主节点,当主节点故障后,会触发内置的类 Raft 协议选主,并通过设置最少候选主节点数,避免集群脑裂。

除了集群管理,索引数据读写也是我们关心的重要部分。ES 采用 peer-to-peer 架构,每个节点保存全量分片路由信息,也就是每个节点均可以接收用户读写。

如发送写入请求至节点 1,写入请求默认通过文档 ID 的 Hash 值确定写入到哪个主分片,这里假设写入到分片 0。

写完主分片 P0,并行转发写入请求至副本分片 R0 所在节点,当副本分片所在节点确认写入成功后返回客户端报告写入成功,保障数据安全性。并且写入前,会确保 quorum 数量的副本数,避免网络分区导致写入数据不一致。

查询采用分布式搜索,如请求发给节点3后,请求会转发至索引的主分片或副本分片所在节点。

当然如果写入、查询均带有路由字段信息。请求只会发送给部分分片,避免全量分片扫描。这些节点完成查询后将结果返回给请求节点,由请求节点汇聚各个节点的结果返回给客户端。

2. Lucene原理

介绍完 ES 集群基本原理,下面简单介绍下ES的底层存储引擎 Lucene。

首先 Lucene 是一款高性能的信息检索库,提供索引和检索基本功能。ES 在此基础上解决可靠性、分布式集群管理等问题最终形成产品化的全文检索系统。

Lucene 解决的核心问题便是全文检索。与传统的检索方式不同,全文检索避免在查询时进行全部内容扫描。

比如数据写入后,首先会对写入的文档字段内容分词,形成词典表和与它关联的倒排表。查询时由关键词分词结果直接匹配词典表内容,并获取关联的文档列表,快速获取结果集。并通过排序规则,优先展示匹配度高的文档。

Lucene 为了加快索引速度,采用了 LSM Tree 结构,先把索引数据缓存在内存。当内存空间占用较高或到达一定时间后,内存中的数据会写入磁盘形成一个数据段文件(segment)。段文件内包含词典、倒排表、字段数据等等多个文件。

为了兼容写入性能和数据安全性,如避免内存缓冲区里的数据因为机器故障丢失。ES 在写内存的同时也会写事物日志 Translog。内存里的数据会定期生成新的段文件,写入开销更低的文件系统缓存即可打开和读取实现近实时搜索。

三、Elasticsearch 应用场景

ES的典型使用场景有日志分析、时序分析、全文检索等。

1. 日志实时分析场景

日志是互联网行业基础广泛的数据形式。典型日志有用来定位业务问题的运营日志,如慢日志、异常日志;用来分析用户行为的业务日志,如用户的点击、访问日志;以及安全行为分析的审计日志等。

Elastic 生态提供了完整的日志解决方案。通过简单部署,即可搭建一个完整的日志实时分析服务。ES 生态完美的解决了日志实时分析场景需求,这也是近几年 ES 快速发展的一个重要原因。

日志从产生到可访问一般在 10s 级,相比于传统大数据解决方案的几十分钟、小时级时效性非常高。

ES底层支持倒排索引、列存储等数据结构,使得在日志场景可以利用ES非常灵活的搜索分析能力。通过ES交互式分析能力,即使在万亿级日志的情况下,日志搜索响应时间也是秒级。

日志处理的基本流程包含:日志采集 -> 数据清洗 -> 存储 -> 可视化分析。Elastic Stack通过完整的日志解决方案,帮助用户完成对日志处理全链路管理。

其中:

  • 日志采集:通过轻量级日志采集组件FileBeat实时读取业务日志文件,发送数据至下游组件如 Logstash。

  • 文本解析:利用正则解析等机制,将日志文本数据转换成结构化数据。可使用独立的Logstash 服务或 Elasticsearch 内置的轻量级数据处理模块 Ingest Pipeline,完成数据清洗和转换。

  • 数据存储:通过 Elasticsearch 搜索分析平台进行数据持久存储,提供全文搜索和分析能力。

  • 可视化分析:通过功能丰富的图形界面,即可对日志数据进行搜索分析,如可视化组件 Kibana。

2. 时序分析场景

时序数据是按时间顺序记录设备、系统状态变化的数据。典型的时序数据有传统的服务器监控指标数据、应用系统性能监控数据、智能硬件、工业物联网传感器数据等。

早在2017年我们也基于ES进行了时序分析场景的探索。时序分析场景具有高并发写入、低查询时延、多维分析的特点。

由于ES具有集群扩展、批量写入、读写带路由、数据分片等能力,目前已实现线上单集群最大规模达到 600+节点、1000w/s 的写入吞吐、单条曲线或单个时间线的查询延时可控制在 10ms。

ES提供灵活、多维度的统计分析能力,实现查看监控按照地域、业务模块等灵活的进行统计分析。另外,ES支持列存储、高压缩比、副本数按需调整等能力,可实现较低存储成本。最后时序数据也可通过Kibana组件轻松实现可视化。

3. 搜索服务场景

搜索服务典型场景有像京东、拼多多、蘑菇街中的商品搜索;应用商店中的应用APP搜索;论坛、在线文档等站内搜索。

这类场景用户关注高性能、低延迟、高可靠、搜索质量等。如单个服务最大需达到 10w+ QPS,请求平均响应时间在 20ms以内,查询毛刺低于 100ms,高可用如搜索场景通常要求 4 个 9 的可用性,支持单机房故障容灾等。

目前云上 Elasticsearch 服务已支持多可用区容灾,故障分钟级恢复能力。通过 ES 高效倒排索引,以及自定义打分、排序能力与丰富的分词插件,实现全文检索需求。在开源全文检索领域,ES 在 DB-Engines 搜索引擎类别持续多年排名第一。

四、腾讯 Elasticserch 服务

腾讯内外部均有大量的日志实时分析、时序数据分析、全文检索需求场景。

目前我们已联合 Elastic 公司在腾讯云上提供了内核增强版 ES 云服务,简称CES,其中内核增强包括 Xpack 商业套件和内核优化。

在服务公司内部以及公有云客户过程中,也遇到了较多问题和挑战,比如超大规模集群,千万级数据写入,以及云上用户丰富的使用场景等。

下文将介绍我们在内核层面,从可用性,性能,成本等方面进行的优化措施。

1. 可用性优化

可用性 问题表现在三个方面:

(1)ES 内核系统健壮性不足 

这也是分布式系统共性难题。例如异常查询、压力过载集群容易出现雪崩。集群可扩展性不足,比如集群分片数超10w会出现明显的元数据管理瓶颈。以及集群扩容、节点异常后加回集群,存在节点、多硬盘之间数据不均问题。

(2)容灾方案欠缺

需保障机房网络故障时可快速恢复服务,自然灾害下防止数据丢失,误操作后快速恢复数据等可靠性、数据安全性问题。

(3)系统缺陷

另外也包括在运营过程中发现的一些 ES 系统缺陷 ,比如说 Master 节点堵塞、分布式死锁、滚动重启缓慢等。

针对上面的问题,在系统健壮性方面,我们通过服务限流,容忍机器网络故障、异常查询等导致的服务不稳定问题。

通过优化集群元数据管理逻辑,提升集群扩展能力一个数量级,支持千级节点集群、百万级分片数。集群均衡方面,通过优化节点、多硬盘间的分片均衡,保证大规模集群的压力均衡。

容灾方案 方面,我们通过扩展 ES 的插件机制实现数据备份和回档,可把 ES 的数据备份到 COS,保障数据安全性;通过管控系统建设支持跨可用区容灾,用户可以按需部署多个可用区,以容忍单机房故障。采用垃圾桶机制,保证用户在欠费、误操作等场景下,集群数据可快速恢复。

系统缺陷方面,我们修复了滚动重启、Master 阻塞、分布式死锁等一系列 Bug。其中滚动重启优化,可加速节点重启速度 5+倍。Master 堵塞问题,我们在 ES 6.x 版本和官方一起做了优化。

2. 性能优化

性能问题,比如以日志、监控为代表的时序场景,对写入性能要求非常高,写入并发可达 1000w/s。然而我们发现在带主键写入时,ES 性能会衰减 1+倍。

压测场景下发现CPU 存在无法充分利用的情况。通常搜索服务对查询性要求非常高,一般要求 20w QPS, 平均响应时间小于 20ms,并且需尽量避免 GC、以及执行计划不优等造成的查询毛刺问题。

为了解决这些问题。写入方面,针对主键去重场景,我们通过利用段文件上记录的最大最小值进行查询裁剪,加速主键去重的过程,写入性能提升 45%,具体可参考 Lucene-8980[1]。

对于压测场景下 CPU 不能充分利用的问题,通过优化 ES 刷新 Translog 时锁粒度,避免资源抢占,提升性能提升 20%,具体可参考ES-45765 /47790[2]。我们也正在尝试通过向量化执行优化写入性能,通过减少分支跳转、指令 Miss,预期写入性能可提升 1 倍。

查询方面,我们通过优化段文件合并策略,对于非活跃段文件会自动触发合并,收敛段文件数以降低资源开销,提升查询性能。

根据每个段文件上记录的最大最小值进行查询剪枝,提升查询性能 40%。通过 CBO 策略,避免缓存较大开销的 Cache 操作导致产生 10+倍的查询毛刺,具体可参考Lucene-9002[3]。

另外还包括优化 Composite 聚合中的性能问题,实现真正的翻页操作,以及优化带排序场景的聚合使得性能提升3-7倍。此外,我们也在尝试通过一些新硬件来优化性能,比如说英特尔的 AEP、Optane、QAT 等。

3. 成本优化

成本方面主要体现在以日志、监控为代表的时序场景对机器资源的消耗。结合线上典型的日志、时序业务统计数据发现,硬盘、内存、计算资源的成本比例接近 8:4:1。

可以得出硬盘、内存是主要矛盾,其次是计算成本。而这类时序类场景有很明显的访问特性,也就是数据具有冷热特性。

时序数据访问具有近多远少的特点,比如近 7 天数据的访问量占比可达到 95%以上,而历史数据访问较少,并且通常都是访问统计类信息。

硬盘成本方面,由于数据具有明显的冷热特性,我们采用冷热分离架构,使用混合存储的方案来平衡成本和性能。

由于历史数据通常只是访问统计信息,我们采用预计算 Rollup 换取存储和查询性能,类似物化视图。对于完全不使用历史数据,也可以备份到更廉价的存储系统如 COS。其他一些优化方式包括多盘策略兼容数据吞吐与数据容灾,以及通过生命周期管理等定期删除过期数据等。

内存成本 方面,我们发现特别是大存储机型,存储资源才用了 20% 内存已不足。为了解决内存不足问题,我们采用 Off-Heap 技术,来提升堆内内存利用率,降低 GC 开销,并且提升单个节点管理磁盘的能力。

将内存占比较大的 FST 移到堆外管理,通过堆内存放堆外对象地址,避免堆内外数据拷贝。通过 Java 弱引用机制实现堆外对象内存回收,进一步提升内存使用率。

实现 32GB 堆内内存可管理 50 TB 左右磁盘空间,较原生版本有 10 倍提升,并且性能持平,而 GC 优势提升明显。

除了内核层面的优化,在平台层通过管控平台,支持云上服务资源管理、实例实例管理等实现服务托管。方便快捷进行实例创建和规格调整。

通过运维支撑平台中的监控系统、运维工具等保障服务质量。并通过正在建设的智能诊断平台发现服务潜在问题,实现了对内外部提供稳定可靠的 ES 服务。

腾讯内部,我们主导了 ES 产品开源协同,发现潜在问题,共同优化完善 ES,避免不同的团队重复踩坑。

同时我们也将优秀的方案积极贡献给社区,和官方及社区的 ES 爱好者们共同推动 ES 的发展。以腾讯 ES 内核研发为代表的团队,截至目前我们共提交了 60 多个 PR,其中有 70% 被合并,公司内 ES 开源协同 PMC 成员共有 6 位 ES/Lucene 社区 contributor。

五、结语

Elasticsearch 在腾讯内外部广泛应用于日志实时分析、时序数据分析、全文检索等场景。

目前单集群规模达到千级节点、万亿级吞吐。通过内核增强版 ES 为大家提供高可靠,低成本,高性能的搜索分析服务。后续我们仍需在可用性,性能和成本等方面持续优化 ES。

比如集群可扩展性不足问题,通过优化集群扩展性支持百万级分片秒级创建 index。ES 的存储成本问题,目前正在研发存储与计算分离方案,进一步缩减成本,提升性能。以及存在使用和维护成本高的问题,后续通过多级分区、智能诊断等提升ES的自动化和故障自愈能力,降低用户使用和维护成本。

未来,也会近一步探索 ES 在多维分析领域的其他可能性。持续在大数据领域提供更有价值的搜索分析服务。

参考资料:

[1] Lucene-8980:

https://github.com/apache/lucene-solr/pull/884

[2] ES-45765 /47790:

https://github.com/elastic/elasticsearch/pull/45765

[3] Lucene-9002:

https://github.com/apache/lucene-solr/pull/940

RECOMMEND

推荐阅读

《深入理解Elasticsearch(原书第3版)》

作者:[印度] 波哈维·荻西特(Bharvi Dixit)

译者:刘志斌

点击链接了解详情并购买

推荐语:这本Elasticsearch进阶实践指南,面向Elasticsearch的中高级读者,从设计原理、部署调优、高级特性、扩展开发等方面系统且深入地阐释Elasticsearch涉及的工具、方法、原则和最佳实践,帮助你全面提升技能,高效管理和使用Elasticsearch。

更多精彩回顾

书讯 |9月书讯(下)| 开学季,读新书

书讯 |9月书讯(上)| 开学季,读新书

上新 | 用户画像从0到100的构建思路
书单 | 大数据必备的十大工具

干货 | Istio进入1.7版本,Service Mesh 落地还有什么障碍?

收藏 | 还在为面试被问JVM发愁?来看看阿里P7大佬的JVM笔记吧

视频 | 大佬出镜推荐不可不读系列——程序员陈彼得

赠书 | 【第22期】网络安全在身边|最强学习书单整理

点击阅读全文购买

开源搜索引擎排名第一,Elasticearch是如何做到的?相关推荐

  1. logstash创建不了索引_「技术选型」Elasticsearch vs. Solr-选择您的开源搜索引擎

    我们为什么在这里?我存在的目的是什么?我应该运动还是休息并节省能量?早起上班或晚起并整夜工作?我应该将炸薯条和番茄酱或蛋黄酱一起吃吗? 这些都是古老的问题,可能有也可能没有答案.其中一些是非常困难或非 ...

  2. 一些开源搜索引擎实现——倒排使用原始文件,列存储Hbase,KV store如levelDB、mongoDB、redis,以及SQL的,如sqlite或者xxSQL...

    本文说明:除开ES,Solr,sphinx系列的其他开源搜索引擎汇总于此. A search engine based on Node.js and LevelDB A persistent, net ...

  3. 阿里P8架构师谈:开源搜索引擎Lucene、Solr、Sphinx等优劣势比较

    开源搜索引擎分类 1.Lucene系搜索引擎,java开发,包括: Lucene Solr Elasticsearch Katta.Compass等都是基于Lucene封装. 你可以想象Lucene系 ...

  4. 13款开源搜索引擎的介绍

    本文档转载自 http://blog.csdn.net/xum2008/article/details/8740063 对现有的开源的搜索引擎的一个简单介绍: Lucene Lucene的开发语言是J ...

  5. 开源搜索引擎 种子搜索_使用开源搜索引擎自定义您的互联网

    开源搜索引擎 种子搜索 很久以前,互联网很小,只有几个人可以将它们编入索引,这些人收集了所有网站的名称和位置,并按页面或印刷书籍中的主题列出了它们. 随着万维网网络的发展,"网络响动&quo ...

  6. 开源搜索引擎评估:lucene sphinx elasticsearch

    开源搜索引擎程序有3大类 lucene系,java开发,包括solr和elasticsearch sphinx,c++开发,简单高性能 Xapian,c++开发 搜索引擎程序这个名称不妥当,严格说来应 ...

  7. 快如闪电的开源搜索引擎:Typesense ,比Elasticsearch更快更易用

    一个快如闪电的开源搜索引擎,就如同Redis使用内存存储数据一样(这在Redis出现之前是不敢想象的,几乎没有人把全部的mysql数据存储到内存中),搜索引擎也是,之前各家做法都是尽量存磁盘,需要的时 ...

  8. 轻量的开源搜索引擎有哪些?

    这段时间有个朋友问我,个人站点的搜索功能用什么开源搜索引擎比较好,这里我就顺便推荐几个好用的. (怎么用?用哪个?这个可以自己去找,这里只是提供引擎名称) 1.like(这个不推荐用,因为效率太低,而 ...

  9. 开源搜索引擎资源[转]

    开放源代码搜索引擎为人们 学习.研究并掌握搜索技术提供了极好的途径与素材,推动了 搜索技术的普及与发展,使越来越多的人开始了解并推广使用搜索技术.使用 开源搜索引擎,可以大大缩短构建搜索应用的周期,并 ...

最新文章

  1. Python中通过lambda抛异常的奇技淫巧
  2. 3、Docker容器操作
  3. 如何多快好省的建设企业级呼叫中心(一)
  4. vc++中画线时xor_C ++'xor_eq'关键字和示例
  5. quartz获取缓存中所有运行中的Job
  6. 在Javascript中得到站点的根路径
  7. jedis访问redis学习笔记
  8. java动态数组_Java实现动态数组
  9. ceph的 cache tier实现分析
  10. 双目立体相机的基线如何求?
  11. 对机器学习中鲁棒性的理解
  12. 创建计算机桌面快捷方式图标异常,桌面图标显示异常怎么解决
  13. C语言编程 Switch 语句编写 最简单的日历
  14. 联想小新笔记本电脑显示很暗, 教你如何将将其亮度调到最高
  15. 简单解决Edge浏览器被sb360篡改的方法
  16. Axure 9.0入门设计APP界面
  17. 软件测试工程师应该学Python还是学Java?
  18. 计算机系笔记本电脑配置,笔记本电脑硬件配置全解析, 看完让你轻松选择笔记本...
  19. 网页设计期末课程大作业:基于HTML+CSS+JavaScript+Bootstrap制作响应式网站信息技术交流博客(7页)
  20. Dancing Link --- 模板题 HUST 1017 - Exact cover

热门文章

  1. div 添加失焦事件
  2. 手把手教你进行Pycharm活动模板配置
  3. minigui源码学习
  4. 嵌入式linux编程开发必备知识
  5. Android中通用配器的使用
  6. GNU GRUB 2.02系统启动项管理设置
  7. echarts配置项图文介绍——xAxis
  8. Echarts - legend、tooltip、xAxis属性设置
  9. 1106: [POI2007]立方体大作战tet
  10. vdi转vmdk VirtualBox与VMware硬盘格式转换及使用方法