微服务--ES(Elasticsearch)
Elasticsearch是一个基于Lucene的分布式、高扩展、高实时的搜索与数据分析引擎。它位于Elastic Stack(以前称为ELK Stack)的核心,与Logstash(数据收集和日志解析引擎)和Kibana(分析和可视化平台)一起,为各种类型的数据提供近乎实时的搜索和分析能力。以下是对Elasticsearch的详细解析:
Elasticsearch的基本概念
- 定义:Elasticsearch是一个开源的搜索引擎,它允许你以快速且近乎实时的方式存储、搜索和分析大量数据。无论是结构化还是非结构化数据,Elasticsearch都能高效地存储和索引。
- 核心组件:Elasticsearch与Logstash和Kibana共同构成了Elastic Stack,提供从数据收集、处理、存储到分析和可视化的完整解决方案。
Elasticsearch的主要功能和特性
- 分布式架构:
- Elasticsearch是分布式的,意味着索引可以被分成分片,每个分片可以有0个或多个副本。这种设计使得Elasticsearch能够水平扩展,以处理大规模数据集。
- 分片数在索引创建时指定,且后续不允许更改。每个节点托管一个或多个分片,并充当协调器将操作委托给正确的分片。
- 实时搜索和分析:
- Elasticsearch支持近实时的数据索引和搜索,用户可以在数据被索引后几乎立即进行搜索。
- 它提供了丰富的查询DSL(领域特定语言),允许用户构建复杂的查询语句,以满足各种搜索需求。
- 可扩展性和高可用性:
- Elasticsearch的分布式特性使得其能够随着数据量和查询量的增长而无缝扩展。
- 通过副本分片,Elasticsearch提高了数据的可用性和容错性,即使部分节点发生故障,也能保证服务的连续性。
- 数据聚合和可视化:
- Elasticsearch支持对数据进行聚合操作,如分组、统计、排序等,以生成复杂的分析报告。
- 结合Kibana,用户可以对Elasticsearch中的数据进行交互式查询、可视化和分享。
- RESTful API:
- Elasticsearch通过HTTP/HTTPS协议提供RESTful API接口,使得与Elasticsearch的交互变得简单、统一且易于集成到各种应用程序中。
Elasticsearch的应用场景
- 日志分析:Elasticsearch经常被用于实时日志分析,帮助开发人员和运维人员快速定位问题。
- 全文搜索:对于需要全文搜索功能的网站或应用程序,Elasticsearch是一个理想的选择。
- 数据分析:Elasticsearch的数据聚合和可视化功能使其成为数据分析领域的强大工具。
- 实时监控系统:结合Logstash和Kibana,Elasticsearch可以构建实时监控系统,对系统性能进行实时监控和预警。
Elasticsearch和mysql的区别
Elasticsearch和MySQL是两种不同类型的数据库系统,它们在多个方面存在显著的区别。以下是它们之间的一些主要差异:
1. 用途和特点
- MySQL:
- 是一种关系型数据库管理系统(RDBMS),用于存储结构化数据。
- 提供ACID事务支持,适合需要强一致性和事务支持的应用程序。
- 适用于事务处理和实时写入,能够提供较高的实时性。
- Elasticsearch:
- 是一个基于Lucene的分布式搜索和分析引擎,专门用于处理非常大的文本数据集。
- 专注于全文搜索、实时数据分析和日志搜索等用途。
- 支持全文搜索和复杂的数据分析查询,提供分布式、高性能的全文搜索和分析功能。
2. 数据存储和模型
- MySQL:
- 采用关系模型进行数据存储,使用表格进行数据的组织和存储。
- 支持复杂的关系型查询和事务处理。
- Elasticsearch:
- 采用文档型存储模型,以JSON格式存储文档。
- 不支持事务,但提供了灵活的文档存储和高效的搜索能力。
3. 查询和性能
- MySQL:
- 执行结构化的SQL查询,支持复杂的关系型查询语句。
- 在处理简单的精确匹配查询时表现良好,特别是在数据量较小且建立了合适索引的情况下。
- 对于全文搜索等需求支持较弱,需要额外的配置和优化。
- Elasticsearch:
- 提供强大的全文搜索和文本分析功能,可以执行复杂的查询。
- 支持多种类型的模糊搜索、聚合分析和实时数据分析。
- 在处理大规模数据集和复杂查询时表现出色,特别是当数据量达到百万级甚至更高时。
4. 扩展性和灵活性
- MySQL:
- 扩展性相对复杂,通常需要通过读写分离、分库分表等方式来提高性能。
- 数据结构相对固定,需要事先定义好表结构。
- Elasticsearch:
- 水平扩展容易,可以轻松地通过增加节点来扩展集群的容量和性能。
- 数据结构灵活,不需要事先定义好数据结构,可以动态地添加或修改字段。
5. 适用场景
- MySQL:
- 适合于需要强一致性和事务支持的应用场景,如金融交易系统、电商网站的订单和用户信息管理系统等。
- Elasticsearch:
- 适合于全文搜索、实时数据分析和日志搜索等场景,如网站的搜索功能、数据分析平台、日志管理系统等。
Elasticsearch的安装
环境配置
- 安装Java环境:
- Elasticsearch是基于Java开发的,因此需要安装Java运行环境(JRE)或Java开发工具包(JDK)。
- 建议安装JDK 1.8.0_73以上版本,并确保
JAVA_HOME
环境变量正确设置,同时%JAVA_HOME%\bin
应被添加到系统的PATH环境变量中。
- 下载Elasticsearch安装包:
- 访问Elasticsearch的官方网站(Download Elasticsearch | Elastic)下载适合Windows系统的安装包。
- 选择合适的版本进行下载,注意Elasticsearch的版本兼容性。
安装步骤
- 解压安装包:
- 将下载的Elasticsearch安装包解压到一个非中文且没有空格的目录下,例如
D:\elasticsearch
。
- 将下载的Elasticsearch安装包解压到一个非中文且没有空格的目录下,例如
- 配置Elasticsearch(可选):
- 如果需要修改Elasticsearch的默认配置,可以编辑
config\elasticsearch.yml
文件。 - 常见的配置项包括集群名称(
cluster.name
)、节点名称(node.name
)、数据路径(path.data
)、日志路径(path.logs
)等。
- 如果需要修改Elasticsearch的默认配置,可以编辑
- 启动Elasticsearch服务:
- 进入Elasticsearch的
bin
目录。 - 双击
elasticsearch.bat
文件启动Elasticsearch服务,或者通过命令行运行elasticsearch.bat
。 - 注意:如果是通过命令行启动,确保命令行窗口保持打开状态,否则Elasticsearch服务将停止。
- 进入Elasticsearch的
- 验证安装:
- 打开浏览器,访问
http://localhost:9200
(或你配置的其他地址和端口)。 - 如果看到Elasticsearch的响应信息(如版本号、集群名称等),则表示安装成功。
- 打开浏览器,访问
额外配置和插件安装
- 安装Elasticsearch-head插件(可选):
- Elasticsearch-head是一个Web界面的Elasticsearch集群管理工具,可以帮助用户更方便地管理和监控Elasticsearch集群。
- 安装前需要安装Node.js和Grunt(一个JavaScript任务运行器)。
- 下载Elasticsearch-head插件并解压,然后在插件目录下运行
npm install
安装依赖。 - 运行
npm run start
或grunt server
启动Elasticsearch-head服务。
- 安装IK分词器插件(可选):
- IK分词器是Elasticsearch的一个中文分词插件,可以提高中文搜索的准确性和效率。
- 下载与Elasticsearch版本相匹配的IK分词器插件并解压到Elasticsearch的
plugins
目录下。 - 重启Elasticsearch服务以使插件生效。
Elasticsearch安装kibana
下载Kibana
- 访问官网:
- 前往Kibana的官方网站(Kibana: Explore, Visualize, Discover Data | Elastic)或下载页面(Download Kibana Free | Get Started Now | Elastic)。
- 选择版本:
- 根据你的Elasticsearch版本选择合适的Kibana版本。尽量保持Kibana和Elasticsearch的版本一致,或者确保它们之间的兼容性。
- 下载安装包:
- 下载对应版本的Kibana安装包,通常是一个压缩文件(如
.tar.gz
)。
- 下载对应版本的Kibana安装包,通常是一个压缩文件(如
解压Kibana
- 选择安装目录:
- 选择一个合适的目录来解压Kibana,通常建议选择非中文且没有空格的路径,例如
/usr/local/kibana
(Linux)或D:\kibana
(Windows)。
- 选择一个合适的目录来解压Kibana,通常建议选择非中文且没有空格的路径,例如
- 解压文件:
- 使用适当的命令或工具解压Kibana安装包。在Linux中,可以使用
tar -zxvf kibana-xxx.tar.gz
命令;在Windows中,可以使用压缩软件如WinRAR或7-Zip进行解压。
- 使用适当的命令或工具解压Kibana安装包。在Linux中,可以使用
配置Kibana
- 编辑配置文件:
- 进入Kibana的
config
目录,找到kibana.yml
文件并使用文本编辑器打开。 - 根据需要修改配置项,例如:
server.port
: Kibana监听的端口号,默认为5601。server.host
: Kibana绑定的主机地址,可以是0.0.0.0
(允许任何IP地址访问)或特定的IP地址。elasticsearch.hosts
: Elasticsearch节点的地址列表,格式为["http://host1:port1", "http://host2:port2"]
。- 其他配置项可以根据实际需要进行调整。
- 进入Kibana的
- (可选)配置权限:
- 如果Elasticsearch和Kibana不是以root用户运行的,确保Kibana的安装目录和配置文件具有适当的读写权限。
启动Kibana
- 切换到合适的用户(如果非root用户):
- 在Linux系统中,通常不建议以root用户运行Elasticsearch和Kibana。因此,你可能需要切换到非root用户或使用
sudo
命令以非root用户身份运行Kibana。
- 在Linux系统中,通常不建议以root用户运行Elasticsearch和Kibana。因此,你可能需要切换到非root用户或使用
- 启动Kibana:
- 进入Kibana的
bin
目录。 - 在Linux中,运行
./kibana
命令启动Kibana。如果需要使用后台进程运行,可以使用nohup ./kibana &
命令。 - 在Windows中,双击
kibana.bat
文件或使用命令行运行kibana.bat
。
- 进入Kibana的
- 验证安装:
- 打开浏览器,访问
http://localhost:5601
(或你配置的其他地址和端口)。 - 如果看到Kibana的登录或主界面,则表示安装成功。
- 打开浏览器,访问
Elasticsearch安装ik分词器
环境准备
- 确认Elasticsearch版本:
- 在安装IK分词器之前,首先需要确认你的Elasticsearch的版本号。因为IK分词器的版本需要与Elasticsearch的版本相匹配或兼容。
- 下载IK分词器:
- 访问IK分词器的GitHub页面(如https://github.com/medcl/elasticsearch-analysis-ik)或Elasticsearch插件市场,找到与你Elasticsearch版本相对应的IK分词器版本。
- 下载对应版本的IK分词器插件压缩包。
安装IK分词器
- 创建插件目录(如果尚未存在):
- 在Elasticsearch的
plugins
目录下创建一个名为ik
的文件夹,用于存放IK分词器的相关文件。例如,在Linux系统中,路径可能是/usr/share/elasticsearch/plugins/ik
。
- 在Elasticsearch的
- 解压IK分词器插件:
- 将下载的IK分词器插件压缩包解压到刚刚创建的
ik
文件夹中。在Linux系统中,可以使用unzip
命令进行解压,如unzip elasticsearch-analysis-ik-x.x.x.zip -d /usr/share/elasticsearch/plugins/ik
。
- 将下载的IK分词器插件压缩包解压到刚刚创建的
配置(可选)
- IK分词器通常不需要额外的配置即可使用,但如果你需要自定义词库或调整分词行为,可以在IK分词器的
config
目录下进行配置。
重启Elasticsearch
- 安装完IK分词器后,需要重启Elasticsearch服务以使插件生效。在Linux系统中,可以使用
systemctl restart elasticsearch
命令重启Elasticsearch服务。
验证安装
- 检查插件列表:
- 重启Elasticsearch后,可以通过执行
./elasticsearch-plugin list
命令(在Elasticsearch的bin
目录下)来检查已安装的插件列表,确认IK分词器是否已成功安装。
- 重启Elasticsearch后,可以通过执行
- 测试分词效果:
- 可以通过发送HTTP请求到Elasticsearch的
_analyze
API来测试IK分词器的分词效果。例如,使用curl命令发送一个包含中文文本的请求,并指定使用ik_max_word
或ik_smart
分词器进行分词。
- 可以通过发送HTTP请求到Elasticsearch的