文章目录
- 一、什么是ELK?有什么用?
- 二、ElasticSearch的安装与基本配置
-
- 为何需要依赖JDK?
-
- [使用`yum install java-11-openjdk`和使用Oracle官网提供的jdk的rpm包安装JDK的区别](#使用
yum install java-11-openjdk
和使用Oracle官网提供的jdk的rpm包安装JDK的区别)
- [使用`yum install java-11-openjdk`和使用Oracle官网提供的jdk的rpm包安装JDK的区别](#使用
- 参考资料1(不完全准确,但可从其了解大致步骤)
-
- [1. 下载和解压安装包](#1. 下载和解压安装包)
- [2. 解决JDK依赖问题](#2. 解决JDK依赖问题)
- 对于基于Debian和Ubuntu的系统:
- 对于基于Fedora的系统:
- 对于基于CentOS的系统:
- 通用步骤:
- [3. 创建专用用户启动ES](#3. 创建专用用户启动ES)
- [4. 修改ES核心配置信息](#4. 修改ES核心配置信息)
- [5. 配置内存和文件描述符](#5. 配置内存和文件描述符)
- [6. 启动Elasticsearch](#6. 启动Elasticsearch)
- [7. 验证安装](#7. 验证安装)
- [8. 设置登录密码(可选)](#8. 设置登录密码(可选))
- 参考资料2
- 三、Elasticserach的相关概念
-
-
- [1. 文档(Documents)](#1. 文档(Documents))
- [2. 字段和数据类型](#2. 字段和数据类型)
- [3. 分片(Shards)](#3. 分片(Shards))
- [4. 主分片与副本分片](#4. 主分片与副本分片)
- [5. 索引设置](#5. 索引设置)
- [6. 索引生命周期管理(ILM)](#6. 索引生命周期管理(ILM))
- [7. 索引状态](#7. 索引状态)
- [8. 索引别名(Aliases)](#8. 索引别名(Aliases))
- [9. 索引模板](#9. 索引模板)
- [10. 索引健康状态](#10. 索引健康状态)
- [11. 索引优化](#11. 索引优化)
- 逆向索引的基本概念
-
- 四、Elasticsearch的RestAPI操作
- 五、Elasticsearch集群的一些配置
-
- Elasticsearch集群状态的可视化插件head
- ElasticSearch集群中的节点间的互相访问配置(添加跨域访问)
- ElasticSearch集群的分片机制
-
- [1. 分片(Shards)](#1. 分片(Shards))
- [2. 段(Segments)](#2. 段(Segments))
- [3. 提交点(Commit Point)](#3. 提交点(Commit Point))
- [4. 分片和副本分片的分配](#4. 分片和副本分片的分配)
- [5. 副本分片的作用](#5. 副本分片的作用)
- 集群的健康值
- ElasticSearch的索引、分片操作
-
- [索引配置(Index Settings)](#索引配置(Index Settings))
- [分片配置(Shard Settings)](#分片配置(Shard Settings))
- 创建分片
- [通过REST API配置索引和分片](#通过REST API配置索引和分片)
- 通过`elasticsearch.yml`配置文件配置
- 动态调整分片和副本
一、什么是ELK?有什么用?
ELK是什么?
ELK是Elasticsearch、Logstash、Kibana三个开源框架首字母的缩写,它们共同构成了一个强大的日志分析和搜索平台。
- Elasticsearch(ES):一个基于Lucene的开源分布式搜索引擎,提供搜集、分析、存储数据功能。
- Logstash:一个日志搜集、分析、过滤的工具,支持大量数据获取方式,其自带输入(input)、过滤(filter)、输出(output)三部分。
- Kibana:提供日志分析友好的Web界面,数据存储到Elasticsearch中后,可以在Kibana页面上进行增删改查,交互数据,并生成各种维度的表格、图形。
Elasticsearch
Elasticsearch 是一个基于 Apache Lucene 构建的开源搜索引擎。它提供了一个分布式、多租户能力的全文搜索引擎,具有HTTP web接口和无模式JSON文档的特点。Elasticsearch的特点包括:
- 分布式:设计用于在多个服务器上运行,无需复杂的配置。
- 实时搜索:能够快速响应搜索请求,提供近实时的搜索能力。
- 高度可扩展:可以从单一服务器扩展到数百台服务器,处理PB级别的数据。
- 多租户:支持多个用户在同一个集群上运行,而不会相互干扰。
- 高可用:提供自动故障转移和数据复制功能,确保服务的高可用性。
- 分析和聚合:支持复杂的数据分析和聚合操作。
- RESTful API:通过RESTful接口进行操作,易于使用和集成。
Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,同时是可扩展的数据存储和矢量数据库,能够应对日益增多的各种用例。作为 Elastic Stack 的核心,Elasticsearch 能够集中存储您的数据,实现闪电般的搜索速度、精细的相关性调整以及强大的分析能力,并且能够轻松地进行规模扩展。
- 矢量:在计算机科学中,矢量通常指的是包含多个维度的数据点。在机器学习和数据分析领域,矢量可以代表高维空间中的点,这些点可以用于表示文本、图像或其他类型的数据。
- 矢量数据库:是一种专门设计来存储、检索和管理矢量数据的数据库。这类数据库优化了矢量数据的存储和查询,使得可以快速执行基于相似性或距离的搜索,这对于推荐系统、图像识别、自然语言处理等应用场景非常重要。
Logstash
Logstash 是一个开源的服务器端数据处理管道,可以同时从多个来源采集数据,转换数据,然后将数据发送到您指定的目的地。Logstash的特点包括:
- 数据收集:可以收集来自不同来源的数据,如日志文件、系统指标、网络请求等。
- 数据转换:使用过滤器对数据进行处理和转换,如解析、格式化、数据丰富等。
- 数据输出:将处理后的数据发送到不同的目的地,如Elasticsearch、文件系统、数据库等。
- 插件支持:拥有丰富的插件生态系统,可以轻松扩展功能。
- 可扩展性:可以处理从几KB到几GB的数据流。
- 容错性:设计为高容错性,即使在处理大量数据时也能保持稳定。
Kibana
Kibana 是一个开源的分析和可视化平台,设计用于与Elasticsearch一起工作。它提供了一个Web界面,用于搜索、查看、和分析存储在Elasticsearch中的数据。Kibana的特点包括:
- 数据可视化:提供多种图表和图形,如柱状图、折线图、饼图、地图等,用于数据可视化。
- 数据搜索:提供强大的搜索功能,可以快速检索Elasticsearch中的数据。
- 仪表板:允许用户创建和共享仪表板,集中展示关键数据。
- 实时监控:支持实时数据监控和报警。
- 集成:与Elasticsearch和Logstash紧密集成,提供无缝的数据流处理和展示。
- DevTools:提供DevTools控制台,允许用户编写和执行自定义的Elasticsearch查询。
- 安全性:支持用户认证和权限控制,确保数据安全。
这三个工具共同构成了ELK Stack,它们协同工作,提供了从数据收集、处理、存储到分析和可视化的完整解决方案。
ELK的作用
- 集中化日志管理:ELK能够集中收集和管理所有服务器上的日志,提高定位问题的效率。
- 多维度查询:在大规模场景中,ELK可以对日志进行多维度查询,解决直接在日志文件中使用grep、awk等命令效率低下的问题。
- 数据搜索和分析:ELK不仅仅适用于日志分析,它还支持其他任何数据搜索、分析和收集的场景。
- 实时监控和报警:ELK可以提供错误报告和监控机制,帮助及时发现和响应系统问题。
- 数据可视化:通过Kibana,ELK可以将日志数据以图表、表格等形式直观展示,便于分析和理解。
- 提高运维效率:ELK使得运维工程师无需编写代码,仅需配置即可收集服务器指标、日志文件、数据库数据,并在前端华丽展现。
- 支持大数据量:ELK能够处理海量数据,并且提供近实时的处理能力,适合大数据环境下的日志分析。
综上所述,ELK是一个功能强大的日志分析平台,它通过集中化日志管理、多维度查询、数据可视化等功能,帮助用户有效地收集、存储、分析和展示日志数据,从而提高问题定位的效率和准确性。
二、ElasticSearch的安装与基本配置
为何需要依赖JDK?
Elasticsearch 依赖 JDK(Java Development Kit)的原因主要与其底层实现和运行环境有关。以下是几个关键点解释为什么 Elasticsearch 需要 JDK:
-
基于Java开发:Elasticsearch 是用 Java 语言编写的,因此需要 Java 运行时环境(JRE)来执行其代码。JDK 提供了编译和运行 Java 应用程序所需的工具和库。
-
JVM特性:Elasticsearch 运行在 Java 虚拟机(JVM)上,JVM 提供了内存管理、垃圾回收和多线程等特性,这些都是 Elasticsearch 高性能运行的基础。
-
性能优化:JDK 提供了对 JVM 进行性能调优的工具和接口,Elasticsearch 可以利用这些工具和接口来优化其内存使用和执行效率。
-
兼容性和稳定性:Elasticsearch 针对特定的 JDK 版本进行了测试和优化,以确保其兼容性和稳定性。使用 JDK 可以确保 Elasticsearch 能够以最佳状态运行。
-
开发工具:JDK 中包含了 Java 编译器(javac)和其他开发工具,这些工具对于开发和调试 Elasticsearch 插件和自定义代码非常有用。
-
安全性:JDK 提供了安全管理器(Security Manager)等安全特性,Elasticsearch 可以利用这些特性来增强其安全性。
-
国际化和本地化:JDK 提供了对国际化和本地化的支持,Elasticsearch 可以利用这些特性来支持多语言环境。
-
网络编程:Elasticsearch 需要进行网络通信,JDK 提供了丰富的网络编程接口,使得 Elasticsearch 能够轻松实现网络通信功能。
-
并发编程:Elasticsearch 需要处理大量的并发请求,JDK 提供了强大的并发编程支持,包括线程池、同步器等,这些都是 Elasticsearch 高并发处理能力的基础。
因此,为了运行 Elasticsearch,你需要安装与其版本兼容的 JDK。需要注意的是,Elasticsearch 并不需要 JDK 中的开发工具,所以即使只安装 JRE(Java Runtime Environment)也可以运行 Elasticsearch,但在某些情况下,如需要编译插件或自定义代码时,JDK 就是必需的。
使用yum install java-11-openjdk
和使用Oracle官网提供的jdk的rpm包安装JDK的区别
使用 yum install java-11-openjdk
和使用官网提供的 JDK 源码包解压安装 JDK 的主要区别如下:
-
安装方式:
yum install java-11-openjdk
是通过 Linux 发行版提供的包管理器安装,这种方式安装的 JDK 是由发行版维护和打包的,通常会包含一些针对该发行版的优化和配置。- 使用官网提供的 JDK 源码包解压安装则是直接从 Oracle 或 OpenJDK 官方网站下载源码包,然后在本地进行解压和配置,这种方式更加灵活,可以自定义安装路径和环境变量。
-
依赖管理:
- 使用
yum
安装 JDK 时,包管理器会自动处理依赖关系,确保所有必需的依赖都得到满足。 - 手动解压安装 JDK 源码包时,需要自己确保系统已安装所有必要的依赖库,否则可能需要手动安装这些依赖。
- 使用
-
版本更新:
yum
安装的 JDK 可以通过包管理器方便地更新到新版本,且通常会包含安全更新和补丁。- 手动解压安装的 JDK 源码包可能需要手动下载新版本并重新安装,以获取更新和修复。
-
配置和环境变量:
yum
安装的 JDK 通常会自动配置环境变量,用户可以直接使用java
命令。- 手动解压安装的 JDK 需要用户手动设置环境变量,如
JAVA_HOME
和PATH
,以便在命令行中使用java
命令。
-
许可证和支持:
yum
安装的 OpenJDK 是完全开源的,遵循 GPL v2 许可,适合开源项目和预算有限的环境。- 从 Oracle 官网下载的 JDK 可能包含一些专有功能,且在某些版本之后需要商业许可,适合需要商业支持和长期稳定性的企业环境。
-
功能性:
- 在 Java 11 之后,通过
yum
安装的 OpenJDK 和从 Oracle 下载的 JDK 在功能上基本一致,因为大部分 Oracle JDK 私有组件都已开源。
- 在 Java 11 之后,通过
总结来说,选择哪种安装方式取决于你的具体需求,如果你需要一个快速、易于管理且开源的 JDK 环境,yum
安装是一个好选择。如果你需要更多的控制和自定义,或者需要 Oracle 的商业支持,那么手动解压安装 JDK 源码包可能更适合你。
参考资料1(不完全准确,但可从其了解大致步骤)
在Linux中配置Elasticsearch涉及几个关键步骤,以下是具体的配置过程:
1. 下载和解压安装包
首先,你需要从Elasticsearch官网或镜像站点下载Elasticsearch的Linux版本tar.gz安装包。
Elasticsearch官网安装教程
下载完成后,使用以下命令解压安装包:
bash
tar -zxvf elasticsearch-<version>-linux-x86_64.tar.gz -C /usr/local
2. 解决JDK依赖问题
由于Elasticsearch与JDK有强依赖关系,你需要确保系统中安装了与Elasticsearch版本兼容的JDK。从Elasticsearch 7.0开始,官方推荐使用Java 11。如果系统中已安装了JDK,Elasticsearch会优先使用系统中的JDK。如果JDK版本不匹配,可能需要调整JAVA_HOME
环境变量或使用Elasticsearch自带的JDK。
在Linux系统中安装JDK 11的具体步骤可能会根据你使用的Linux发行版有所不同。以下是一些常见的Linux发行版安装JDK 11的步骤:
对于基于Debian和Ubuntu的系统:
-
导入Java的GPG密钥:
bashwget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | sudo apt-key add -
-
添加Java仓库:
bashsudo add-apt-repository "deb https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/$(lsb_release -cs) main"
-
更新包列表:
bashsudo apt-get update
-
安装JDK 11:
bashsudo apt-get install adoptopenjdk-11-hotspot
对于基于Fedora的系统:
-
安装JDK 11 :
bashsudo dnf install java-11-openjdk
对于基于CentOS的系统:
-
安装JDK 11 :
bashsudo yum install java-11-openjdk
通用步骤:
-
验证安装 :
安装完成后,你可以通过运行以下命令来验证JDK是否正确安装:
bashjava -version
-
设置JAVA_HOME环境变量 :
为了确保Elasticsearch可以使用正确的JDK版本,你可能需要设置
JAVA_HOME
环境变量。你可以在你的~/.bashrc
或~/.bash_profile
文件中添加以下行:bashexport JAVA_HOME=/usr/lib/jvm/java-11-openjdk-<version> # 请替换<version>为实际版本号 export PATH=$JAVA_HOME/bin:$PATH
然后,运行
source ~/.bashrc
或source ~/.bash_profile
来使更改生效。 -
更新Elasticsearch配置 :
如果Elasticsearch需要使用特定的JDK版本,你可能需要在Elasticsearch的配置文件中设置
JAVA_HOME
。例如,在jvm.options
文件中添加:-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+AlwaysPreTouch
请注意,具体的安装命令和路径可能会根据你的系统和JDK提供者有所不同。以上步骤提供了一个基本的指导,你可能需要根据实际情况进行调整。
3. 创建专用用户启动ES
出于安全考虑,Elasticsearch官方建议不要以root用户运行Elasticsearch。因此,你需要创建一个专用用户来运行Elasticsearch:
bash
adduser esuser
passwd esuser
chown -R esuser:esuser /usr/local/elasticsearch-<version>
4. 修改ES核心配置信息
Elasticsearch的配置文件位于config
目录下的elasticsearch.yml
。你可以根据需要修改集群名称、节点名称、网络设置等。例如,设置集群名称和节点名称:
yaml
cluster.name: my-es-cluster
node.name: node-1
5. 配置内存和文件描述符
根据系统内存大小,你可能需要调整JVM的启动参数,这在config/jvm.options
文件中设置。同时,可能需要调整系统文件描述符的限制和虚拟内存区域的数量:
bash
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sysctl -p
ulimit -n 65536
6. 启动Elasticsearch
以非root用户启动Elasticsearch:
bash
su esuser
/usr/local/elasticsearch-<version>/bin/elasticsearch
7. 验证安装
通过浏览器或curl命令验证Elasticsearch是否成功启动:
bash
curl http://localhost:9200
如果返回了Elasticsearch的JSON响应,则表示安装成功。
8. 设置登录密码(可选)
对于需要安全性的场景,可以为Elasticsearch设置登录密码。这通常涉及到X-Pack插件的配置,但现在Elasticsearch已经将其作为基本功能提供。
以上步骤涵盖了在Linux中配置Elasticsearch的基本流程。根据你的具体需求,可能还需要进行额外的配置和优化。
参考资料2
elasticsearch.yml中的"锁定内存"、"JVM堆大小"配置
在Elasticsearch的elasticsearch.yml
配置文件中,内存相关的设置对于优化Elasticsearch的性能和稳定性至关重要。以下是你提到的配置项的说明以及何时需要配置它们:
bootstrap.memory_lock
- 说明 :这个设置用于在Elasticsearch启动时锁定内存。当设置为
true
时,Elasticsearch会尝试锁定JVM使用的内存,以防止被交换到磁盘上(swap)。锁定内存可以提高性能,因为操作系统不会在物理内存和交换空间之间移动内存页。 - 何时配置 :在生产环境中,通常建议设置为
true
,特别是在物理内存足够大,且Elasticsearch进程有足够的权限锁定内存的情况下。这可以确保Elasticsearch在高负载下不会因为内存交换而导致性能下降。在某些系统上,可能需要以超级用户权限运行Elasticsearch或者配置特定的内核参数来允许非特权用户锁定内存。
堆大小设置
- 说明:Elasticsearch的JVM堆大小应该设置为系统可用内存的大约一半,并且进程的所有者需要有权限使用这个内存限制。这是因为Elasticsearch在内存中执行许多操作,包括缓存和索引数据,如果系统开始交换内存,Elasticsearch的性能会显著下降。
- 何时配置 :在安装和配置Elasticsearch时,应该根据你的系统内存大小调整堆大小设置。这通常在
jvm.options
文件中配置,而不是直接在elasticsearch.yml
中设置。例如,如果你的系统有32GB内存,你可能将最小堆大小(Xms)和最大堆大小(Xmx)设置为16GB。
配置示例
在jvm.options
文件中,你可以这样设置堆大小:
bash
-Xms16g
-Xmx16g
这表示JVM的最小堆大小和最大堆大小都被设置为16GB。
注意事项
- 在设置堆大小时,确保不要超过系统的物理内存,否则可能会导致系统不稳定。
- 锁定内存可以提高性能,但在某些情况下,如果系统内存不足,可能会导致系统其他部分的内存不足。
- 在某些操作系统上,锁定内存需要特定的权限或配置,例如在Linux上可能需要设置
vm.swappiness
为1或更低,以减少交换的发生。
正确配置内存相关的设置对于确保Elasticsearch的高性能和稳定性至关重要。
elasticsearch.yml中的discovery配置(ElasticSearch集群配置)
在Elasticsearch中,elasticsearch.yml
文件中的 discovery
配置部分对于集群的发现和形成至关重要。以下是你提到的配置项的说明以及何时需要配置它们:
discovery.seed_hosts
- 说明 :这个设置用于提供一个初始的主机列表,当新节点启动时,Elasticsearch会使用这个列表来发现并加入集群。默认情况下,Elasticsearch会尝试在本地回环地址(
127.0.0.1
和::1
)上发现其他节点。 - 何时配置:在多节点集群环境中,如果你的节点不在同一个广播域或者你想要指定特定的节点用于初始发现,你需要配置这个设置。例如,在云环境或容器化部署中,你可能需要指定其他节点的IP地址或主机名。
cluster.initial_master_nodes
- 说明:这个设置用于指定一组初始的主节点,这些节点有资格被选举为集群的主节点(master)。在新集群形成时,这些节点将被用来启动集群并进行初始的主节点选举。
- 何时配置 :在创建新集群时必须配置这个设置。你需要指定至少三个主节点候选节点的名称(这些名称必须与
elasticsearch.yml
文件中的node.name
设置相匹配)。这样做可以确保集群能够在启动时选举出一个主节点,并且提高集群的高可用性。
配置示例
假设你有三个节点,它们的名称分别是 node-1
、node-2
和 node-3
,并且它们分别运行在不同的服务器上,它们的IP地址分别是 192.168.1.1
、192.168.1.2
和 192.168.1.3
。你的配置可能如下所示:
yaml
discovery.seed_hosts: ["192.168.1.1", "192.168.1.2", "192.168.1.3"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
在这个配置中,当任何节点启动时,它都会尝试连接到列表中的其他节点来发现集群。同时,node-1
、node-2
和 node-3
被指定为初始的主节点候选,它们将参与主节点的选举。
注意事项
- 确保
discovery.seed_hosts
中的主机可以相互通信,特别是在使用安全组或防火墙规则时。 - 在集群运行后,如果需要添加新节点,通常不需要修改
discovery.seed_hosts
,因为新节点会自动发现并加入现有的集群。 - 保持
cluster.initial_master_nodes
的配置更新,以包含新加入的有资格成为主节点的节点,确保集群的主节点选举机制正常工作。
正确配置这些发现设置对于确保Elasticsearch集群的高可用性和稳定性至关重要。
三、Elasticserach的相关概念
在 Elasticsearch 中,索引是存储相关文档的集合,类似于传统关系型数据库中的"表"(table)。每个索引在 Elasticsearch 中都有一个唯一的名称,并且可以配置不同的设置来优化其性能和存储。以下是 Elasticsearch 集群中索引概念的详细说明:
1. 文档(Documents)
- 索引由多个文档组成,每个文档是一个可搜索的数据结构,通常以 JSON 格式表示。
- 文档可以包含多个字段,每个字段可以存储文本、数字、日期等不同类型的数据。
- 文档是索引中信息的基本单位,类似于数据库表中的一行。
2. 字段和数据类型
- 每个字段都有一个名称和数据类型,如
text
、keyword
、date
、integer
等。 text
类型的字段适用于全文搜索,而keyword
类型的字段适用于过滤和聚合。- Elasticsearch 可以根据字段的内容自动推断数据类型,但显式指定类型可以提高性能和查询的相关性。
3. 分片(Shards)
- 为了提高可扩展性和可用性,每个索引被分成多个分片。
- 分片是数据分布和查询操作的基本单元。
- 索引可以有主分片(primary shards)和副本分片(replica shards)。
4. 主分片与副本分片
- 主分片:每个索引在创建时都会有一定数量的主分片,这些分片负责处理文档的索引和搜索请求。
- 副本分片:每个主分片可以有零个或多个副本分片,副本分片是主分片的复制品,用于提供高可用性和读取扩展。
5. 索引设置
- 分片和副本数量:在创建索引时,可以指定主分片和副本分片的数量。
- 刷新间隔 :索引的刷新间隔(
index.refresh_interval
)决定了多久将缓冲区的数据写入磁盘。 - 合并策略:Elasticsearch 使用段合并策略来优化存储和搜索性能。
6. 索引生命周期管理(ILM)
- Elasticsearch 提供了索引生命周期管理(ILM)功能,允许自动化管理索引的整个生命周期,包括创建、扩展、缩减和删除索引。
7. 索引状态
- 索引可以处于开启或关闭状态。关闭索引可以减少维护成本,但关闭的索引不能执行搜索操作。
8. 索引别名(Aliases)
- 别名是索引的另一个名称,可以用于指向一个或多个索引。
- 别名对于索引的版本控制和维护非常有用,因为它们允许您在不改变应用程序代码的情况下切换索引。
9. 索引模板
- 索引模板定义了新索引的默认设置,包括映射、设置和别名。
- 当创建新索引时,如果没有指定特定的设置,Elasticsearch 会查找匹配的索引模板并应用其配置。
10. 索引健康状态
- Elasticsearch 提供了工具来检查索引的健康状态,包括是否所有主分片和副本分片都正常工作。
11. 索引优化
- 索引过程中,Elasticsearch 会对文档进行分析、标准化和存储,以优化搜索性能。
- 可以使用不同的分析器来处理文本数据,以提高搜索的相关性。
索引是 Elasticsearch 中组织和检索数据的基础,理解索引的工作原理和配置选项对于构建高效、可扩展的搜索解决方案至关重要。
Elasticsearch 的核心是一个搜索引擎,它使用一种称为"逆向索引"(Inverted Index)的数据结构来存储和检索数据。逆向索引是信息检索系统中最常见的数据结构之一,它允许快速全文搜索。下面详细解释逆向索引的概念和在 Elasticsearch 中的实现:
逆向索引的基本概念
逆向索引包含两个主要的部分:
-
词汇表(Term Dictionary):
- 词汇表是一个数据结构,它列出了文档集合中出现的所有唯一词汇(terms),以及每个词汇对应的文档列表。
-
倒排索引(Posting List):
- 对于词汇表中的每个词汇,都有一个倒排列表(posting list),它包含了出现该词汇的所有文档的引用(或指针)。
- 倒排列表通常包含文档ID(doc ID)和词汇在文档中出现的位置(positions),以及其他元数据,如词汇频率(term frequency)等。
在 Elasticsearch 中,逆向索引的实现细节如下:
-
文档和字段:
- Elasticsearch 中的每个文档可以看作是关系数据库中的一行记录,而字段则类似于列。
-
分析(Analysis):
- 文档在索引之前会经过分析器的处理,将文本字段分解成词汇(tokens),这些词汇随后被存储在逆向索引中。
- 分析过程包括分词(tokenization)和过滤(filtering),可能会使用到自定义的分词器(tokenizer)和过滤器(filter)。
-
词汇表和倒排列表:
- 经过分析的词汇被添加到词汇表中,每个词汇对应一个倒排列表,包含了所有包含该词汇的文档的信息。
-
存储结构:
- Elasticsearch 将逆向索引存储在磁盘上,并且为了提高搜索速度,会缓存频繁访问的索引数据到内存中。
-
段(Segments):
- 索引数据被分成多个段,每个段都有自己的词汇表和倒排列表。
- 段是不可变的,一旦创建,就只能被读取。Elasticsearch 定期合并这些段以优化存储和搜索性能。
-
文档ID(Doc ID):
- 每个文档在索引中都有一个唯一的文档ID,这个ID在倒排列表中用来标识文档。
-
近实时搜索(NRT):
- Elasticsearch 提供近实时搜索能力,这意味着文档的索引和搜索之间有很小的延迟。
-
评分(Scoring):
- 当执行搜索查询时,Elasticsearch 使用逆向索引来快速找到匹配的文档,并根据相关性评分算法(如 BM25)对结果进行评分和排序。
-
分布式逆向索引:
- 在 Elasticsearch 集群中,逆向索引是分布式存储的。每个主分片都有自己的逆向索引,而副本分片是主分片的复制品。
逆向索引是 Elasticsearch 高效处理全文搜索的关键,它使得可以在大规模数据集上执行快速且复杂的搜索查询。理解逆向索引的工作原理对于优化 Elasticsearch 的性能和查询结果至关重要。
四、Elasticsearch的RestAPI操作
Elasticsearch 提供了一系列的 RESTful API,用于管理和操作 Elasticsearch 集群中的数据。以下是一些常用的 Elasticsearch API 及其操作方式:
1. 索引管理 API
-
创建索引:
shPUT /your_index_name { "settings": { "number_of_shards": 3, "number_of_replicas": 2 } }
这个 API 用于创建一个名为
your_index_name
的新索引,设置分片数为 3,副本数为 2 。 -
查看索引列表:
shGET /_cat/indices?v
这个 API 用于列出所有的索引及其相关信息 。
-
删除索引:
shDELETE /your_index_name
这个 API 用于删除名为
your_index_name
的索引 。
2. 文档操作 API
-
索引文档:
shPOST /your_index_name/_doc/1 { "field1": "value1", "field2": "value2" }
这个 API 用于向
your_index_name
索引中添加或更新一个文档,文档 ID 为 1 。 -
获取文档:
shGET /your_index_name/_doc/1
这个 API 用于获取
your_index_name
索引中 ID 为 1 的文档 。 -
删除文档:
shDELETE /your_index_name/_doc/1
这个 API 用于删除
your_index_name
索引中 ID 为 1 的文档 。
3. 搜索 API
-
基础搜索:
shGET /your_index_name/_search { "query": { "match_all": {} } }
这个 API 用于在
your_index_name
索引中执行匹配所有文档的搜索 。 -
URL Search:
shGET /your_index_name/_search?q=field1:value1
这个 API 通过 URL 参数进行简单搜索 。
-
Request Body Search:
shPOST /your_index_name/_search { "query": { "match": { "field1": "value1" } } }
这个 API 以 JSON 格式在请求体中指定复杂的搜索条件 。
4. 聚合 API
-
桶聚合 :
shGET /your_index_name/_search { "size": 0, "aggs": { "my_buckets": { "terms": { "field": "field1" } } } }
这个 API 用于对
field1
字段进行桶聚合,返回不同值的计数 。
5. 监控和统计 API
-
查看集群健康状况:
shGET /_cat/health?v
这个 API 用于查看集群的健康状况 。
-
查看集群节点:
shGET /_cat/nodes?v
这个 API 用于查看集群的节点信息 。
这些是 Elasticsearch 中一些基本的 API 操作。通过这些 API,你可以执行数据的索引、搜索、更新、删除等操作,以及对集群进行监控和管理。更多详细的 API 信息和高级用法,可以参考 Elasticsearch 的官方文档。
索引模板的API
Elasticsearch的索引模板(Index Template)是一种强大的工具,它允许你在索引创建之前定义索引的设置、映射和别名。以下是索引模板的具体配置和举例说明:
索引模板配置
索引模板主要由以下几个部分组成:
- index_patterns :定义模板匹配的索引模式,使用通配符(如
*
)来匹配索引名称。 - order:定义模板的优先级,数字越大,优先级越高。
- settings:定义索引的设置,如分片数、副本数等。
- mappings:定义索引的映射,包括字段名称、字段类型和映射参数。
- aliases:定义索引的别名。
具体配置例子
以下是一个创建索引模板的示例,该模板将应用于所有以logstash-
开头的索引:
json
PUT _template/my_logs
{
"index_patterns": ["logstash-*"],
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"account_holder_name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"certificate_type": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
},
"aliases": {
"last_3_months": {}
}
}
在这个例子中:
index_patterns
设置为"logstash-*"
,意味着这个模板将应用于所有以logstash-
开头的索引。settings
定义了索引的分片数为1,副本数为1。mappings
定义了两个字段account_holder_name
和certificate_type
,它们的类型都是text
,并为它们创建了keyword
子字段。aliases
为索引定义了一个别名last_3_months
。
操作说明
- 创建索引模板 :使用
PUT
请求和模板名称(如_template/my_logs
)来创建或更新索引模板。 - 查看模板 :使用
GET
请求和模板名称(如GET _template/my_logs
)来查看已定义的索引模板。 - 删除模板 :使用
DELETE
请求和模板名称(如DELETE _template/my_logs
)来删除索引模板。
通过索引模板,你可以在索引创建之前预定义其结构和行为,这有助于保持索引的一致性和管理大规模的索引集。
五、Elasticsearch集群的一些配置
Elasticsearch集群状态的可视化插件head
elasticsearch-head官方地址
elasticsearch-head官方提供的源码包下载地址
安装npm和NodeJS
安装npm
head插件需要依赖npm工具
bash
yum instal -y npm
安装NodeJS
将npm仓库换成国内的
bash
npm config set registry=https://registry.npmmirror.com
使用npm安装nrm、grunt
什么是nrm和grunt
NRM 和 Grunt 都是与 Node.js 和前端开发相关的工具,但它们服务于不同的目的。
NRM (Node Version Manager)
NRM 是 Node Version Manager 的缩写,它是一个用于管理多个 Node.js 版本的工具。开发者经常需要在不同的项目之间切换不同的 Node.js 版本,NRM 可以帮助他们轻松地安装、卸载和切换这些版本。
NRM 的主要功能包括:
- 安装 Node.js 版本:可以安装特定版本的 Node.js。
- 切换 Node.js 版本:在不同版本的 Node.js 之间快速切换。
- 查看 Node.js 版本:列出所有已安装的 Node.js 版本。
- 卸载 Node.js 版本:从系统中卸载不再需要的 Node.js 版本。
使用 NRM,开发者可以保持项目的 Node.js 环境一致性,同时避免全局安装多个版本的 Node.js 带来的潜在冲突。
Grunt
Grunt 是一个基于 Node.js 的任务运行器,它使用 JavaScript 编写。Grunt 被广泛用于自动化前端开发中的常见任务,如压缩文件、合并文件、编译代码等。
Grunt 的主要特点包括:
- 自动化:自动化执行重复性的任务,如压缩图片、合并 CSS/JavaScript 文件、编译 LESS/SASS 等。
- 插件系统:Grunt 拥有一个庞大的插件生态系统,可以通过安装插件来扩展其功能。
- 自定义任务:开发者可以创建自定义任务来满足特定的构建需求。
- 并行/串行执行:Grunt 允许任务并行或串行执行,以优化构建过程。
Grunt 的配置文件通常是一个名为 Gruntfile.js
的 JavaScript 文件,在这个文件中定义了任务和它们的配置。通过运行 grunt
命令,Grunt 会读取 Gruntfile.js
并执行定义的任务。
总结来说,NRM 是一个 Node.js 版本管理工具,而 Grunt 是一个任务运行器,两者都是前端开发中常用的工具,但服务于不同的目的。随着前端工具的发展,现在也有其他的版本管理工具(如 nvm 或 nvs)和任务运行器(如 Gulp 或 npm scripts)被广泛使用。
npm安装nrm
bash
npm install -g nrm
npm安装grunt
bash
npm install grunt -save
先安装phantnjs
安装后:
启动head插件
bash
#先进入到elasticsearch-head的源码目录中,然后再执行下面的命令来启动:
npm run start &
安装head插件后的访问ElasticSearch时的效果
ElasticSearch集群中的节点间的互相访问配置(添加跨域访问)
各个节点中的elasticserach.yml中:
yml
http.cors.enabled: true
http.cors.allow-orgin: "*"
这段内容描述的是Elasticsearch集群中节点间互相访问的配置,以及如何设置跨域访问。以下是对这部分内容的解释:
-
ElasticSearch集群中的节点间的互相访问配置:
- 在Elasticsearch集群中,节点需要能够相互通信以交换数据和协调任务。这通常涉及到网络配置,确保不同节点之间的网络是通畅的,并且安全设置允许这种通信。
-
添加跨域访问:
-
跨域资源共享(CORS)是一种安全机制,它允许或限制网页上哪些不同的域可以访问资源。在Elasticsearch中,如果客户端应用和Elasticsearch服务器不在同一个域上,就需要配置CORS以允许客户端访问Elasticsearch服务。CORS是"Cross-Origin Resource Sharing"的缩写,中文意思是"跨源资源共享"。这是一种浏览器安全机制,用于在不同的域之间安全地共享资源。通过允许或限制某些域的HTTP请求,CORS可以控制哪些网站可以访问另一个网站的API和数据。
-
在
elasticsearch.yml
配置文件中设置CORS,可以允许来自不同源的HTTP请求访问Elasticsearch服务。
-
-
在
elasticsearch.yml
中配置CORS:http.cors.enabled: true
:这个设置启用了CORS支持。当设置为true
时,Elasticsearch将处理CORS相关的HTTP头。http.cors.allow-origin: "*"
:这个设置指定了允许访问Elasticsearch的源(即域名)。星号(*
)表示允许所有域的跨域请求。出于安全考虑,通常不建议在生产环境中使用*
,而是应该指定具体的域名或域列表。
总结来说,这部分内容讲述了如何在Elasticsearch集群中配置节点间的互相访问,并特别强调了如何通过修改elasticsearch.yml
文件来启用和配置CORS,以便允许跨域请求。这对于运行在不同域上的客户端应用访问Elasticsearch集群是必要的。
使用head的访问显示效果
ElasticSearch集群的分片机制
Elasticsearch 是一个基于文档的分布式搜索引擎,它的核心功能之一是能够将数据分散存储在多个节点上,以实现高可用性和可扩展性。这主要通过分片(shards)、副本分片(replicas)、段(segments)和提交点(commit point)等机制来实现。下面详细解释这些概念:
1. 分片(Shards)
主分片(Primary Shards):
- Elasticsearch 将索引分成多个主分片,每个分片本身是一个完整的搜索引擎,可以托管在集群中的任何节点上。
- 分片的主要目的是为了并行处理和分布式存储,提高搜索效率和存储容量。
- 默认情况下,每个索引有多个主分片,可以通过在创建索引时设置
index.number_of_shards
来指定。
副本分片(Replica Shards):
- 副本分片是主分片的复制品,用于提供高可用性和读取操作的扩展。
- 如果一个包含主分片的节点失败,副本分片可以提升为主分片。
- 副本分片不参与写入操作,只用于读取操作。
- 默认情况下,每个索引有多个副本分片,可以通过设置
index.number_of_replicas
来指定。
2. 段(Segments)
- Elasticsearch 将数据存储在段中,每个段是一个不可变的文件。
- 索引操作实际上是追加操作,新的数据被添加到新的段中。
- 段是搜索引擎的最小单位,每个段都有自己的倒排索引。
- 为了提高效率,Elasticsearch 定期合并较小的段到较大的段中,这个过程称为段合并(segment merge)。
3. 提交点(Commit Point)
- 提交点是 Elasticsearch 用来确保数据不丢失的一种机制。
- 当文档被索引或删除时,这些操作被记录在一个事务日志中,但不会立即被应用到段中。
- 提交点是一个标记,表示所有之前的索引和删除操作已经被持久化,并且可以在段合并时应用。
- 如果 Elasticsearch 服务重启,它会从最后一个提交点恢复,确保数据的一致性。
4. 分片和副本分片的分配
- Elasticsearch 使用一个叫做"集群分配服务"的组件来管理分片的分配。
- 分片分配考虑多个因素,包括集群的健康状态、分片数量、副本分片的数量和集群的平衡。
- Elasticsearch 尝试在不同的节点上分配主分片和副本分片,以实现容错和负载均衡。
5. 副本分片的作用
- 高可用性:如果主分片所在的节点失败,副本分片可以提升为主分片,确保数据不会丢失。
- 读取扩展:副本分片可以处理读取请求,这样可以分散负载,提高读取性能。
- 故障转移:副本分片提供了故障转移机制,确保系统的稳定性和可靠性。
通过这些机制,Elasticsearch 能够提供高可用性、高扩展性和高性能的数据存储和搜索解决方案。理解这些基本概念对于优化 Elasticsearch 的性能和维护其稳定性至关重要。
集群的健康值
ElasticSearch的索引、分片操作
在Elasticsearch中,索引和分片的配置是至关重要的,它们直接影响到数据的存储、搜索性能以及集群的高可用性。以下是关于索引和分片配置的一些关键点:
索引配置(Index Settings)
-
索引设置(Settings) :可以通过
settings
参数在创建索引时进行配置,包括分词器、分片、慢查询等基础参数。 -
索引字段映射(Mappings) :通过
mappings
参数设置索引的字段参数,包括字段类型、子级字段类型、孙级字段类型以及字段的格式等。 -
索引别名(Aliases):可以在创建索引时加入别名定义,以便更方便地管理索引。
-
索引创建 :使用
PUT /<index>
请求创建新索引,可以指定索引设置、字段映射和别名。
分片配置(Shard Settings)
-
分片数量(Number of Shards) :每个索引由一个或多个分片组成,可以通过
index.number_of_shards
静态设置指定每个索引的主分片数量,默认为1,这个设置只能在创建索引时设置。 -
副本数量(Number of Replicas) :可以通过
index.number_of_replicas
设置每个索引的副本分片数量,默认为1。 -
分片分配(Shard Allocation):控制分片分配给节点的位置、时间和方式。包括集群级分片分配设置、基于磁盘的分片分配设置、分片分配感知和强制感知等。
-
分片大小设计:推荐每个分片的大小为20-40GB,建议不超过30GB。每个节点的分片数量应保持在每1GB堆内存对应集群的分片在20-25之间。
-
索引的分片 :一般为节点数的1-3倍,例如有15个数据节点,则15340GB=1.8T,这样一个索引最多设置。
-
大索引设计:当一个索引太大时,可以使用索引模板+Rollover+生命周期进行自动滚动创建索引,所有的索引都用一个别名进行读,并且设置一个索引为写。
-
分片分配过滤:允许指定允许哪些节点承载特定索引的分片。
-
分片分配感知和强制感知:控制如何在不同机架或可用性区域中分配分片。
以上是Elasticsearch中关于索引和分片配置的一些基本信息,正确的配置可以显著提高集群的性能和可靠性。
创建分片
bash
curl -X PUT 10.0.0.81:9200/_template/my_template -d '
{
"template": "*",
"settings": {
"index": {
"number_of_shards": 6,
"number_of_replicas": 1
}
}
}
'
通过REST API配置索引和分片
在Linux中配置Elasticsearch的索引和分片,通常是通过Elasticsearch的REST API或者在启动Elasticsearch服务时通过配置文件(通常是elasticsearch.yml
)来完成的。以下是一些具体的配置示例:
当你创建一个新的索引时,可以通过HTTP PUT请求来指定分片和副本的数量。以下是一个创建索引的示例,其中指定了主分片(number_of_shards
)和副本分片(number_of_replicas
)的数量:
sh
curl -X PUT "localhost:9200/my_index?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"index": {
"number_of_shards": 3,
"number_of_replicas": 2
}
}
}
'
在这个例子中,my_index
是索引的名称,number_of_shards
设置为3,number_of_replicas
设置为2。
通过elasticsearch.yml
配置文件配置
在elasticsearch.yml
配置文件中,你可以设置集群级别的默认分片和副本设置,这些设置将应用于所有新创建的索引,除非在创建索引时明确指定了不同的设置。
yaml
# 设置集群默认的主分片和副本数量
index.number_of_shards: 3
index.number_of_replicas: 2
# 设置分片分配感知,以确保分片均匀分布在不同的物理位置
cluster.routing.allocationawareness.type: attribute
cluster.routing.allocationawareness.attributes: rack_id
# 设置分片大小限制
index.shard.size.limit: 50gb
这些设置将影响所有新创建的索引。index.shard.size.limit
设置了单个分片的最大大小限制。
动态调整分片和副本
如果需要在索引创建后动态调整分片和副本的数量,可以使用以下命令:
sh
# 动态增加副本数量
curl -X PUT "localhost:9200/my_index/_settings?pretty" -H 'Content-Type: application/json' -d'
{
"index": {
"number_of_replicas": 3
}
}
'
# 动态增加主分片数量(注意:Elasticsearch不允许减少主分片数量)
curl -X PUT "localhost:9200/my_index/_settings?pretty" -H 'Content-Type: application/json' -d'
{
"index": {
"number_of_shards": 5
}
}
'
请注意,增加主分片的数量是一个昂贵的操作,因为它涉及到重新分配所有现有数据。而减少主分片的数量在Elasticsearch中是不允许的,因为这会导致数据丢失。
以上是在Linux中配置Elasticsearch索引和分片的一些基本方法和示例。在实际应用中,你可能需要根据具体的业务需求和硬件资源来调整这些设置。