Skip to content

Elasticsearch基础概念

什么是 Elasticsearch?

Elasticsearch 是一种分布式文档存储。Elasticsearch 不用列数据行存储信息,而是存储已序列化为 JSON 文档的复杂数据结构。当集群中有多个 Elasticsearch 节点时,存储的文档将分布在集群中,且可以从任何节点直接访问。

当一个文档被存储时,它会被索引并且在接近实时的1秒钟内被完全可搜索。Elasticsearch 使用一种称之为倒排索引的数据结构,支持非常快的全文搜索。倒排索引列出任何文档中出现的唯一单词,并标识每个单词出现的所有文档。

索引可被认作一种文档的优化集合,且每个文档都是字段的集合,字段是包含你数据的键值对。默认情况下,Elasticsearch 索引每个字段中的所有数据,且每个被索引的字段有一个专用的优化数据结构。例如,文本字段被存储在倒排索引中,数字和地理字段存储在 BKD 树 中。使用每个字段的数据结构来聚集和返回搜索结果是让 Elasticsearch 如此快的原因。

Elasticsearch 也具有无模式能力,这意味着文档无需明确地指定如何处理可能出现中文档中的每个不同的字段,就可以被索引。当启用动态映射后,Elasticsearch 自动检测和向索引中添加新的字段。这个默认行为使索引和浏览你的数据更容易——只需开始索引文档,Elasticsearch 会自动检测和映射布尔值、浮点值和整数值、日期以及字符串到合适的 Elasticsearch 数据类型。

最终,然而你比 Elasticsearch 更了解你的数据以及你想如何使用它们。你能定义控制动态映射规则,而且明确的定义映射以完全控制字段如何存储和索引。

定义你自己的映射使用你能够:

  • 区分全文字符串字段和精确值字符串字段
  • 执行特定语言的文本分析
  • 为部分匹配优化字段
  • 使用自定义的日期格式
  • 使用无法自动检测的数据类型,如 geo_point和 geo_shape 为不同的目的以不同的方式索引相同的字段,通常是有用的。例如,你可能想索引一个字符串字段,既作为全文搜索的文本字段,也作为用于排序和聚合你的数据的关键字段。或者,你可以选择使用多个语言分析器,用来处理包含用户输入的字符串字段的内容。

用于索引期间的全文字段的分析链,也被用于搜索时。当你查询一个全文字段时,在索引中查询词语(term)之前,这个查询文本将经历相同的分析。

ElasticSearch整体结构

ElasticSearch整体结构

  • 一个 ES Index 在集群模式下,有多个 Node (节点)组成。每个节点就是 ES 的Instance (实例)。
  • 每个节点上会有多个 shard (分片), P1 P2 是主分片, R1 R2 是副本分片
  • 每个分片上对应着就是一个 Lucene Index(底层索引文件)
  • Lucene Index 是一个统称
    • 由多个 Segment (段文件,就是倒排索引)组成。每个段文件存储着就是 Doc 文档。
    • commit point记录了所有 segments 的信息

Elastic Stack生态

Beats + Logstash + ElasticSearch + Kibana

ELK生态

这张图展示了ELK生态以及基于ELK的场景(最上方)

Kibana

Kibana实现数据可视化,其作用就是在ElasticSearch中进行民航。Kibana能够以图表的形式呈现数据,并且具有可扩展的用户界面,可以全方位的配置和管理ElasticSearch。

Kibana最早的时候是基于Logstash创建的工具,后被Elastic公司在2013年收购。

1)Kibana可以提供各种可视化的图表;

2)可以通过机器学习的技术,对异常情况进行检测,用于提前发现可疑问题;

Beats

Beats是一个面向轻量型采集器的平台,这些采集器可以从边缘机器向Logstash、ElasticSearch发送数据,它是由Go语言进行开发的,运行效率方面比较快。从下图中可以看出,不同Beats的套件是针对不同的数据源。 Beats]

Logstash

Logstash是动态数据收集管道,拥有可扩展的插件生态系统,支持从不同来源采集数据,转换数据,并将数据发送到不同的存储库中。其能够与ElasticSearch产生强大的协同作用,后被Elastic公司在2013年收购。

它具有如下特性:

1)实时解析和转换数据;

2)可扩展,具有200多个插件;

3)可靠性、安全性。Logstash会通过持久化队列来保证至少将运行中的事件送达一次,同时将数据进行传输加密;

4)监控;

Beats结合Logstash带来的优势

(1)水平可扩展性,高可用性和可变负载处理:Beats和Logstash可以实现节点之间的负载均衡,多个Logstash可以实现Logstash的高可用

(2)消息持久性与至少一次交付保证:使用Beats或Winlogbeat进行日志收集时,可以保证至少一次交付。从Filebeat或Winlogbeat到Logstash以及从Logstash到Elasticsearch的两种通信协议都是同步的,并且支持确认。Logstash持久队列提供跨节点故障的保护。对于Logstash中的磁盘级弹性,确保磁盘冗余非常重要。

(3)具有身份验证和有线加密的端到端安全传输:从Beats到Logstash以及从 Logstash到Elasticsearch的传输都可以使用加密方式传递 。与Elasticsearch进行通讯时,有很多安全选项,包括基本身份验证,TLS,PKI,LDAP,AD和其他自定义领域

启动并运行 Elasticsearch

sh
export ELASTIC_PASSWORD="<ES_PASSWORD>"  # password for "elastic" username
docker network create elastic-net
docker run -p 127.0.0.1:9200:9200 -d --name elasticsearch --network elastic-net \
-e ELASTIC_PASSWORD=$ELASTIC_PASSWORD \
-e "discovery.type=single-node" \
-e "xpack.security.http.ssl.enabled=false" \
-e "xpack.license.self_generated.type=trial" \
docker.elastic.co/elasticsearch/elasticsearch:{version}

加入跨域配置

sh
# 进入 docker 容器内部

docker exec -it es /bin/bash

# 打开配置文件

vim config/elasticsearch.yml

# 加入跨域配置

http.cors.enabled: true

http.cors.allow-origin: "*"

安装分词器

sh
docker exec -it es /bin/bash
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.3.2/elasticsearch-analysis-ik-7.3.2.zip

# 重启 ES
docker restart es

粤ICP备20009776号