ELK
本文最后更新于:2023年12月5日 晚上
什么是 ELK
https://www.elastic.co/cn/what-is/elk-stack
ELK 全称 ELK Stack,它的更新换代产品叫 Elastic Stack
ELK = Elasticsearch + Logstash + Kibana
- Elasticsearch:搜索和分析引擎
- Logstash:服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中
- Kibana:让用户在 Elasticsearch 中使用图形和图表对数据进行可视化
什么是 Elasticsearch
https://www.elastic.co/cn/what-is/elasticsearch
什么是 Logstash
Logstash 是 Elastic Stack 的核心产品之一,可用来对数据进行聚合和处理,并将数据发送到 Elasticsearch。Logstash 是一个开源的服务器端数据处理管道,允许您在将数据索引到 Elasticsearch 之前同时从多个来源采集数据,并对数据进行充实和转换。
什么是 kibana
https://www.elastic.co/cn/what-is/kibana
为什么使用 ELK
ELK 组件在海量日志系统的运维中,可用于解决以下主要问题:
- 分布式日志数据统一收集,实现集中式查询和管理
- 故障排查
- 安全信息和事件管理
- 报表功能
elasticsearch
基本概念
参考博客:https://www.cnblogs.com/qdhxhz/p/11448451.html
重点理解 index 和 document 这两个概念:index(索引)类似 kafka 的 topic,oss 的 bucket,要尽量控制 index 的数量;index 中的单条数据称为 document(文档),相当于 mysql 表中的行
之前的版本中,索引和文档中间还有个 type(类型)的概念,每个索引下可以建立多个 type,document 存储时需要指定 index 和 type,因为一个 index 中的 type 并不隔离,document 不能重名,所以 type 并没有多少意义。从 7.0 版本开始,一个 index 只能建一个名为_doc 的 type,8.0.0 以后将完全取消
下面是一个 document 的源数据:
_index
:文档所属索引名称_type
:文档所属类型名_id
:doc 主键,写入时指定,如果不指定,则系统自动生成一个唯一的 UUID 值_version
:doc 版本信息,保证 doc 的变更能以正确的顺序执行,避免乱序造成的数据丢失_seq_no
:严格递增的顺序号,shard 级别严格递增,保证后写入的 doc 的_seq_no
大于先写入的 doc 的_seq_no_primary_term
:和_seq_no
一样是一个整数,每当 primary shard 发生重新分配时,比如重启,primary 选举等,_primary_term 会递增 1found
:查询的 ID 正确那么 ture, 如果 Id 不正确,就查不到数据,found 字段就是 false_source
:文档的原始 JSON 数据
apt 安装
elasticsearch 集群中 master 与 slave 的区别:
master:统计各节点状态信息、集群状态信息统计、索引的创建和删除、索引分配的管理、关闭节点等
slave:从 master 同步数据、等待机会成为 master
apt 安装
主要目录:
修改 hosts
修改配置文件 elasticsearch.yml
修改内存限制
创建数据目录并修改属主
启动
源码编译
启动总是失败,各种报错,解决不了…
安装 elasticsearch 插件
插件是为了完成不同的功能,官方提供了一些插件但大部分是收费的,另外也有一些开发爱好者提供的插件,可以实现对 elasticsearch 集群的状态监控与管理配置等功能
head 插件
在 elasticsearch 5.x 版本以后不再支持直接安装 head 插件,而是需要通过启动一个服务方式
github 地址:https://github.com/mobz/elasticsearch-head
kopf 插件
过时的插件,只支持 elasticsearc 1.x 或 2.x 的版本
cerebro 插件
新开源的 elasticsearch 集群 web 管理程序,需要 java11 或者更高版本
github 地址:https://github.com/lmenezes/cerebro
监控 elasticsearch 集群状态
如果是单节点,status 会显示 yellow,设置副本数为 0 即可解决:
或者:
zabbix 添加监控
logstash
官方参考文档:https://www.elastic.co/guide/en/logstash/current/index.html
logstash 是一个具有 3 个阶段的处理管道:输入 –> 过滤器 –> 输出
输入生成事件,过滤器修改数据(日志),输出将数据(日志)发送到其他地方
安装
logstash 依赖 java,可以自己配置 java 环境,如果不配置,logstash 会使用其自带的 openjdk
命令
-n:node name,就是节点的 hostname,例如:elk2-ljk.local
-f:从特定的文件或目录加载 logstash 配置。如果给定一个目录,该目录中的所有文件将按字典顺序合并,然后作为单个配置文件进行解析。您还可以指定通配符(globs),任何匹配的文件将按照上面描述的顺序加载
-e:从命令行加载 logstash 配置,一般不用
-t:检查配置文件是否合法,配合-f 使用,-f 指定配置文件,-t 检查
…
插件
logstash 的输入和输出都依赖插件
不同的插件使用不同的配置,但是所有输入插件都支持以下配置选项:
配置项 | 类型 | 说明 |
---|---|---|
add_field |
hash | Add a field to an event |
codec |
codec | 用于输入数据的编解码器。输入编解码器是一种方便的方法,可以在数据进入输入之前对其进行解码,而不需要在 Logstash 管道中使用单独的过滤器 |
enable_metric |
boolean | Disable or enable metric logging for this specific plugin instance by default we record all the metrics we can, but you can disable metrics collection for a specific plugin. |
id |
string | 唯一的 ID,如果没有指定,logstash 会自动生成一个,尤其是多个相同类型的插件时,强烈建议配置此项,例如有多个 file 输入,应当配置此项防止混淆 |
tags |
array | Add any number of arbitrary tags to your event. This can help with processing later. |
type |
string | 类型,例如收集 /var/log/syslog 日志,type 可以设置为 “system”;收集网站日志,type 可以设置为 “web”。 此项用的较多,一般会根据判断 type 值来进行输出或过滤 |
所有输出插件都支持以下配置选项:
配置项 | 类型 | 说明 |
---|---|---|
codec |
codec | 用于输出数据的编解码器。输出编解码器是一种方便的方法,可以在数据离开输出之前对数据进行编码,而不需要在 Logstash 管道中使用单独的过滤器 |
enable_metric |
boolean | Disable or enable metric logging for this specific plugin instance. By default we record all the metrics we can, but you can disable metrics collection for a specific plugin. |
id |
string | 唯一的 ID,如果没有指定,logstash 会自动生成一个,尤其是多个相同类型的插件时,强烈建议配置此项,例如有多个 file 输出,应当配置此项防止混淆 |
可以看到 input 和 output 插件都支持 codec 配置项,input 的 codec 根据被采集的日志文件确定,如果日志是 json 格式,则 input 插件的 codec 应当设置为 json;而 output 的 codec 根据数据库确定,如果是 elasticsearch,codec 保持默认的 rubydebug 即可,如果是 kafka,codec 应该设置为 json
input 插件
stdin
标准输入
file
日志输出到文件
Setting | 说明 | 备注 |
---|---|---|
path |
日志路径 | 必需 |
start_position |
从文件的开头或者结尾开始采集数据 | ["beginning", "end"] |
stat_interval |
日志收集的时间间隔 | 每个 input 文件都生成一个 .sincedb_xxxxx 文件,这个文件中记录了上次收集日志位置,下次从记录的位置继续收集 |
tcp
Setting | 说明 | 备注 |
---|---|---|
host |
当 mode 是server ,host 是监听的地址;当 mode 是 client ,host 是要连接的地址 |
默认0.0.0.0 |
mode |
server :监听客户端连接;client :连接到服务器; |
[“server”, “client”] |
port |
监听的端口或要连接的端口 | 必需 |
kafka
Setting | 说明 | 备注 |
---|---|---|
bootstrap_servers |
host1:port1,host2:port2 | |
topics |
要订阅的 topic 列表,默认为[“logstash”] | |
decorate_events |
是否添加一个 kafka 元数据,包含以下信息: topic、consumer_group、partition、offset、key |
布尔值 |
codec |
设置为 json |
output 插件
output
标准输出
elasticsearch
redis
Setting | 说明 | 备注 |
---|---|---|
key |
list(列表)名,或者 channel(频道)名, 至于是哪个取决于 data_type |
|
data_type |
如果data_type 为list ,将数据 push 到 list;如果 data_type 为 channel,将数据发布到 channel; |
[“list”, “channel”] |
host |
redis 主机列表,可以是 hostname 或者 ip 地址 | 数组 |
port |
redis 服务端口,默认 6379 | |
db |
数据库编号,默认 0 | |
password |
身份认证,默认不认证 | 不建议设置密码 |
写个脚本统计 redis 的 key 数量,使用 zabbix-agent 定时执行脚本,一旦 key 超过某个数量,就增加 logstash 数量,从而加快从 redis 中取数据的速度
kafka
Setting | 说明 | 备注 |
---|---|---|
bootstrap_servers |
host1:port1,host2:port2 | |
topic_id |
主题 | |
codec |
设置为 json |
|
batch_size |
The producer will attempt to batch records together into fewer requests whenever multiple records are being sent to the same partition. This helps performance on both the client and the server. This configuration controls the default batch size in bytes. | 默认 16384 |
codec 插件
multiline
合并多行,比如 java 的一个报错,日志中会记录多行,为了方便查看,应该将一个报错的多行日志合并成一行
Setting | 说明 | 备注 |
---|---|---|
pattern | 正则匹配 | 必需 |
negate | 匹配成功或失败,就开始多行合并 | 布尔值 |
what | 如果模式匹配,向前多行合并,还是向后多行合并 | 必需,["previous", "next"] |
配置
配置:https://www.elastic.co/guide/en/logstash/current/configuration.html
配置文件结构:https://www.elastic.co/guide/en/logstash/current/configuration-file-structure.html
配置文件语法:https://www.elastic.co/guide/en/logstash/current/event-dependent-configuration.html
使用环境变量:https://www.elastic.co/guide/en/logstash/current/environment-variables.html
配置文件示例:https://www.elastic.co/guide/en/logstash/current/config-examples.html
数据发送到 es:https://www.elastic.co/guide/en/logstash/current/connecting-to-cloud.html
多配置文件
https://www.elastic.co/guide/en/logstash/current/multiple-pipelines.html
https://elasticstack.blog.csdn.net/article/details/100995868
示例:
效果:
测试
标准输入输出
输出到文件
时间格式参考:http://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html
输出到 elasticsearch
elasticsearch 输出插件至少指定 hosts
和index
,hosts
可以指定 hosts 列表
kibana
开源的数据分析和可视化平台,可以 对 Elasticsearch 索引中的数据进行搜索、查看、交互操作,可以很方便的利用图表、表格及地图对数据进行多元化的分析和呈现
安装
因为笔记本的性能问题,将 elasticsearch 集群缩减为 elasticsearch 单节点,这导致 kibana 无法连接到 elasticsearch,启动失败。解决办法:将 elasticsearch 的数据目录清空,然后重启
查看状态
kibana 画图功能详解
添加一个仪表盘
Beats
https://www.elastic.co/cn/beats/
logstash 基于 java,资源消耗很大,容器等场景,大多跑的都是轻量级的服务,没有必要安装 logstash,就可以用 beats 代替 logstash 做日志收集,beats 基于 go,性能更强,资源占用更低,但是功能也相对简单
beats 是一个系列,具体包含以下类型的采集器:
- filebeat:轻量型日志采集器,最常用
- metricbeat:轻量型指标采集器,获取系统级的 CPU 使用率、内存、文件系统、磁盘 IO 和网络 IO 统计数据,还可针对系统上的每个进程获得与 top 命令类似的统计数据
- heartbeat:面向运行状态监测的轻量型采集器,通过 ICMP、TCP 和 HTTP 进行 ping 检测主机、网站可用性
- packetbeat:轻量型网络数据采集器
- winlogbeat:轻量型 Windows 事件日志采集器
- auditbeat:轻量型审计日志采集器
- functionbeat:面向云端数据的无服务器采集器
除了 filebeat,其他的 beat 可以用 zabbix 替代
filebeat
官方文档:https://www.elastic.co/guide/en/beats/filebeat/current/index.html
配置:只需要配置 input 和 output
示例: