1:什么是 ELK
ELK是由一家elastic公司开发的三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。三个项目各有不同的功能,之后又增加了许多新项目, 于是 从5.X版本后改名为Elastic Stack
Elastic Stack 是一套适用于数据采集、扩充、存储、分析和可视化的免费开源工具。人们通常将 Elastic Stack 称为 ELK Stack(代指 Elasticsearch、Logstash 和 Kibana),目前 Elastic Stack 包括一系列丰富的轻量型数据采集代理,这些代理统称为 Beats(filebeat,其不能格式化数据,只能以数据流的方式处理数据),可用来向 Elasticsearch 发送数据。
Elasticsearch 是一个基于json的分布式、实时的全文搜索,存储库和分析引擎。
Logstash 是服务器端数据处理的管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如Elasticsearch 等存储库中;缺点:过于沉重,吃内存。
Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化,辅助分析和搜索。
ELK 版本演进: 0.X,1.X,2,X,5.X,6,X,7.X,8.X ....
官网: https://www.elastic.co/
ELK官方介绍:https://www.elastic.co/cn/what-is/elk-stack
ELK 下载链接:https://www.elastic.co/cn/downloads/
ELK 说明: https://www.elastic.co/guide/cn/index.html
ELK 权威指南: https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
2:ELK stack的主要优点:
功能强大:Elasticsearch是实时全文索引,具有强大的搜索功能
配置相对简单:Elasticsearch 全部基于 JSON,Logstash使用模块化配置,Kibana的配置都比较简单。
检索性能高效:基于优秀的设计,每次查询可以实时响应,即使百亿级数据的查询也能达到秒级响应。
集群线性扩展:Elasticsearch 和 Logstash都可以灵活线性扩展
前端操作方便:Kibana提供了比较美观UI前端,操作也比较简单
官方下载 下载 Elastic 产品 | Elastic
EFK 由ElasticSearch、Fluentd和Kiabana三个开源工具组成。Fluentd是一个实时开源的数据收集器,和logstash功能相似,但比logstash轻量,这三款开源工具的组合为日志数据提供了分布式的实时搜集与分析的监控系统。
Fluentd官网和文档:
Fluentd | Open Source Data Collector | Unified Logging Layer
Introduction | 1.0 | Fluentd
3:Elasticsearch 介绍
Elasticsearch:官方分布式搜索和分析引擎 | Elastic
Elasticsearch 是一个分布式的免费开源搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。
Elasticsearch 在 Apache Lucene 的基础上开发而成,由Elasticsearch N.V.(即现在的 Elastic)于 2010 年首次发布。Elasticsearch 以其简单的 REST 风格API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件
Elasticsearch 支持数据的实时全文搜索搜索、支持分布式和高可用、提供API接口,可以处理大规模的各种日志数据的处理,比如: Nginx、Tomcat、系统日志等功能。
Elasticsearch 基于 Java 语言开发,利用全文搜索引擎 Apache Lucene 实现
4.为何使用 Elasticsearch?
Elasticsearch 很快。由于 Elasticsearch 是在 Lucene 基础上构建而成的,所以在全文本搜索方面表现十分出色。Elasticsearch 同时还是一个近实时的搜索平台,这意味着从文档索引操作到文档变为可搜索状态之间的延时很短,一般只有一秒。因此,Elasticsearch 非常适用于对时间有严苛要求的用例,例如安全分析和基础设施监测。
Elasticsearch 具有分布式的本质特征。Elasticsearch 中存储的文档分布在不同的容器中,这些容器称为分片,可以进行复制以提供数据冗余副本,以防发生硬件故障。Elasticsearch 的分布式特性使得它可以扩展至数百台(甚至数千台)服务器,并处理 PB 量级的数据。
Elasticsearch 包含一系列广泛的功能。除了速度、可扩展性和弹性等优势以外,Elasticsearch 还有大量强大的内置功能(例如数据汇总和索引生命周期管理),可以方便用户更加高效地存储和搜索数据。
Elastic Stack 简化了数据采集、可视化和报告过程。通过与 Beats 和 Logstash 进行集成,用户能够在向 Elasticsearch 中索引数据之前轻松地处理数据。同时,Kibana 不仅可针对 Elasticsearch数据提供实时可视化,同时还提供 UI 以便用户快速访问应用程序性能监测 (APM)、日志和基础设施指标等数据。
Elasticsearch 在速度和可扩展性方面都表现出色,而且还能够索引多种类型的内容,可用于多种场景:
应用程序搜索
网站搜索
企业搜索
日志处理和分析
基础设施指标和容器监测
应用程序性能监测
地理空间数据分析和可视化
安全分析
业务分析
①:原理
原始数据会从多个来源(包括日志、系统指标和网络应用程序)输入到 Elasticsearch 中。数据采集指在Elasticsearch 中进行索引之前解析、标准化并充实这些原始数据的过程。这些数据在 Elasticsearch 中索引完成之后,用户便可针对他们的数据运行复杂的查询,并使用聚合来检索自身数据的复杂汇总。在Kibana 中,用户可以基于自己的数据创建强大的可视化,分享仪表板,并对 Elastic Stack 进行管理。
Elasticsearch 索引指相互关联的文档集合。Elasticsearch 会以 JSON 文档的形式存储数据。每个文档都会在一组键(字段或属性的名称)和它们对应的值(字符串、数字、布尔值、日期、数组、地理位置或其他类型的数据)之间建立联系。
Elasticsearch 使用的是一种名为倒排索引的数据结构,这一结构的设计可以允许十分快速地进行全文本搜索。倒排索引会列出在所有文档中出现的每个特有词汇,并且可以找到包含每个词汇的全部文档。在索引过程中,Elasticsearch 会存储文档并构建倒排索引,这样用户便可以近实时地对文档数据进行搜索。索引过程是在索引 API 中启动的,通过此 API 您既可向特定索引中添加 JSON 文档,也可更改特定索引中的 JSON 文档。
②:基本概念
Near Realtime(NRT) 几乎实时
Elasticsearch是一个几乎实时的搜索平台。意思是,从索引一个文档到这个文档可被搜索只需要一点点的延迟,这个时间一般为毫秒级。
Cluster 集群
群集是一个或多个节点(服务器)的集合, 这些节点共同保存整个数据,并在所有节点上提供联合索引和搜索功能。一个集群由一个唯一集群ID确定,并指定一个集群名(默认为“elasticsearch”)。该集群名非常重要,因为节点可以通过这个集群名加入群集,一个节点只能是群集的一部分。确保在不同的环境中不要使用相同的群集名称,否则可能会导致连接错误的群集节点。
Node节点
节点是单个服务器实例,它是群集的一部分,可以存储数据,并参与群集的索引和搜索功能。就像一个集群,节点的名称默认为一个随机的通用唯一标识符(UUID),确定在启动时分配给该节点。如果不希望默认,可以定义任何节点名。这个名字对管理很重要,目的是要确定网络服务器对应于ElasticSearch群集节点。
Document 文档
文档是可以被索引的信息的基本单位。例如,您可以为单个客户提供一个文档,单个产品提供另一个文档,以及单个订单提供另一个文档。本文件的表示形式为JSON(JavaScript Object Notation)格式,这是一种非常普遍的互联网数据交换格式。在索引/类型中,您可以存储尽可能多的文档。请注意,尽管文档物理驻留在索引中,文档实际上必须索引或分配到索引中的类型。
Shards & Replicas 分片与副本
索引可以存储大量的数据,这些数据可能超过单个节点的硬件限制。例如,十亿个文件占用磁盘空间1TB的单指标可能不适合对单个节点的磁盘, 或者仅从单个节点的搜索请求服务可能太慢,为了解决这一问题,Elasticsearch提供细分指标分成多个块称为分片的能力。当创建一个索引,可以简单地定义想要的分片数量(老版本默认分5片,新版本默认分1片一副本)。每个分片本身是一个全功能的、独立的“指数”,可以托管在集群中的任何节点。
Shards分片的重要性主要体现在以下两个特征:
分片允许您水平拆分或缩放内容的大小
分片允许你分配和并行操作的碎片(可能在多个节点上)从而提高性能/吞吐量
这个机制中的碎片是分布式的以及其文件汇总到搜索请求是完全由ElasticSearch管理,对用户来说是透明的。
在同一个集群网络或云环境上,故障是任何时候都会出现的,拥有一个故障转移机制以防分片和结点因为某些原因离线或消失是非常有用的,并且被强烈推荐。为此,Elasticsearch允许你创建一个或多个拷贝,索引分片进入所谓的副本或称作复制品的分片,简称Replicas。
Replicas的重要性主要体现在以下两个特征:
副本为分片或节点失败提供了高可用性。为此,需要注意的是,一个副本的分片不会分配在同一个节点作为原始的或主分片,副本是从主分片那里复制过来的。
副本允许用户扩展你的搜索量或吞吐量,因为搜索可以在所有副本上并行执行。
相关概念在关系型数据库和ElasticSearch中的对应关系
详细说明
索引库(indices) indices是index的复数,代表许多的索引,
类型(type)类型是模拟mysql中的table概念,一个索引库下可以有不同类型的索引,比如商品索引,订单索引,其数据格式不同。不过这会导致索引库混乱,因此未来版本中会移除这个概念
文档(document) 存入索引库原始的数据。比如每一条商品信息,就是一个文档
字段(field) 文档中的属性
详细架构
5.Logstash
https://www.elastic.co/cn/what-is/elasticsearch
Logstash 是 Elastic Stack 的核心产品之一,可用来对数据进行聚合和处理,并将数据发送到Elasticsearch。Logstash 是一个基于Java实现的开源的服务器端数据处理管道,允许您在将数据索引到Elasticsearch 之前同时从多个来源采集数据,并对数据进行过滤和转换。其支持单线程,但是可以用特殊手段实现多线程。
可以通过插件实现日志收集和转发,支持日志过滤,支持普通log、自定义json格式的日志解析。
6.Kibana
Kibana 是一款适用于 Elasticsearch 的基于Javascript语言实现的数据可视化和管理工具,可以提供实时的直方图、线形图、饼状图和地图。Kibana 同时还包括诸如 Canvas 和 Elastic Maps 等高级应用程序;
Canvas 允许用户基于自身数据创建定制的动态信息图表,而 Elastic Maps可以做PPT, 则可用来对地理空间数据进行可视化。
官方文档 https://www.elastic.co/cn/what-is/kibana
主要是通过接口调用elasticsearch的数据,并进行前端数据可视化的展现。
Kibana 与 Elasticsearch 和更广意义上的 Elastic Stack 紧密的集成在一起,这一点使其成为支持以下场景的理想选择:
搜索、查看并可视化 Elasticsearch 中所索引的数据,并通过创建柱状图、饼图、表格、直方图和地图对数据进行分析。仪表板视图能将这些可视化元素组织到一起,然后通过浏览器进行分享,以提供对海量数据的实时分析视图,所支持的用例如下:
1. 日志处理和分析
2. 基础设施指标和容器监测
3. 应用程序性能监测 (APM)
4. 地理空间数据分析和可视化
5. 安全分析
6. 业务分析
7.ELK 应用场景
运维主要应用场景:
将分布在不同主机的日志统一收集,并进行转换,通过集中的WebUI进行查询和管理,通过查看汇总的日志,找到故障的根本原因
Web 展示和报表功能
实现安全和事件等管理
大数据运维主要应用场景:
查询聚合, 大屏分析
预测告警, 网络指标,业务指标安全指标
日志查询,问题排查,基于API可以实现故障恢复和自愈
用户行为,性能,业务分析
8.完整的ELK运行架构(完整版)
二.Elasticsearch 部署和管理
①Elasticsearch 是一个分布式的免费开源搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据
Elasticsearch 基于 Java 语言实现
部署方式
包安装
二进制安装
Docker 部署
Ansible 批量部署
②ES支持操作系统版本和 Java 版本官方说明 https://www.elastic.co/cn/support/matrix
安装前环境初始化
CPU 2C 内存4G或更多
操作系统: Ubuntu22.04,Ubuntu22.04,Rocky8.X,Rocky9.X,Centos 7.X
操作系统盘40G
主机名设置规则为nodeX.xxhf123.top
生产环境建议准备单独的数据磁盘③优化资源限制配置
修改内核参数
内核参数 vm.max_map_count 用于限制一个进程可以拥有的VMA(虚拟内存区域)的数量
使用默认系统配置,二进制安装时会提示下面错误,包安装会自动修改此配置
echo "vm.max_map_count = 262144" >> /etc/sysctl.conf
echo "fs.file-max = 1000000" >> /etc/sysctl.conf //最大文件距离
sysctl -p
vim /etc/security/limits.conf
* soft core unlimited
* hard core unlimited
* soft nproc 1000000
* hard nproc 1000000
* soft memlock 1000000
* hard memlock 1000000
* soft msgqueue 1000000
* hard msgqueue 1000000
安装 Java 环境 (可选)
Elasticsearch 是基于java的应用,所以依赖JDK环境
注意: 安装7.X以后版本官方建议要安装集成JDK的包,所以无需再专门安装 JDK
1.x 2.x 5.x 6.x都没有集成JDK的安装包,也就是需要自己安装java环境
7.x的安装包分为带JDK和不带JDK两种包,带JDK的包在安装时不需要再安装java,如果不带JDK的包仍然需要自己去安装java
cluster.name: ELK-Cluster 集群名称,多个node名称需要保持一致
node.name: es-node1 当前node在集群中的名称,各个node名称不能一致
path.data: /data/es-data ES数据字典
path.logs: /data/es-logs ES日志保存目录
bootstrap.memory_lock: true 服务启动的时候立即分配(锁定)足够的内存,防止数据写入swap,提高启动速度
network.host: 0.0.0.0 指定监听IP,如果绑定了错误的IP,可将此修改为指定IP
http.port: 9200 监听端口
discovery.seed_hosts: ["192.168.10.100","192.168.10.110","192.168.10.120"] 在新增节点到集群时,此处需指定至少一个已经在集群中的节点地址
cluster.initial_master_nodes: ["10.0.0.101","10.0.0.102","10.0.0.103"]
http.cors.enabled: true 是否支持跨域 默认为false
http.cors.allow-origin: "*" 若支持跨域,则支持所有域名跨域名
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 192.168.10.100
bootstrap.memory_lock: true
xpack.security.enabled: false
xpack.security.http.ssl:
enabled: false
xpack.security.transport.ssl:
enabled: false
discovery.seed_hosts: ["192.168.10.100"]
cluster.initial_master_nodes: ["192.168.10.100"]
http.cors.enabled: true
http.cors.allow-origin: "*"
【注】:内存锁若在内存不足仍需要勉强启动的时候,可设置为false,或者更改UNIT单元文件即可。
设置主ES节点的JVM内存优化,注意:建议设置为物理内存的一半
ES单点搭建完毕后在浏览器内进行访问 验证结果
http://192.168.10.100:9200
http://192.168.10.100:9200/_cat/nodes?v 节点信息查看
http://192.168.10.100:9200/_cat/indices?v 索引信息查看
curl -X POST http://192.168.10.100:9200/wang/_doc -H 'Content-Type:application/json' -d '{"name": "wang","age": 18}'
http://192.168.10.100:9200/wang/_search?q=* 索引数据查询
上述操作方法和显示不够直观,操作比较复杂,可以安装elasticsearch-head
安装方式
①:科学上网,在google应用商店安装插件即可
②:docker直接安装
③:javascript npm工具包安装
设置ES集群
在ES从节点上进行优化资源限制配置,修改内核参数,修改JVM内存优化,过程同上主节点
设置从ES主配置文件
三、Elasticsearch 集群工作原理
1:ES的节点有三种
Master 节点
ES集群中只有一个 Master 节点,用于控制整个集群的操作
Master 节点负责增删索引,增删节点,shard分片的重新分配
Master 主要维护Cluster State,包括节点名称,节点连接地址,索引名称和配置认证等
Master 接受集群状态的变化并推送给所有节点,集群中各节点都有一份完整的集群状态信息,都由master node负责维护
Master 节点不需要涉及到文档级别的变更和搜索等操作协调创建索引请求或查询请求,将请求分发到相关的node上。
当Cluster State有新数据产生后, Master 会将数据同步给其他 Node 节点
Master节点通过超过一半的节点投票选举产生的
可以设置node.master: true 指定为是否参与Master节点选举, 默认true
Data 节点
存储数据的节点即为 data 节点
当创建索引后,索引创建的数据会存储至某个数据节点
Data 节点消耗内存和磁盘IO的性能比较大
配置node.data: true, 默认为 true,即默认节点都是 data类型
Coordinating 节点(协调)
2:ES 集群分片和副本
①:分片 Shard
ES 中存储的数据可能会很大,有时会达到PB级别,基于性能和容量等原因,可以将一个索引数据分割成多个小的分片,再将每个分片分布至不同的节点,从而实现数据的分布存储,实现性能和容量的水平扩展;在读取时,可以实现多节点的并行读取,提升性能
除此之外,如果一个分片的主机宕机,也不影响其它节点分片的读取横向扩展即增加服务器,当有新的Node节点加入到集群中时,集群会动态的重新进行分配和负载;例如原来有两个Node节点,每个节点上有3个分片,即共6个分片,如果再添加一个node节点到集群中,集群会动态的将此6个分片分配到这三个节点上,最终每个节点上有两个分片。
7,X 默认每个索引只有一个分片②:副本 Replication
将一个索引分成多个分片,仍然存在数据的单点问题,可以对每一个分片进行复制生成副本,即备份,实现数据的高可用
ES的分片分为主分片(primary shard)和副本分片(复制replica shard),而且通常分布在不同节点
主分片实现数据读写,副本分片只支持读每个数据分片只有一个主分片,而副本分片可以有多个,比如;一个副本,即有一个备份
7,X 默认每个索引只有一个副本分片
ES故障后先基于集群选举然后再故障转移,但分片的数据丢失,需要副本支持。
【注】:ES7.0版本默认分片为1个,并且只有1个副本;ES6.X版本前默认分片为5个副本1个
3:ES 文档创建流程
客户端向协调节点 Node1 发送新建索引文档或者删除索引文档请求。
Node1节点使用文档的 _id 确定文档属于分片 0 。
因为分片 0 的主分片目前被分配在 Node 3 上,请求会被转发到 Node 3
Node3 在主分片上面执行创建或删除请求
Node3 执行如果成功,它将请求并行转发到 Node1 和 Node2 的副本分片上。
一旦所有的副本分片都报告成功, Node3 将向协调节点Node1 报告成功,协调节点Node1 客户端报告成功。在客户端收到响应时,文档变更已经在主分片和所有副本分片执行完成
4:ES 文档读取流程
客户端向 Node1 发送读取请求。
节点使用文档的 _id 来确定文档属于分片 0。分片 0 的副本分片存在于所有的三个节点上。
在处理读取请求时,协调结点在每次请求的时候都会通过轮询所有的副本分片来达到负载均衡。
在这种情况下,它将请求转发到 Node2 。
Node2 将文档返回给 Node1 ,然后将文档返回给客户端。
5:Kibana的安装和使用
server.port: 5601
server.host: "192.168.10.120"
server.publicBaseUrl: "http://192.168.10.120:5601"
elasticsearch.hosts: ["http://192.168.10.100:9200","http://192.168.10.110:9200"]
logging:
appenders:
file:
type: file
fileName: /var/log/kibana/kibana.log
layout:
type: json
root:
appenders:
- default
- file
pid.file: /run/kibana/kibana.pid
i18n.locale: "zh-CN"
6:索引管理和kibana内部索引视图管理
四:logstash部署和管理
五:filebeat基本操作
注意:filebeat不支持多重输出
①:标准屏幕输入输出
filebeat -c filebeat.yml -e
②:标准输入,文件输出
filebeat -c stdin.yml -e
③:文件输入,标准输出
filebeat -c file-stdout.yml -e