共计 6235 个字符,预计需要花费 16 分钟才能阅读完成。
一、引言
随着挪动互联网、物联网、云计算等信息技术蓬勃发展,数据量呈爆炸式增长。现在咱们能够轻易得从海量数据里找到想要的信息,离不开搜索引擎技术的帮忙。
作为开源搜索引擎畛域排名第一的 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
看腾讯技术,学云计算常识,就来云 + 社区