ElasticsearchKibana 是由 Elastic 公司开发的一组开源软件,用于实时的分布式数据搜索、分析和可视化。

Elasticsearch

Elasticsearch 是一个基于 RESTful API 的分布式搜索引擎,最早由 Shay Banon 开发。它最显著的特点是:

  1. 全文搜索:Elasticsearch 使用倒排索引(inverted index)支持高效的全文搜索,使得对海量文本数据的检索速度非常快。
  2. 分布式架构:Elasticsearch 的数据存储在多个节点中,支持分片和多副本,以提高数据的可用性和查询效率。
  3. 强大的查询功能:支持复杂的查询语法,能够对结构化和非结构化数据进行快速查询。
  4. 实时数据分析:在大数据分析和日志处理场景中,Elasticsearch 能够实现近乎实时的分析和展示。

通常,Elasticsearch 被用于构建搜索引擎、日志分析、监控、机器学习等场景,如电商网站的商品搜索、日志管理系统中的实时数据检索等。

Kibana

Kibana 是 Elastic Stack 的数据可视化和管理工具,通常与 Elasticsearch 搭配使用。它的主要功能包括:

  1. 数据可视化:Kibana 提供了丰富的图表类型(如折线图、柱状图、饼图、地图等),帮助用户将 Elasticsearch 中的数据以可视化的方式展现出来。
  2. 仪表盘(Dashboard):用户可以将多个可视化图表组合在一起,创建动态的实时仪表盘,以便进行数据监控和分析。
  3. 管理和监控:Kibana 允许用户管理 Elasticsearch 集群,监控集群的健康状态、节点情况和查询性能。
  4. 搜索和查询:支持与 Elasticsearch 集成的高级查询和过滤,用户可以使用 Kibana 的查询语言 KQL(Kibana Query Language)来构建灵活的数据筛选条件。

Kibana 常用于构建运营监控面板、应用程序性能分析系统、业务数据分析平台等,帮助用户从大量数据中获得洞察力。

为啥快

Elasticsearch 之所以非常快速,主要得益于以下几个关键设计和技术特点:

  1. 倒排索引
    Elasticsearch 使用倒排索引(inverted index),这是一种用于文本检索的高效数据结构。倒排索引能够快速查找文档中包含特定词语的位置,从而极大提高文本搜索的效率。与传统的顺序扫描相比,倒排索引能大幅减少查询时间,尤其在面对大规模数据时,能显著提高查询速度。
  2. 分布式架构
    Elasticsearch 是一个分布式系统,能够通过将数据分片(shards)分布到不同的节点上来扩展其处理能力。当集群中的节点增多时,数据和查询请求会被合理地分配,负载能够在多个节点间平衡,从而避免单点瓶颈,提高系统的吞吐量和响应速度。
  3. 数据压缩和存储优化
    Elasticsearch 对数据进行存储时,采用了高效的压缩算法。这不仅减少了数据存储所需的空间,还能在检索时提高性能,因为数据在磁盘上存储更加紧凑,读取操作能更快速地完成。此外,它还对常见的查询数据进行了缓存,减少了重复查询的延迟。
  4. 实时性和并行处理
    Elasticsearch 设计上支持接近实时(near real-time)的搜索,这意味着数据写入之后,可以立即用于搜索。此外,Elasticsearch 使用多线程和并行查询处理技术,在多核系统上能够同时处理大量查询请求,提高了查询的速度。
  5. 查询优化
    Elasticsearch 提供了多种查询优化手段,如布尔查询(Boolean Queries)、聚合(Aggregations)、过滤器(Filters)等,使得能够更加高效地定位匹配数据。通过合理使用查询缓存、预热索引等技术,用户可以进一步提升查询速度。
  6. 高效的缓存机制
    Elasticsearch 内建了多种缓存机制,比如查询缓存和字段数据缓存,它能根据查询模式和数据访问频率自动缓存热数据,从而避免重复的磁盘访问,提高查询响应速度。
  7. 硬件支持
    Elasticsearch 对硬件的支持非常优化,特别是在使用 SSD 存储时,它能充分发挥高 I/O 吞吐量的优势,进一步提升查询性能。
  8. 分布式查询执行
    当 Elasticsearch 执行查询时,它会将查询请求并行分发到多个分片进行处理,分片上的查询执行是独立的,查询结果会在主节点上汇总。分布式执行能够大幅提升查询效率,尤其是在面对大数据量时。

总结来说,Elasticsearch 的高速表现是多方面因素的结合,既包括其数据结构(倒排索引)、分布式架构、实时性处理、缓存策略,又包括对硬件的优化和查询优化技术。

Docker 部署

部署elasticsearch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
NAME=elasticsearch
HOME=$(pwd)

docker stop $NAME
docker rm $NAME

docker run --name $NAME -d \
-p 9200:9200 \
-e "discovery.type=single-node" \
--net docker_default \
-v $HOME/data:/usr/share/elasticsearch/data \
elasticsearch:8.15.0

# 注意修改权限,否则可能会提示错误
chmod 0777 data

config文件夹

1
2
3
4
docker cp elasticsearch:/usr/share/elasticsearch/config .

# 修改上面的文件,添加挂载
-v $HOME/config:/usr/share/elasticsearch/config

创建elasticsearch.yml文件

1
2
3
4
cluster.name: "docker-cluster"
network.host: 0.0.0.0
reindex.remote.whitelist: "localhost:*"
xpack.security.enabled: true

部署kibana

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
NAME=kibana
HOME=$(pwd)

docker stop $NAME
docker rm $NAME
docker run --name $NAME -d \
-p 9068:5601 \
--net docker_default \
-e ELASTICSEARCH_URL=http://elasticsearch:9200 \
-v $HOME/kibana.yml:/usr/share/kibana/config/kibana.yml:ro \
kibana:8.15.0

创建kibana.yml文件

1
2
3
4
5
6
server.host: "0.0.0.0"
server.shutdownTimeout: "15s"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
monitoring.ui.container.elasticsearch.enabled: true

elasticsearch.serviceAccountToken: "AAEAAWVsYXN0aWMva2liYW5hL2tpYmFuYS10b2tlbjpabkJMVGlIdlFlcUloRFpnRmV1WEld"

注意检查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
2
3
4
5
6
7
8
9
10
11
12
13
14
docker exec -it elasticsearch bash

bin/elasticsearch-reset-password -u elastic
# 会输出密码
2e_+OkG2Zt=F69qygLYd

#测试密码
curl -u elastic:2e_+OkG2Zt=F69qygLYd http://localhost:9200

bin/elasticsearch-service-tokens create elastic/kibana kibana-token

# 响应如下
SERVICE_TOKEN elastic/kibana/kibana-token = AAEAAWVsYXN0aWMva2liYW5hL2tpYmFuYS10b2tlbjpabkJMVGlIdlFlcUloRFpnRmV1WEld
将这个token配置在kibana.yml中

token持久化

Elasticsearch 支持将敏感信息存储在 elasticsearch-keystore 中,保证这些信息在重启后不会丢失。可以通过以下步骤将 serviceAccountToken 配置为一个持久化的密钥:

Docker 中,elasticsearch-keystore 文件通常存储在容器内部的 config 目录下

1
2
3
4
docker cp elasticsearch:/usr/share/elasticsearch/config .

# 修改原来docker文件,挂载目录
-v $HOME/config:/usr/share/elasticsearch/config \

在 Elasticsearch 中创建密钥库条目

在 Elasticsearch 的主目录下,执行以下命令将服务账号令牌添加到密钥库中:

1
2
3
4
./bin/elasticsearch-keystore add elasticsearch.serviceAccountToken

# 会生成 elasticsearch.keystore文件
# 注意文件权限

然后系统会提示你输入刚生成的 token,将该 token 粘贴到命令行中。此时 token 将永久存储在 Elasticsearch 的密钥库中,并且在重启后不会丢失。

可能错误

错误提示

如果kibana.yml直接配置用户名为elastic

1
2
elasticsearch.username: "elastic"
elasticsearch.password: "2e_+OkG2Zt=F69qygLYd"

会提示错误

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

参考文档

service-accounts-tokens

配置kibana