1. 什么是 Elasticsearch?
Elasticsearch 是一个开源分布式搜索和分析引擎,专为处理大量数据而设计。它建立在 Apache Lucene 之上,并由Elastic 支持。Elasticsearch 用于近乎实时地存储、搜索和分析结构化和非结构化数据。
Elasticsearch 的一个主要特性是其可扩展性,这使得它能够处理集群中多个节点的大型数据集。这使得它成为企业搜索、日志分析和监控应用程序的热门选择。
Elasticsearch 提供了用于与搜索引擎交互的 RESTful API,并支持多种查询类型,包括全文搜索、短语搜索和聚合。它还包括各种搜索和分析功能,例如分面、过滤、排序和突出显示。
除了搜索和分析之外,Elasticsearch 还支持各种用例,例如应用程序搜索、安全分析和业务分析。它拥有庞大而活跃的用户和开发者社区,并提供许多插件和集成来扩展其功能。
2. 本文核心章节
- 4 种常见的 Elasticsearch 用例
- Elasticsearch 架构
- 云端的 Elasticsearch
- Kubernetes 上的 Elasticsearch
- Elasticsearch 性能问题
- 优化 Elasticsearch 性能的 6 个最佳实践
3. 4 种常见的 Elasticsearch 用例
Elasticsearch 经常与 ELK 技术栈中的 Logstash 和 Kibana 一起使用。以下是 Elasticsearch 的一些常见用例:
- 可观察性:用于监控和了解复杂系统。Elasticsearch
因其实时搜索和分析功能而成为可观察性的热门选择。它允许从日志、指标和跟踪等不同来源收集和分析数据,并提供可视化和警报以帮助快速识别和解决问题。Elasticsearch
可以与 Kibana、Beats 和 Logstash 等其他工具集成,以提供完整的可观察性解决方案。 - 全文搜索:支持多种搜索查询,包括模糊搜索、短语搜索和自动完成。Elasticsearch
可用于不同类型的应用程序,例如电子商务网站、文档管理系统和社交网络,以提供快速准确的搜索结果。 - 实时日志分析:使组织能够监控其系统中的错误、安全问题和其他异常情况。通过实时收集和分析来自不同来源的日志,Elasticsearch
可以提供有关系统性能的宝贵见解,并有助于快速识别和解决问题。Elasticsearch 可以与 Logstash 和 Beats
等工具集成,以简化日志收集和分析过程。 - 安全分析:用于实时检测和调查安全威胁。它可以分析不同类型的数据(例如网络流量、用户行为和系统日志)以识别异常和威胁。Elasticsearch
可以与其他安全工具(例如 Suricata、Zeek 和 Snort)集成,以提供全面的安全解决方案。
4. Elasticsearch 架构
以下是 Elasticsearch 的核心组件:
4.1 集群
Elasticsearch 集群是一组由一个或多个 Elasticsearch 节点组成的集群,它们共同存储、索引和搜索数据。集群通过将数据分布在多个节点上来提供水平可扩展性、容错能力和高可用性。集群通常用于存储和分析大量数据,例如日志文件或应用程序指标。
4.2 节点
在 Elasticsearch 中,节点是存储数据并参与集群搜索和索引功能的单个服务器。Elasticsearch 集群中的每个节点都分配有一个唯一标识符,它们相互通信以协调集群的操作。
Elasticsearch 集群中有三种类型的节点:
- 主节点:负责协调集群中的管理任务,例如创建或删除索引、管理集群的状态以及将分片分配给数据节点。每个集群必须至少有一个主节点,并且可以添加其他符合主节点条件的节点以实现冗余。
- 数据节点:负责存储和索引集群中的数据。每个数据节点存储集群的一部分数据,集群的整体存储容量随集群中数据节点的数量而变化。
- 客户端节点:用于将搜索和索引请求路由到集群中适当的数据节点。客户端节点不存储数据,但提供与集群交互的轻量级接口,从而提高搜索和索引操作的性能。
4.3 端口
- 端口 9200 和 9300 分别是 Elasticsearch 用于客户端与服务器通信和节点到节点通信的网络端口。
- 端口 9200 是用于向 Elasticsearch 发送 RESTful API 请求的默认 HTTP 端口。客户端(例如 Kibana 或 Logstash)使用端口 9200 向 Elasticsearch 发送请求以索引和搜索数据。端口 9200 也是Elasticsearch 内置的基于 HTTP 的监控 API 的默认端口。
- 端口 9300 是 Elasticsearch 用于节点间通信的默认端口。节点使用端口 9300 相互通信以共享数据、复制分片和协调集群操作。端口 9300 用于使用 Elasticsearch 的专有协议(而非HTTP)进行高效通信。
4.4 碎片
在 Elasticsearch 中,分片是代表较大索引子集的数据单位。每个分片都是一个独立的索引,可以存储在单个节点上,也可以分布在集群中的多个节点上,以实现水平可扩展性。分片允许 Elasticsearch 将大型数据集拆分成较小的部分,并将它们分布在多个节点上,从而实现对大量数据的快速搜索和分析。
4.5 副本
在 Elasticsearch 中,副本是主分片的副本,存储在集群中的单独节点上。副本提供冗余和高可用性,允许 Elasticsearch 在发生节点故障或网络问题时继续处理请求。副本用于在集群中分配搜索和索引负载并缩短查询响应时间。
分片是代表较大索引子集的数据单位,而副本是存储在单独节点上以实现冗余的分片副本。每个分片可以有一个或多个副本,分片和副本的总数决定了集群中可以存储的数据量和容错级别。
4.6 分析器analyzer
在Elasticsearch中,标准和简单分析器是两个内置分析器,可用于在索引和搜索过程中进行文本分析。
标准分析器是 Elasticsearch 中使用的默认分析器。它通过将文本拆分为标记、删除停用词以及执行词干提取来提供复杂的文本分析。
简单分析器是一种基本分析器,它根据空格和标点符号将文本划分为术语,而无需进行任何额外处理。简单分析器适用于索引和搜索不需要复杂文本分析的数据,例如日志文件或系统指标。
4.7 文档document
在 Elasticsearch 中,文档是存储和索引的基本信息单位。文档可以是任何类型的数据,例如文本、数字或结构化数据,并以 JSON 格式表示。Elasticsearch 根据搜索查询检索文档,这些查询可以匹配文档中的特定字段或值。
4.8 JSON REST API
JSON REST API 是 Elasticsearch 的核心组件,允许客户端使用 JSON 格式的 HTTP 请求与 Elasticsearch 交互。REST API 提供了一个简单而灵活的接口,用于执行各种操作,包括索引和搜索数据、管理索引和集群以及配置设置和映射。JSON 格式允许轻松解析和序列化数据,从而可以轻松地将 Elasticsearch 与各种编程语言和工具集成。
5. 云端的 Elasticsearch
Elasticsearch 可以在多种云平台上运行,包括 Amazon Web Services (AWS)、Microsoft Azure 和 Google Cloud Platform (GCP)。在云上运行 Elasticsearch 可以带来许多好处,包括:
- 可扩展性:使用基于云的 Elasticsearch,您可以轻松地扩大或缩小集群以满足不断变化的数据需求,而不必担心硬件限制。
- 高可用性:云提供商提供强大的基础设施和可用性保证,因此您可以确保您的 Elasticsearch 集群始终正常运行。
- 易于管理:许多云提供商提供托管的 Elasticsearch 服务,可处理软件更新、备份和安全等任务,让您的团队可以专注于其他任务。
- 节省成本:基于云的 Elasticsearch
比运行您自己的基础设施更具成本效益,因为您只需为您使用的部分付费,并且可以轻松地扩大或缩小规模以控制成本。
在云上运行 Elasticsearch 时,需要考虑数据安全、网络延迟以及备份和恢复选项等因素。选择合适的云提供商并规划数据需求的长期增长也很重要。
6. Kubernetes 上的 Elasticsearch
Kubernetes 最初旨在管理无状态工作负载,但它也可用于运行有状态工作负载,例如数据库、消息队列和搜索引擎。Elasticsearch 集群是有状态的,这意味着它们需要持久存储和稳定的网络身份,这在传统容器环境中很难管理。Kubernetes 提供了多种功能,例如 PersistentVolumes 和 StatefulSets,可让您轻松部署、扩展和管理有状态工作负载。
PersistentVolumes 用于为 Kubernetes 工作负载提供持久存储。它们独立于 Pod,可以动态附加和分离,从而允许在 Pod 重启后保留数据。
StatefulSet 用于管理需要稳定网络身份和有序部署的有状态工作负载。Stateful Set 提供有序部署、稳定网络身份和动态扩展等功能,让您能够轻松地在 Kubernetes 中部署和管理有状态工作负载。
**在 Kubernetes 上部署 Elasticsearch 集群可以简化集群的配置、扩展和管理过程。**Elasticsearch 可以使用 Kubernetes StatefulSets 进行水平扩展,从而轻松扩展搜索和分析基础架构。Kubernetes 提供了一个用于管理基础架构和应用程序的单一平台。
7. Elasticsearch 性能问题
Elasticsearch 是一款功能强大且用途广泛的搜索和分析引擎,但与任何复杂系统一样,它也会遇到性能问题。以下是一些常见的 Elasticsearch 性能问题及其解决方法:
- 内存使用情况:Elasticsearch 需要大量内存才能高效运行。如果 Elasticsearch 内存不足,它可能会变慢甚至崩溃。
- 磁盘使用情况:Elasticsearch 将数据存储在磁盘上,如果磁盘已满或者速度很慢Elasticsearch 性能可能会受到影响。
- 查询性能:Elasticsearch 提供了强大的查询语言,但有些查询可能很昂贵并影响性能。
- 索引性能:Elasticsearch 在添加数据时会对其进行索引,如果索引速度慢,则会影响 Elasticsearch 的整体性能。
- 硬件限制:Elasticsearch 性能严重依赖于硬件,如果硬件不足,Elasticsearch 性能可能会受到影响。
- 网络问题:Elasticsearch 性能也可能受到网络问题的影响,例如延迟或数据包丢失。
8. 优化 Elasticsearch 性能的 6 个最佳实践
8.1 冻结索引Freezing Indices
Elasticsearch 将数据存储在分片中,查询这些分片会耗费大量资源。提高查询性能的一种方法是“冻结”旧的或不经常访问的索引。冻结索引会将其移动到单独的节点,从而减少执行查询时需要搜索的分片数量。冻结的索引仍可查询,但不允许更新和新写入。
8.2 与配置容量 Provisioning Capacity
正确配置容量对于 Elasticsearch 性能至关重要。这包括确保有足够的资源(例如 CPU、内存和存储)来处理预期的查询和索引工作负载。配置容量应基于预期的查询和索引吞吐量,并应根据需要进行监控和调整。
8.3 组织索引数据
Elasticsearch 中数据的组织方式会对性能产生重大影响。为了优化性能,以反映查询模式的方式组织索引数据非常重要。例如,如果查询经常根据日期范围搜索文档,则按日期组织数据可能会很有帮助。这可以通过创建多个索引并使用索引别名来提供单个查询端点来实现。
8.4 减少字段索引结构更新
ES映射索引结构更新(定义索引的架构)可能会占用大量资源并影响查询性能。为了最大限度地减少映射更新的影响,重要的是避免频繁更改映射。相反,应创建反映预期数据架构的映射,并仅在必要时进行更改。
8.5 优化线程池
线程池用于在 Elasticsearch 中执行查询和索引请求。为了优化性能,确保线程池配置正确并调整大小非常重要。线程池的大小应根据预期的查询和索引吞吐量进行调整,并应根据需要进行监控和调整。此外,确保对每项任务(例如搜索或索引)使用适当类型的线程池也很重要。
9. 小结
以上就说关于Elasticsearch场景用例,基础架构以及相关的性能问题分析和调优实战分享,希望能带给大家一定的帮助~