简介
ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。
Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往 Elasticsearch 上去。
Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
Filebeat是隶属于Beats:(Beats 包括四个工具)
- Packetbeat(搜集网络流量数据)
- Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)
- Filebeat(搜集文件数据)
- Winlogbeat(搜集 Windows 事件日志数据)
ELK架构准备
ELK 常用架构
- 架构1(最为简单) Logstash -> Elasticsearch -> Kibana
- 架构2(使用Beats作为日志收集器) Beats -> Logstash -> Elasticsearch -> Kibana
- 架构3(引入消息队列) Beats -> Logstash -> Kafka -> Logstash -> Elasticsearch -> Kibana
环境版本信息
- 操作系统版本: Ubuntu 7.5.0-3ubuntu1~18.04
- Elasticsearch版本:8.8.0
- Logstash版本:8.8.1
- Kibana版本:8.8.1
- Filebeat版本:8.8.1
初级架构概述
- Nginx服务器产生的访问日志会通过Filebeat传送到Logstash。
- 在Logstash的配置文件中定义对采集到的日志的操作,最后归档到ES。
- 用户通过浏览器进入Kibana,读取ES里面的数据。
- 服务间内外网通过 FRP 服务做内网穿透
实现目的
- Nginx、Filebeat、Logstash、ES、Kibana各个服务都正常运行。
- 各个服务都能按照最基本的需求完成既定任务。
- 在Kibana可以正常访问和检索日志。
ELK 搭建步骤
Filebeat、Logstash、ES、Kibana各个服务安装和关联
ElasticSearch 服务搭建
ElasticSearch 主要用于数据存储和优化数据的搜索,这普遍不需要依赖其他的服务;所以搭建架构一般选择从这样的相对独立的服务开始(mysql , redis 也是如此)
安装 ElasticSearch
官网文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/deb.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
# 方法1:使用APT在线安装
# Import the ElasticSearch PGP Keyedit
# 下载安装 ElasticSearch 仓库的PGP key:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
sudo apt-get install apt-transport-https
# 把 ElasticSearch 的仓库地址信息加入到 apt 工具的配置文件中
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
# 安装 Elasticsearch (8.8版本)
sudo apt-get update && sudo apt-get install elasticsearch
# 方法2:源码安装
# 下载源码包
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.8.0-amd64.deb
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.8.0-amd64.deb.sha512
# 校验文件完整性
shasum -a 512 -c elasticsearch-8.8.0-amd64.deb.sha512
# 安装
sudo dpkg -i elasticsearch-8.8.0-amd64.deb
|
配置ElasticSearch
默认的配置文件存放位置: /etc/elasticsearch
ElasticSearch 的基本配置:/etc/elasticsearch/elasticsearch.yml
ElasticSearch 的日志配置:/etc/elasticsearch/logging.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# 配置es的集群名称,默认是elasticsearch,es会自动发现在同一网段下的es
# 如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群
cluster.name: elasticsearch
# 节点名
node.name: node-1
# 设置索引数据的存储路径,默认是es根目录下的data文件夹
path.data: /data/elasticsearch
# 设置日志文件的存储路径,默认是es根目录下的logs文件夹
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
cluster.initial_master_nodes: ["node-1"]
# 关闭安全功能 (可以先关闭)
xpack.security.enable: false
|
ElasticSearch 的 jvm 配置:/etc/elasticsearch/jvm.options
1
2
3
4
5
|
## 设置默认内存 (按照实际情况调整)
## -Xms4g
## -Xmx4g
-Xms1g
-Xmx1g
|
启动 ElasticSearch
1
2
3
4
5
6
7
8
|
# start/stop/restart 操作和其他的系统服务一样操作
systemctl start elasticsearch.service
systemctl status elasticsearch.service
systemctl stop elasticsearch.service
# 设置开机启动
systemctl enable elasticsearch.service
systemctl daemon-reload
|
检查Elasticsearch运行状况
1
2
3
4
5
6
7
8
9
10
11
12
13
|
● elasticsearch.service - Elasticsearch
Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2023-06-09 14:38:54 CST; 8min ago
Docs: https://www.elastic.co
Main PID: 30665 (java)
Tasks: 98 (limit: 4915)
CGroup: /system.slice/elasticsearch.service
├─30665 /usr/share/elasticsearch/jdk/bin/java -Xms4m -Xmx64m -XX:+UseSerialGC -Dcli.name=server -Dcli.script=/usr/share/el
├─30895 /usr/share/elasticsearch/jdk/bin/java -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -
└─31039 /usr/share/elasticsearch/modules/x-pack-ml/platform/linux-x86_64/bin/controller
6月 09 14:38:30 xjr-pc systemd[1]: Starting Elasticsearch...
6月 09 14:38:54 xjr-pc systemd[1]: Started Elasticsearch.
|
1
2
3
|
root@xjr-pc:/etc/elasticsearch# lsof -i:9200
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 30895 elasticsearch 448u IPv6 18042063 0t0 TCP *:9200 (LISTEN)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
root@xjr-pc:/etc/elasticsearch# curl http://127.0.0.1:9200
{
"name" : "node-1",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "dyFeCyipTMuHZvQxh5xKiw",
"version" : {
"number" : "8.8.0",
"build_flavor" : "default",
"build_type" : "deb",
"build_hash" : "c01029875a091076ed42cdb3a41c10b1a9a5a20f",
"build_date" : "2023-05-23T17:16:07.179039820Z",
"build_snapshot" : false,
"lucene_version" : "9.6.0",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
|
安装Kibana
通过官方提供的软件包进行安装
安装过程
官网文档:https://www.elastic.co/guide/en/kibana/current/deb.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# 方法1:使用APT在线安装
# Import the Elastic PGP keyedit
# 下载安装 Kibana 仓库的PGP key:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
sudo apt-get install apt-transport-https
# 把 elastic 的仓库地址信息加入到 apt 工具的配置文件中
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
# 安装 Kibana (8.8版本)
sudo apt-get update && sudo apt-get install kibana
# 方法2:源码安装
# 下载源码包
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.8.1-amd64.deb
# 校验文件完整性
shasum -a 512 kibana-8.8.1-amd64.deb
# 安装
sudo dpkg -i kibana-8.8.1-amd64.deb
|
Kibana配置文件
Kibana的基本配置:/etc/kibana/kibana.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 默认值: 5601 Kibana 由后端服务器提供服务,该配置指定使用的端口号。
server.port: 5601
# 默认值: "localhost" 指定后端服务器的主机地址。
server.host: "0.0.0.0"
# "您的主机名" Kibana 实例对外展示的名称
server.name: "kibana"
# 上文中的elasticsearch地址
elasticsearch.hosts: "http://127.0.0.1:9200"
logging.dest: /var/log/kibana/kibana.log
# false 该值设为 true 时,记下所有事件包括系统使用信息和所有请求的日志。
logging.verbose: false
# Elasticsearch 设置了基本的权限认证,该配置项提供了用户名和密码,用于 Kibana 启动时维护索引。
# Kibana 用户仍需要 Elasticsearch 由 Kibana 服务端代理的认证。
elasticsearch.username: username
elasticsearch.password: password
|
启动Kibana
1
2
3
4
5
6
7
8
9
10
11
12
|
root@xjr-pc:/etc/kibana# systemctl start kibana.service
root@xjr-pc:/etc/kibana# systemctl status kibana.service
● kibana.service - Kibana
Loaded: loaded (/usr/lib/systemd/system/kibana.service; disabled; vendor preset: enabled)
Active: active (running) since Fri 2023-06-09 15:43:28 CST; 13s ago
Docs: https://www.elastic.co
Main PID: 15474 (node)
Tasks: 11 (limit: 4915)
CGroup: /system.slice/kibana.service
└─15474 /usr/share/kibana/bin/../node/bin/node /usr/share/kibana/bin/../src/cli/dist
6月 09 15:43:28 xjr-pc systemd[1]: Started Kibana.
|
验证Kibana
通过浏览器,访问 Kibana
Logstash服务搭建
Logstash 工作原理
**Logstash 事件处理流程: **inputs → filters → outputs
Input : 输入数据到 logstash
- File : 从文件系统的文件中读取,类似 tail -f 命令
- syslog:在514端口上监听系统日志消息,并根据RFC3164标准进行解析
- redis:从redis service中读取
- beats:从filebeat中读取
Filters:数据中间处理,对数据进行操作。
- grok:解析任意文本数据,Grok 是 Logstash 最重要的插件。它的主要作用就是将文本格式的字符串,转换成为具体的结构化的数据,配合正则表达式使用。内置120多个解析语法。【官方提供的grok表达式 , grok在线调试】
- mutate:对字段进行转换。例如对字段进行删除、替换、修改、重命名等。
- drop:丢弃一部分events不进行处理。
- clone:拷贝 event,这个过程中也可以添加或移除字段。
- geoip:添加地理信息(为前台kibana图形化展示使用)
Outputs:outputs是logstash处理管道的最末端组件
elasticsearch:可以高效的保存数据,并且能够方便和简单的进行查询。
安装 Logstash
官网文档:https://www.elastic.co/guide/en/logstash/current/installing-logstash.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
# 方法1:使用APT在线安装
# 下载安装 Logstash 仓库的PGP key:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-keyring.gpg
sudo apt-get install apt-transport-https
# 把 Logstash 的仓库地址信息加入到 apt 工具的配置文件中
echo "deb [signed-by=/usr/share/keyrings/elastic-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-8.x.list
# 安装 Logstash (8.8版本)
sudo apt-get update && sudo apt-get install logstash
# 方法2:使用 YUM 在线安装
sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
# 添加文件 /etc/yum.repos.d/logstash.repo
[logstash-8.x]
name=Elastic repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
# 安装
sudo yum install logstash
|
Logstash服务配置
- Logstash 基础配置: /etc/logstash/logstash.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# 数据存储路径,需要提前确认路径存在,并且检查权限,允许logstash用户读写
path.data: /var/lib/logstash
# 输出通道的工作workers数据量,默认cpu核心数
pipeline.workers: 2
pipeline.batch.size: 125
# 这是logstash的默认配置,在这里显式配置
path.config: /etc/logstash/conf.d/*.conf
# 该值为true时,检查配置是否有效,然后退出,默认false
config.test_and_exit: false
# 绑定主机地址,可以是ip,主机名,默认127.0.0.1
http.host: 127.0.0.1
# 服务监听端口,可以是单个端口,也可以是范围端口,默认9600-9700
http.port: 9600-9700
log.level: debug
path.logs: /var/log/logstash
|
- Logstash 管道配置:/etc/logstash/conf.d/test.conf
1
2
3
4
5
6
7
8
|
input {
stdin { }
}
output {
elasticsearch { hosts => ["127.0.0.1:9200"] }
stdout { codec => rubydebug }
}
|
启动 && 调试 Logstash
- 通过命令启动 Logstash
1
|
logstash -f /etc/logstash/conf.d/test.conf
|
- 通过stdin输入,观察logstash:
1
2
3
4
5
6
7
8
9
10
11
|
{
"host" => {
"hostname" => "xjr-pc"
},
"message" => "test",
"@timestamp" => 2023-06-09T10:41:08.567414914Z,
"@version" => "1",
"event" => {
"original" => "test"
}
}
|
- 通过 Kibana 的 Console 工具连接 Elasticsearch 库查看
业务服务器安装Filebeat
经过上面的步骤:ELK (Elasticsearch + Logstash + Kibana)已经完成了部署;但是常用的架构中,因为Logstash 需要做日志的处理 和 依赖 Java 环境才能运行,再有Logstash对性能损耗也是不低。所以往往不会直接安装到业务机器上。
在文章开始的架构选择上可以看出,我们一般会选择在业务机器上安装 Beat进行日志的传输;
Filebeat工作原理
FileBeat 主要组件:Prospector + Harvester
Harvester (收割机) : 负责读取单个文件内容。每个文件会启动一个Harvester,每个Harvester会逐行读取各个文件,并将文件内容发送到制定输出中。Harvester负责打开和关闭文件,意味在Harvester运行的时候,文件描述符处于打开状态,如果文件在收集中被重命名或者被删除,Filebeat会继续读取此文件。
Prospector(勘测者):负责管理Harvester并找到所有读取源。
1
2
3
4
|
filebeat.prospectors:
- input_type: log
paths:
- /apps/logs/*/info.log
|
Prospector会找到/apps/logs/*目录下的所有info.log文件,并为每个文件启动一个Harvester。Prospector会检查每个文件,看Harvester是否已经启动,是否需要启动,或者文件是否可以忽略。若Harvester关闭,只有在文件大小发生变化的时候Prospector才会执行检查。只能检测本地的文件。
安装FileBeat
官网文档:https://www.elastic.co/guide/en/beats/filebeat/7.13/filebeat-installation-configuration.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# 方法 1:DEB
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.8.1-amd64.deb
sudo dpkg -i filebeat-8.8.1-amd64.deb
# 方法 2:RPM
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.8.1-x86_64.rpm
sudo rpm -vi filebeat-8.8.1-x86_64.rpm
# 方法 3:Linux
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.8.1-linux-x86_64.tar.gz
tar xzvf filebeat-8.8.1-linux-x86_64.tar.gz
# 安装完成查看状态
root@xjr-pc:/www/server/src# systemctl status filebeat.service
● filebeat.service - Filebeat sends log files to Logstash or directly to Elasticsearch.
Loaded: loaded (/lib/systemd/system/filebeat.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: https://www.elastic.co/beats/filebeat
|
配置FileBeat
采集nginx access.log日志;
FileBeat基础配置:/etc/filebeat/filebeat.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# /etc/filebeat/filebeat.yml
# 配置filebeat自身的运行日志输出
logging.level: info
logging.to_files: true
logging.files:
path: /var/log/filebeat
name: filebeat
keepfiles: 7
# filebeat对日志的采集和输出配置
filebeat.inputs:
- type: log
enabled: true
paths:
- /www/wwwlogs/food.xjr2018.com.log
setup.template.settings:
index.number_of_shards: 1
output.logstash:
# 这里输入的是logstash的地址和端口,后面我们会对logstash进行联调
hosts: ["127.0.0.1:5400"]
|
ELK 联调
FileBeat 和 Logstash 之间调用
根据上面架构图展示:我们通过**FileBeat **收集日志,然后推送到 **Logstash **中,**Logstash **再把日志推送到 **ElasticSearch **中,最后 **Kibana **读取 **ElasticSearch **数据作为展示;
Logstash配置修改
- 移除前面测试使用的配置:/etc/logstash/conf.d/test.conf
- 创建新的测试配置(nginx-access-log采集配置):/etc/logstash/conf.d/nginx-food-access.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
|
input {
beats {
host => "0.0.0.0"
port => 5400 # 对应在filebeat的配置中,output到logstash的5400端口
}
}
output {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "rc_index_pattern-%{+YYYY.MM.dd}"
}
}
|
- 启动**Logstash 和 FileBeat: **
1
2
3
4
5
6
7
8
|
# 启动Logstash服务
systemctl start logstash.service
# 启动FileBeat服务
systemctl start filebeat.service
# 如果 FileBeat 启动失败可以通过 test参数 检验
filebeat test config --path.config /etc/filebeat
|
Kibana设置数据视图
- 点击页面左上角的 ≡ 图标,在弹出菜单中点击底部的 Stack Management

- 在 Data Views 中创建 index pattern

- 填写 视图名称 + 索引index 搜索范围 ;保存信息

- **完成 Index pattern 创建完成后,点击左上角的菜单栏,进入 Discover **

- 选择刚刚创建的 Data View ,输入适当时间范围;即可看到对应的日志
总结
经过前面一系列的操作,我们得到了一个ELK集群,并模拟了实际生产的场景,展示了从业务日志(nginx)产生到入库ES的过程,形成了一个日志平台的闭环。但这个只是雏形,后面我们会对这个集群不断进行优化,过程中会涉及到各个服务的配置优化和横向扩容等场景