扩展ElasticSearch:实现分片并可用于存储亿万文档的实践

搜索引擎之王:Elasticsearch从入门到精通 文章摘要: Elasticsearch是一个分布式、RESTful的开源搜索分析引擎,基于Apache Lucene构建,能够快速处理海量数据的搜索、存储与分析。其核心特性包括分布式架构、实时索引、高可用性和多功能性,适用于全文检索、日志分析、业务监控等场景。Elasticsearch的核心概念包括集群、节点、索引、文档和分片,通过横向扩展和副本机制实现高性能与高可用性。随着版本迭代,类型(Type)概念逐渐被移除,建议每个索引仅存储一种文档类型。本文将从基础原理到高级实践,全面解析Elasticsearc 阅读详情

SignalFx以监控现代化基础架构而闻名,对来自AWS、Docker或Cassandra之类的指标进行分析,对数据实时执行分析,并启用警报以减少干扰。了解如何工作,核心在于搜索。如果用户在寻找想要的数据时,花费了大量时间,那么仅在数据处理与存储/检索方面速度比其他人快,这是不够的。因此,为了匹配居于SignalFx核心地位的SignalFlow分析引擎的速度,我们选用了ElasticSearch来满足日常搜索需求。

在本文中,我们将会介绍相关心得:如何在扩展ElasticSearch同时,保持为公司内部与外部的商业用户提供服务,让他们可以在SignalFx中继续搜索。


为什么选择ElasticSearch


尽管我们选择了Cassandra作为时间序列数据库,查询时速度也很快,但用它是无法运行特别检索或全文检索的。我们在处理与指标相关的元数据时,需要处理结构化文本。能够在这些数据之上执行查询正是ElasticSearch的优势。

我们发现,ElasticSearch具有高可扩展性,提供很棒的API,工程师们上手也很容易。易于配置这一点让缺乏相关操作经验的开发人员也能上手。此外由于构建于Lucene之上,可靠性也很高。

从2015年3月SignalFx创建开始,我们的ElasticSearch部署从6个分片扩展到24个分片(加上副本),在72多台机器上存放了数以亿计的文件。很快就会再翻倍,以跟上我们扩张的步伐。


在SignalFx中ElasticSearch的使用方式


SignalFx运行方式与人们使用它的原因,有很大程度是因为SignalFx能够分析维度与其他元数据。用户用指标承载元数据,就可以对原始指标,还有其他针对指标用元数据所做的分析进行合并、筛选或分组。举个例子:按照服务与客户端类型分组,获取API调用响应第90百分位的延迟。所有的元数据都存储在ElasticSearch中,用它执行索引与搜索。



在SignalFx图表中的筛选


类似指标名称、面板标题或detector名之类的元数据与功能,正是SignalFx用户在系统中寻找内容或对象的方式。无论何时,用户在使用目录时,都是由ElasticSearch提供搜索服务的。



在SignalFx目录中寻找信息


除了指标之外,SignalFx还能执行分析/生产,并能规避类似警报、代码推送、配置运行之类的事件。所有这些事件都以ElasticSearch进行存储、索引与搜索。



在SignalFx中的事件


元数据经常变化,使其具有高可变性。造成我们使用ElasticSearch的方式非常资源集中化,并由于用户依赖使用SignalFx提供服务,使得可用性成为最重要的问题。由于理论上我们可以无限扩张,自然最终面临两个主要挑战:有多少分片,在零停机的状态下如何重分片。


ElasticSearch的扩展挑战1:分多少片合适?


在ElasticSearch中,规模的基础单位是分片。我们通过将数据切分成可在集群节点中分布的更小数据块,来进行分片扩展。

索引可存储大量数据,这些数据会超过单节点的硬件限制。举个例子,一个占据1TB硬盘空间、有10亿文件的单独索引,可能不适合存放在单节点的硬盘上,也许在以单节点提供搜索服务时速度过慢。


为了解决这个问题,ElasticSearch提供功能来细分索引,将其切分成名为分片的多个片段。在创建索引时,可以简单定义所需要的分片数量。每个分片本身就是一个功能齐全、独立的“索引”,可以托管在集群中的任何节点上。

挑战在于找出正确的分片数,因为每次做决定都是以索引为单位的。由于查询是发送到所有分片上的,这会影响到性能、存储与扩展。为了修改分片的数量,必须通过新的分片配置来创建新索引,并全部进行迁移。这可不是件小事。

当然,无法提前知道会有多少查询,也无法提前得知扩展的规模。我们可以说:分个1万片等以后慢慢扩展。不过这样是行不通的:所有数据分为1万片,因为每个查询需要发给所有分片,就需要1万个响应,并带来同等规模的I/O、线程、环境切换与master协调等问题。这就是所谓的天文数字分片的问题。

不幸的是,没有神奇的公式。为了确定开始时需要多少分片,需要考虑索引未来的规模——大小、查询卷与写入负载。Elastic团队推荐从一个分片开始,发送“实际”流量,然后查看在哪里中断。之后,再增加一个分片,重新测试,直到找出合适的数量。关键是要选择一个时间表。最终必须重新分片,唯一的问题就是在什么时候。因此可以根据一些关系到ElasticSearch使用的增长指标(像是用户数量),得出预测的索引大小,将实际数字与希望每个分片的存储使用情况与性能做对比。然后从中进行推断。

还有:每个节点要有超过一个的分片。因此,如果确定你的索引需要三个分片,并将其分布到三个节点上(每个节点一个),而这些节点耗尽资源的话,就无计可施了。在每个节点放置一个分片代表着如果某个节点资源耗尽,就别无选择只能重新分片了。之前我们有过这样的经验,不推荐这种做法:SignalFx在一开始就非常成功,初始分到了6个节点上的6个分片很快就需要重新分片。导致我们面临着下面的这个挑战:


ElasticSearch扩展挑战2:零停机重新分片


通常情况下这样重新分片:

1、创建有新数量分片的新索引;

2、通过批量操作来迁移文件:读取旧索引中的所有文件,对应(复制)到新索引中。


在没有变更的情况下,这是一个简单的操作。不过如果有一个为用户创建新数据并提供查询服务的实时系统,原始索引中的文件会发生变化。想要获得准确的数据截图是不可能的,根据负载,很可能永远无法跟上原始索引中变更的节奏。最终从旧索引切换到新索引必须是原子量级的,我们需要确保在重定向查询并向新索引写入时,旧索引中的内容换到新索引中仍旧可用,这样查询才能在不中断的情况下继续提供服务。 

如果出错了会怎样?如何退回?或者如果新索引更慢呢?我们需要回退机制。这就是我们在使用ElasticSearch时的大量工作所在,带来零停机重新分片。 这种基本机制允许我们在重分片的过程中保持可用性,我们称之为索引分代(index generation)。我们将文件索引编入ElasticSearch时,会编写特殊字段,名为“索引分代”,一般情况下,对于索引中的所有文件都是相同的。我们一般将写入版本化。由于有很多状态需要存入,我们用了Zookeeper。


假设我们将初始(来源)索引标注为一代(gen-1),重分片为新的(目标)索引:


初始阶段

要开始重分片,我们用正确的分片数量创建新的索引(并进行变更映射)。新的索引有零个副本,设定刷新间隔为-1,因为我们还不需要查询该索引。

1、我们一般加速读取一系列新节点。这会耗费额外成本,不过据发现,这是最安全的选择。

2、如果来源索引的负载很低,并且会持续如此的话,这样完成全部工作是有可能的——不过并不推荐。


批量导入阶段

增量到第二代gen-2,确认所有写入索引的组件已经更新(我们使用Zookeeper来协调这个问题)。从这里开始,所有新文件或变更后的文件都是gen-2。这样我们就能够界定gen-1或更早的文件。


扫描来源索引,并批量导入gen-1(或更早的)文件到目标索引中。我们使用了滚动(scrolling),这是从索引中获得大量文件的最有效方式。

1、要记得scrolling是不允许合并从filesystem中取回的片段的,因为这些内容仍在使用中。

2、为了避免这一情况,我们依赖着索引中每个可用文件的bucket数量。在文件创建时就分配了bucket数量,是ID模数总bucket数(我们使用64k)的哈希。这样我们就能随机分割文件集了,并让bucket均匀分布(我们将其作为滚动的参数)——实际上防止了立即在整个索引中造成滚动。

3、这也提供了出错时滚回操作的办法。由于按我们的规模,批量导入需要数日,偶尔会出现暂停、恢复或回滚之类的问题。

4、现在我们可以停下来,无需回到索引最开始就能开启滚动了,因为我们按bucket来导入bucket,并追踪所在的bucket(在Zookeeper中)。这使得我们在迁移与因某种原因而暂停迁移时,可以自动处理崩溃问题。

5、我们还关闭了目标索引上的索引刷新,使得迁移速度更快,因为这样就无需响应任何请求了。


双重写入与清理阶段

一旦所有的gen-1文件在目标索引中获得确认,我们在Zookeeper中启动开关,指引所有写入操作在向源索引写入的同时,开始向目标索引执行写入。


增量到第三代gen-3。

1、现在我们知道,从这里开始所有的变更都属于gen-3;

2、所有gen-3变更同时向来源与目标索引执行写入;

3、属于gen-1的内容(或更早的)都已经迁移到目标索引中了;

4、只有gen-2文件需要解决来源与目标索引之间的协调问题;

5、gen-2文件是一个有界集(也就是说:其数量会保持不便或减少,但不会增加);


在来源索引中查询gen-2文件,写入到目标索引中,此时它们会成为gen-3文件。

1、我们还在执行双重写入,因此会同时写入两个索引中;在来源索引中查询gen-2文件,写入到目标索引中,此时它们会成为gen-3文件;

2、这一过程继续进行,直到来源索引中没有gen-2文件为止。


在最后一步完成后,我们知道目标索引已更至最新。


结束阶段

变更索引昵称,这是一个原子量级的操作。现在所有查询都由目标索引提供服务。

1、关闭双重写入。

2、关闭来源索引,释放资源。

3、将来源索引保留整一天,确保不时之需。


心得体会

在扩展ElasticSearch时,关于分片的问题,我们面临着两种截然不同的挑战:需要多少分片,如何在零停机的状态下重分片。不过只需几步,这些问题都解决了。 

1、通过基线增量,从一个单分片开始,然后逐渐增进。了解个人案例中的性能与存储平衡。 

2、每个节点需要不止一个分片,这样稍后就能通过增加节点来扩容。

3、将更长的进程切分为更小的部分:(1)对于滚动,我们通过bucket机制来实现(上面有具体过程)。(2)对于整体重分片进程,我们通过索引分代机制来解决(如上所述)。

谷歌早期技术决策解析:分布式架构与PageRank工程实践 分布式计算通过将任务分解到多台计算机并行处理,其核心原理在于容错设计和水平扩展能力。这种架构的技术价值在于能够以低成本普通硬件构建高可靠性系统,通过软件层面的冗余机制确保单点故障不影响整体服务。在搜索引擎等大数据处理场景中,分布式系统实现了索引分片、并行计算等关键技术,为海量数据处理提供可行方案。PageRank算法作为链接分析的重要方法,通过网页间的引用关系评估页面重要性,其工程化面临分布式计算和循环引用等挑战。本文以谷歌早期技术决策为案例,深入分析分布式架构和搜索算法在实际工程中的权衡与实践,为现代系统 阅读详情

相关推荐

ElasticSearch 内部原理之分布式文档存储

之前的文章中,我们已经知道如何存储数据到索引中以及如何检索它。但是我们掩盖了数据存储到集群中以及从集群中获取数据的具体实现的技术细节。

SmartSi 370

Elasticsearch-21.文档分布式存储和分片及其生命周期和剖析分布式查询及相关性评分

Elasticsearch 文档分布式存储 文档存储在分片上 文档会存储在具体的某个主分片和副本分片上:例如文档1,会存储在PO和RO分片.上 文档到分片的映射算法 确保文档能均匀分布在所用分片.上,充分利用硬件资源,避免部分机器空闲,部分机器繁忙 潜在的算法 随机/ Round Robin。当查询文档1,分片数很多,需要多次查询才可能查到文档1 维护文档到分片的映射关系,当文档数据:量大的时候,维护成本高 实时计算,通过文档1,自动算出,需要去那个分片.上获取文档 文档到

飘然渡沧海的博客 395

ElasticSearch 分片内部的原理

在集群内的原理, 我们介绍了分片, 并将它描述成最小的 ElasticSerch工作单元 。但是究竟什么是 一个分片,它是如何工作的? 在这个章节完后,下面你便会得到下面问题的答案。 (1)为什么搜索是近实时的? (2)为什么文档的 CRUD (创建-读取-更新-删除) 操作是实时的? (3)Elasticsearch 是怎样保证更新被持久化,在断电时也不丢失数据? 为什么搜索是近实时的? 关于近实时的定义:文档的变化并不是立即对搜索可见,但会在一秒之内变为可见。 1、作为用户,我们可以将请求发送到集群中的

1086

Elasticsearch 分布式文档存储

当索引一个文档的时候,文档会被存储到一个主分片中。Elasticsearch 如何知道一个文档应该存放到哪个分片中呢?当我们创建文档时,它如何决定这个文档应当被存储在分片 1 还是分片 2 中呢?首先这肯定不会是随机的,否则将来要获取文档的时候我们就不知道从何处寻找了。是一个可变值,默认是文档的_id,也可以设置成一个自定义的值。routing通过 hash 函数生成一个数字,然后这个数字再除以(主分片的数量)后得到 余数。这个分布在 0 到之间的余数,就是我们所寻求的文档所在分片的位置。

26857259 1302

如何制作DOS启动盘 U盘制作DOS启动盘 HP-U盘启动DOS7 详细步骤教程 Intel网卡使用软件 bootutil lanconfig eeupdate Intel网卡修改MAC地址教程

制作DOS启动盘不是一项复杂的任务,只要按照以下简单的步骤进行操作,您就可以自己动手制作一个DOS启动盘。

lcy524514826的博客 893

用Typora画流程图和序列图:Mermaid语法实战教程(含常见报错解决)

本文是一份详细的Typora与Mermaid语法实战教程,教你如何在Markdown文档中高效绘制流程图和序列图。文章涵盖从环境配置、核心语法到复杂图表构建的全过程,并重点解析了常见报错原因与解决方案,助你将可视化图表无缝融入文档工作流。

weixin_29279101的博客 298

Elasticsearch 进阶(索引、类型、字段、分片、副本、集群等详细说明)-06

Elasticsearch 进阶(索引、类型、字段、分片、副本、集群等详细说明)

qq_36255346的博客 1425

从零到一:手把手教你用C# WinForms搭建工控上位机(含Panel控件布局与事件处理详解)

本文详细介绍了如何使用C# WinForms框架从零开始搭建工控上位机系统,重点讲解了Panel控件的布局技巧和事件处理机制。通过实战案例,帮助开发者掌握界面分区规划、动态窗体切换及数据通信等核心功能,适用于工业自动化监控系统的开发。

weixin_30321709的博客 607

Elasticsearch底层存储结构 和 一些上限 from chatgpt

综上,Elasticsearch 利用分片和副本的策略将巨量的数据广泛分散式存储在集群里,同时通过 Lucene 倒排索引进行文本检索操作,使得查询操作延迟较低、缩短了查询所需的搜索时间,实现了搜索引擎高效稳定的运行。对于非常大的文档,建议拆分成适当大小的文档进行索引:如果因为某种原因,必须对非常大的文档进行索引,则可以将其拆分成适当大小的子文档进行索引。综上,保持单个文档的大小在几兆字节的范围之内,想方设法优化数据分配以及避免不必要的字段可以帮助优化 Elasticsearch 搜索的效率。

fei33423的专栏 1850

U盘安装单系统ubuntu10.04之全过程&拔掉U盘后系统无法启动

借助U盘把电脑装成ubuntu单系统之过程记录,以及遇到拔掉U盘后系统无法启动问题,电脑就显示: Non-System disk or disk error, replace and strike any key when ready

CXHPLY的专栏 8677

进芯AVP28335烧录避坑全记录:CCS、Uniflash、C2Prog、SDFlash四大工具配置详解

本文详细解析了进芯AVP28335芯片在烧录过程中遇到的常见问题及解决方案,涵盖CCS、Uniflash、C2Prog和SDFlash四大工具的配置要点。针对国产器件AVP28335的特殊需求,提供了从开发环境准备到烧录验证的全流程指南,帮助开发者高效完成程序烧录,避免常见陷阱。

weixin_30836759的博客 586

干货 | Elasticsearch 索引设计实战指南

题记随着 Elastic 的上市,ELK Stack 不仅在 BAT 的大公司得到长足的发展,而且在各个中小公司都得到非常广泛的应用,甚至连“婚庆网站”都开始使用 Elasticsear...

铭毅天下Elasticsearch 1万+

Abel逆变换及其求解方法

Abel逆变换常应用在轴对称的、光学薄的火焰、羽流或等离子体重建。

weixin_49783507的博客 8364

怎样合理创建es索引_看完这篇文章,再也不怕 Elasticsearch 索引设计

题记随着 Elastic 的上市,ELK Stack 不仅在 BAT 的大公司得到长足的发展,而且在各个中小公司都得到非常广泛的应用,甚至连“婚庆网站”都开始使用 Elasticsearch 了。随之而来的是 Elasticsearch 相关部署、框架、性能优化的文章早已铺天盖地。初学者甚至会进入幻觉——“一键部署、导入数据、检索&聚合、动态扩展, So Easy,妈妈再也不用担...

weixin_39625872的博客 929

大厂硬件机试选择题与判断题解析-卷1

本文精选30道硬件工程师机试题目,涵盖模拟电路、数字电路、PCB设计三大方向。模拟电路部分重点考察运算放大器、滤波器、整流电路等核心知识;数字电路部分聚焦计数器、电平转换等关键技术;PCB设计部分强调高速信号处理、阻抗控制等实践要点。题目均来自华为、小米等大厂真题,剔除基础题,每道题附详细解析,包括正确答案推导过程及相关公式说明。特别针对易错概念(如负反馈类型判断、Q值与带宽关系等)进行重点解析,帮助考生系统掌握硬件设计的核心考点和解题思路。

启芯硬件的博客 677

【人工智能】AI 智能体驾驭工程(Harness Engineering)全解析

OpenAI将Harness定义为让Agent能完成有用工作的系统工程,Harness Engineering则是持续设计、实现、迭代这套系统的方法论;Anthropic将其概括为「让模型真正成为可靠Agent的基础设施」;Martin Fowler/Thoughtworks则将其定义为「控制Agent各层循环的规格、质量检查与工作流指导体系」。强大的AI模型是一匹爆发力极强的烈马;Prompt Engineering是「对马喊话的技巧」,Context Engineering是「给马看的地图」;

奶爸的编程之路,也就一周冷个三天 5240

看完这篇文章,再也不怕 Elasticsearch 索引设计

题记随着 Elastic 的上市,ELK Stack 不仅在 BAT 的大公司得到长足的发展,而且在各个中小公司都得到非常广泛的应用,甚至连“婚庆网站”都开始使用 Elasticsear...

过往记忆大数据 1370

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Elasticsearch 索引设计实战指南

题记 随着 Elastic 的上市,ELK Stack 不仅在 BAT 的大公司得到长足的发展,而且在各个中小公司都得到非常广泛的应用,甚至连“婚庆网站”都开始使用 Elasticsearch 了。随之而来的是 Elasticsearch 相关部署、框架、性能优化的文章早已铺天盖地。 初学者甚至会进入幻觉——“一键部署、导入数据、检索&聚合、动态扩展, So Easy,妈妈再也不用担心...

spring_root的博客 923

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

elasticsearch 数据类型_看完这篇文章,再也不怕 Elasticsearch 索引设计

题记随着 Elastic 的上市,ELK Stack 不仅在 BAT 的大公司得到长足的发展,而且在各个中小公司都得到非常广泛的应用,甚至连“婚庆网站”都开始使用 Elasticsearch 了。随之而来的是 Elasticsearch 相关部署、框架、性能优化的文章早已铺天盖地。初学者甚至会进入幻觉——“一键部署、导入数据、检索&聚合、动态扩展, So Easy,妈妈再也不用担...

weixin_39621488的博客 269

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

elasticsearch 数据类型_干货 | Elasticsearch 索引设计实战指南

题记随着 Elastic 的上市,ELK Stack 不仅在 BAT 的大公司得到长足的发展,而且在各个中小公司都得到非常广泛的应用,甚至连“婚庆网站”都开始使用 Elasticsearch 了。随之而来的是 Elasticsearch 相关部署、框架、性能优化的文章早已铺天盖地。初学者甚至会进入幻觉——“一键部署、导入数据、检索&聚合、动态扩展, So Easy,妈妈再也不用担...

weixin_39855186的博客 193

Elasticsearch 索引设计

随着 Elastic 的上市,ELK Stack 不仅在 BAT 的大公司得到长足的发展,而且在各个中小公司都得到非常广泛的应用,甚至连“婚庆网站”都开始使用 Elasticsearch 了。随之而来的是 Elasticsearch 相关部署、框架、性能优化的文章早已铺天盖地。 初学者甚至会进入幻觉——“一键部署、导入数据、检索&聚合、动态扩展, So Easy,妈妈再也不用担心我的 Elastic 学习”! 但,实际上呢?仅就 Elasticsearch 索引设计,请回答如下几个问题: 每天几百

陈家老二的博客 1163

elasticsearch 索引_干货 | Elasticsearch 索引设计实战指南

题记随着 Elastic 的上市,ELK Stack 不仅在 BAT 的大公司得到长足的发展,而且在各个中小公司都得到非常广泛的应用,甚至连“婚庆网站”都开始使用 Elasticsearch 了。随之而来的是 Elasticsearch 相关部署、框架、性能优化的文章早已铺天盖地。初学者甚至会进入幻觉——“一键部署、导入数据、检索&聚合、动态扩展, So Easy,妈妈再也不用担心我的 E...

weixin_39790102的博客 205

Elasticsearch入门 -2

Elasticsearch入门 -2

qq_53030201的博客 575

ELK简介

elk

u010230019的博客 6241

elasticsearch字段过大导致的内存问题

公司在搭一套代码搜索系统,存储选型为elasticsearch,三个节点每个节点8g内存,最近遇到一个很诡异的现象是es集群经常内存耗尽,表现形式是堆内存消耗90%以上并且持续进行full gc。 因为我们集群查询qps很低所以基本排除了查询缓存的影响,所以问题肯定出在写入的时候,经过多天的排查终于发现罪魁祸首在于es文档中的某一个字段过大。 由于我们要对代码源文件内容进行搜索所以es文档中有

wuyu6394232的专栏 6021
上一篇: 卷积神经网络
下一篇: 推荐系统杂谈
xb_smart
博客等级 码龄16年 124粉丝 74原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值