部署Elasticsearch 8.15.0版本
Elasticsearch 和 Kibana 是由 Elastic 公司开发的一组开源软件,用于实时的分布式数据搜索、分析和可视化。
Elasticsearch
Elasticsearch 是一个基于 RESTful API 的分布式搜索引擎,最早由 Shay Banon 开发。它最显著的特点是:
- 全文搜索:Elasticsearch 使用倒排索引(inverted index)支持高效的全文搜索,使得对海量文本数据的检索速度非常快。
- 分布式架构:Elasticsearch 的数据存储在多个节点中,支持分片和多副本,以提高数据的可用性和查询效率。
- 强大的查询功能:支持复杂的查询语法,能够对结构化和非结构化数据进行快速查询。
- 实时数据分析:在大数据分析和日志处理场景中,Elasticsearch 能够实现近乎实时的分析和展示。
通常,Elasticsearch 被用于构建搜索引擎、日志分析、监控、机器学习等场景,如电商网站的商品搜索、日志管理系统中的实时数据检索等。
Kibana
Kibana 是 Elastic Stack 的数据可视化和管理工具,通常与 Elasticsearch 搭配使用。它的主要功能包括:
- 数据可视化:Kibana 提供了丰富的图表类型(如折线图、柱状图、饼图、地图等),帮助用户将 Elasticsearch 中的数据以可视化的方式展现出来。
- 仪表盘(Dashboard):用户可以将多个可视化图表组合在一起,创建动态的实时仪表盘,以便进行数据监控和分析。
- 管理和监控:Kibana 允许用户管理 Elasticsearch 集群,监控集群的健康状态、节点情况和查询性能。
- 搜索和查询:支持与 Elasticsearch 集成的高级查询和过滤,用户可以使用 Kibana 的查询语言 KQL(Kibana Query Language)来构建灵活的数据筛选条件。
Kibana 常用于构建运营监控面板、应用程序性能分析系统、业务数据分析平台等,帮助用户从大量数据中获得洞察力。
为啥快
Elasticsearch 之所以非常快速,主要得益于以下几个关键设计和技术特点:
- 倒排索引:
Elasticsearch 使用倒排索引(inverted index),这是一种用于文本检索的高效数据结构。倒排索引能够快速查找文档中包含特定词语的位置,从而极大提高文本搜索的效率。与传统的顺序扫描相比,倒排索引能大幅减少查询时间,尤其在面对大规模数据时,能显著提高查询速度。 - 分布式架构:
Elasticsearch 是一个分布式系统,能够通过将数据分片(shards)分布到不同的节点上来扩展其处理能力。当集群中的节点增多时,数据和查询请求会被合理地分配,负载能够在多个节点间平衡,从而避免单点瓶颈,提高系统的吞吐量和响应速度。 - 数据压缩和存储优化:
Elasticsearch 对数据进行存储时,采用了高效的压缩算法。这不仅减少了数据存储所需的空间,还能在检索时提高性能,因为数据在磁盘上存储更加紧凑,读取操作能更快速地完成。此外,它还对常见的查询数据进行了缓存,减少了重复查询的延迟。 - 实时性和并行处理:
Elasticsearch 设计上支持接近实时(near real-time)的搜索,这意味着数据写入之后,可以立即用于搜索。此外,Elasticsearch 使用多线程和并行查询处理技术,在多核系统上能够同时处理大量查询请求,提高了查询的速度。 - 查询优化:
Elasticsearch 提供了多种查询优化手段,如布尔查询(Boolean Queries)、聚合(Aggregations)、过滤器(Filters)等,使得能够更加高效地定位匹配数据。通过合理使用查询缓存、预热索引等技术,用户可以进一步提升查询速度。 - 高效的缓存机制:
Elasticsearch 内建了多种缓存机制,比如查询缓存和字段数据缓存,它能根据查询模式和数据访问频率自动缓存热数据,从而避免重复的磁盘访问,提高查询响应速度。 - 硬件支持:
Elasticsearch 对硬件的支持非常优化,特别是在使用 SSD 存储时,它能充分发挥高 I/O 吞吐量的优势,进一步提升查询性能。 - 分布式查询执行:
当 Elasticsearch 执行查询时,它会将查询请求并行分发到多个分片进行处理,分片上的查询执行是独立的,查询结果会在主节点上汇总。分布式执行能够大幅提升查询效率,尤其是在面对大数据量时。
总结来说,Elasticsearch 的高速表现是多方面因素的结合,既包括其数据结构(倒排索引)、分布式架构、实时性处理、缓存策略,又包括对硬件的优化和查询优化技术。
Docker 部署
部署elasticsearch
1 |
|
config
文件夹
1 | docker cp elasticsearch:/usr/share/elasticsearch/config . |
创建elasticsearch.yml
文件
1 | cluster.name: "docker-cluster" |
部署kibana
1 |
|
创建kibana.yml
文件
1 | server.host: "0.0.0.0" |
注意检查elasticsearch.hosts
, 其中elasticsearch.serviceAccountToken
在下面生成
network
1 | docker network create --driver bridge docker_default |
创建用户
官网文档
官网有提示
Service accounts are predefined in code. The following service accounts are available:
elastic/fleet-server
The service account used by the Fleet server to communicate with Elasticsearch.
elastic/kibana
The service account used by Kibana to communicate with Elasticsearch.
官方建议使用token配置
1 | docker exec -it elasticsearch bash |
token持久化
Elasticsearch 支持将敏感信息存储在 elasticsearch-keystore 中,保证这些信息在重启后不会丢失。可以通过以下步骤将 serviceAccountToken 配置为一个持久化的密钥:
Docker 中,elasticsearch-keystore 文件通常存储在容器内部的 config 目录下
1 | docker cp elasticsearch:/usr/share/elasticsearch/config . |
在 Elasticsearch 中创建密钥库条目
在 Elasticsearch 的主目录下,执行以下命令将服务账号令牌添加到密钥库中:
1 | ./bin/elasticsearch-keystore add elasticsearch.serviceAccountToken |
然后系统会提示你输入刚生成的 token,将该 token 粘贴到命令行中。此时 token 将永久存储在 Elasticsearch 的密钥库中,并且在重启后不会丢失。
可能错误
错误提示
如果kibana.yml直接配置用户名为elastic
1 | elasticsearch.username: "elastic" |
会提示错误
1 | FATAL Error: [config validation of [elasticsearch].username]: value of "elastic" is forbidden. This is a superuser account that cannot write to system indices that Kibana needs to function. Use a service account token instead. Learn more: https://www.elastic.co/guide/en/elasticsearch/reference/8.0/service-accounts.html |