0%

Elastic Stack 搭建心得

介绍

各部分功能

ElasticSearch

elasticsearch是Elastic Stack的核心,它是一个分布式、RESTful 风格的搜索和数据分析引擎,能够集中存储并快速搜索大量的数据。它不仅包括了全文搜索功能,还可以进行以下工作:

  • 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
  • 实时分析的分布式搜索引擎。
  • 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。

Logstash

Logstash 能够动态地采集、转换和传输数据,不受格式或复杂度的影响,大致可分为输入、过滤器、输出三块功能。

  • 输入
    • 数据往往以各种各样的形式,或分散或集中地存在于很多系统中。Logstash支持各种输入选择,可以在同一时间从众多常用来源捕捉事件。能够以连续的流式传输方式,轻松地从您的日志、指标、Web 应用、数据存储以及各种云主机中采集数据。
  • 过滤器
    • 数据从源传输到存储库的过程中,Logstash 过滤器能够解析各个事件,识别已命名的字段以构建结构,并将它们转换成通用格式,以便更轻松、更快速地分析和实现商业价值。
  • 输出
    • 尽管Elasticsearch是首选输出方向,能够为我们的搜索和分析带来无限可能,但它并非唯一选择。Logstash提供众多输出选择,可以将数据发送到您要指定的地方,并且能够灵活地解锁众多下游用例。

Kibana

一张图表胜过千万行日志。Kibana可以对日志数据做多种需求的可视化,界面漂亮,功能强大。

Filebeat

由于Logstash体量较大,一般使用Filebeat作为日志采集的客户端,转发和汇总日志信息。当将数据发送到 Logstash 或 Elasticsearch 时,Filebeat 使用背压敏感协议,以应对更多的数据量。如果 Logstash 正在忙于处理数据,则会告诉 Filebeat 减慢读取速度。一旦拥堵得到解决,Filebeat 就会恢复到原来的步伐并继续传输数据。

架构

一般架构

beats作为采集日志的客户端安装在各处,通过接口上报数据给Logstash做过滤等处理。Logstash将数据上报给ElasticSearch做索引和存储,Kibana再从ElasticSearch检索数据。

生产环境基本架构

根据业务日志量大小可配置缓存放置采集的日志,再从缓存中消化处理日志。

生产环境高级架构

  • 热数据:当日数据,有读有写,频繁读取
  • 温数据:2 ~ 7 日数据,偶尔读取
  • 冷数据:8 ~ 30 日数据,极少读取

ELKB安装(CentOS环境)

下载相应的rpm包,使用命令 sudo rpm -ivh kibana-7.3.1-x86_64.rpm 安装相应的包。
注意elasticsearch以及logstash需要java环境,sudo yum install java-1.8.0-openjdk即可安装java环境。

Kibana配置

1
sudo vim /etc/kibana/kibana.yml
1
2
3
4
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]
kibana.index: ".kibana"

界面上的Logs模块,需要添加记录数据的indices才能看到数据

启动Kibana服务并设置开机启动

1
2
sudo systemctl start kibana.service
sudo systemctl enable kibana.service

ElasticSearch配置

sudo vim /etc/elasticsearch/elasticsearch.yml

1
2
3
4
5
6
7
cluster-name: my-application
node.name: node-1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["localhost"]
1
2
sudo systemctl start elasticsearch.service
sudo systemctl enable elasticsearch.service

检验是否启动

1
curl localhost:9200
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"name" : "node-1",
"cluster_name" : "my-application",
"cluster_uuid" : "EER91TcXQQ6lvfZZEV7EFg",
"version" : {
"number" : "7.3.1",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "4749ba6",
"build_date" : "2019-08-19T20:19:25.651794Z",
"build_snapshot" : false,
"lucene_version" : "8.1.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}

Filebeat 系统日志配置

sudo vim /etc/filebeat/filebeat.yml

1
2
3
4
5
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["localhost:9200"]
setup.kibana:
host: "localhost:5601"

下面是一个收集系统日志的例子,使用命令

1
sudo filebeat modules enable system

启用自带的系统日志配置,这时 /etc/filebeat/modules.d/system.yml.disabled 自动变为 /etc/filebeat/modules.d/system.yml

1
2
sudo filebeat setup
sudo systemctl restart filebeat.service

Filebeat 项目日志配置

假设项目在Ubuntu服务器上,下载安装包到该服务器上后使用

1
sudo dpkg -i filebeat-7.3.1-amd64.deb

安装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
24
25
26
27
- type: log
enabled: true
paths:
- /var/log/supervisor/allinc*.log
tags: ["allinc"]
fields:
index: "allinc"

- type: log
enabled: true
paths:
- /var/log/supervisor/caco*.log
tags: ["caco"]
fields:
index: "caco"

multiline.pattern: ^\[
multiline.negate: true
multiline.match: after

#output.elasticsearch:
# Array of hosts to connect to.
#hosts: ["10.66.185.238:9200"]

output.logstash:
# The Logstash hosts
hosts: ["10.66.185.238:5044"]

如不需要host_metadata和cloud_metadata等数据,把下面的这部分配置注释掉,最后存下来的数据也会大大减少

1
2
3
#processors:
# - add_host_metadata: ~
# - add_cloud_metadata: ~

如上配置所示,Filebeat 收集了 /var/log/supervisor/ 下面所有 allinc 开头以及 caco 开头的日志,并设置不同的标签以及索引名称。我们使用这个索引名称在 Logstash 中对不同来源的日志设置不同的索引便于管理。

Logstash接收Filebeat的输入

1
sudo vim /etc/logstash/conf.d/test.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
input {
beats {
port => 5044
}
}

output {
elasticsearch {
hosts => "localhost:9200"
manage_template => false
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{[fields][index]}-%{+YYYY.MM.dd}"
}
}

其中重要的是使用了 %{[fields][index]} 这个 filebeat 传过来的值做索引,区分了来源不同的日志文件。

效果展示

根据 tags 搜索不同项目的日志

自带的监控及展示

Todo

  • 使用 Nginx 做请求转发
  • 使用 Index Lifecycle Management ( ILM ) 策略管理索引的生命周期,减少磁盘空间使用,减少搜索规模
  • 使用 Logstash 过滤出需要的信息,根据需求对数据做转换

Python日志规范

  1. 开发环境中:看到具体详细的日志信息来定位问题;生产环境,只需要异常、错误等级的日志信息。

  2. 输出日志的时机

    1. 系统启动参数、环境变量
    2. 异常捕获
    3. 函数获得期望之外的结果时
    4. 关键操作