如果你没有听说过Elastic Stack,那你一定听说过ELK,实际上ELK是三款软件的简称,分别是Elasticsearch、 Logstash、Kibana组成,在发展的过程中,又有新成员Beats的加入,所以就形成了Elastic Stack。所以说,ELK是旧的称呼,Elastic Stack是新的名字。
全系的Elastic Stack技术栈包括:
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
我们建立一个网站或应用程序,并要添加搜索功能,但是想要完成搜索工作的创建是非常困难的。我们希望搜索解决方案要运行速度快,我们希望能有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP来索引数据,我们希望我们的搜索服务器始终可用,我们希望能够从一台开始并扩展到数百台,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。因此我们利用Elasticsearch来解决所有这些问题及可能出现的更多其它问题。
ElasticSearch是Elastic Stack的核心,同时Elasticsearch 是一个分布式、RESTful风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。作为Elastic Stack的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。
Elasticsearch的发展是非常快速的,所以在ES5.0之前,ELK的各个版本都不统一,出现了版本号混乱的状态,所以从5.0开始,所有Elastic Stack中的项目全部统一版本号。(elk版本号必须要统一)
Kibana 是一款开源的数据分析和可视化平台,它是 Elastic Stack 成员之一,设计用于和 Elasticsearch 协作。您可以使用 Kibana 对 Elasticsearch 索引中的数据进行搜索、查看、交互操作。您可以很方便的利用图表、表格及地图对数据进行多元化的分析和呈现。
官网:https://www.elastic.co/cn/kibana
Beats是elastic公司开源的一款采集系统监控数据的代理agent,是在被监控服务器上以客户端形式运行的数据收集器的统称,可以直接把数据发送给Elasticsearch或者通过Logstash发送给Elasticsearch,然后进行后续的数据分析活动。Beats由如下组成:
Beats和Logstash其实都可以进行数据的采集,但是目前主流的是使用Beats进行数据采集,然后使用 Logstash进行数据的分割处理等,早期没有Beats的时候,使用的就是Logstash进行数据的采集。
Beats平台其实是一个轻量性数据采集器,通过集合多种单一用途的采集器,从成百上千台机器中向Logstash或ElasticSearch中发送数据。
通过Beats包含以下的数据采集功能
如果我们的数据不需要任何处理,那么就可以直接发送到ElasticSearch中
如果们的数据需要经过一些处理的话,那么就可以发送到Logstash中,然后处理完成后,在发送到ElasticSearch
最后在通过Kibana对我们的数据进行一系列的可视化展示
Filebeat是一个轻量级的日志采集器
当你面对成百上千、甚至成千上万的服务器、虚拟机和溶气气生成的日志时,请告别SSH吧!Filebeat将为你提供一种轻量型方法,用于转发和汇总日志与文件,让简单的事情不再繁华,关于Filebeat的记住以下两点:
用于监控、收集服务器日志文件.
流程如下:
Logstash是一个开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到最喜欢的存储库中(我们的存储库当然是ElasticSearch)
我们回到我们ElasticStack的架构图,可以看到Logstash是充当数据处理的需求的,当我们的数据需要处理的时候,会将它发送到Logstash进行处理,否则直接送到ElasticSearch中
Logstash可以处理各种各样的输入,从文档,图表中=,数据库中,然后处理完后,发送到
Logstash主要是将数据源的数据进行一行一行的处理,同时还直接过滤切割等功能。
1、2核4g或以上的服务器
2、docker
3、docker-compose
首先到docker官网查看文档(docker的安装需要centos7.x以上):https://docs.docker.com/engine/install/centos/
1、卸载旧版本的docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2、设置镜像仓库
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 换成国内阿里云的docker仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
3、安装docker引擎
sudo yum install docker-ce docker-ce-cli containerd.io
4、docker版本检查
docker version
#启动docker
service docker start
# 设置开机自启动
systemctl enable docker
找到官网地址:https://docs.docker.com/compose/install/
1、安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
2、授权
sudo chmod +x /usr/local/bin/docker-compose
docker pull logstash:7.9.3
docker pull kibana:7.9.3
docker pull elasticsearch:7.9.3
docker pull elastic/filebeat:7.9.3
1、docker-compose.yml
version: "3.9"
services:
elasticsearch:
image: elasticsearch:7.9.3
restart: always
container_name: elasticsearch
ports:
- 9200:9200
- 9300:9300
environment:
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms64m -Xmx128m
volumes:
- ./elasticsearch/data:/usr/share/elasticsearch/data
- ./elasticsearch/download:/usr/share/elasticsearch/download
kibana:
image: kibana:7.9.3
restart: always
container_name: kibana
ports:
- 5601:5601
environment:
- elasticsearch_url=elasricsearch:9200
depends_on:
- elasticsearch
filebeat:
image: elastic/filebeat:7.9.3
restart: always
container_name: filebeat
volumes:
- ./filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml
- ./filebeat/logs:/var/log/filebeat/logs
depends_on:
- elasticsearch
- kibana
需要注意的地方:
1、es设置成单节点模式
2、设置es的占用内存
3、 容器卷挂载:
1)是方便在容器外面编辑容器配置文件,还有比如es安装ik分词插件什么的
2)可以防止删除容器之后所有数据就没有(持久化)
4、容器间内部通讯:
1)docker-compose 默认会创建一个桥接模式的网络 ,这些容器间可以直接通过服务(service)名字建立通讯,而不用写ip地址
2)docker network ls 查看 网络
3)docker network inspect 网络名字查看网络配置
2、filebeat.yml
filebeat:
inputs:
- type: log
enabled: true
paths:
- /var/log/filebeat/logs/*.log
setup:
ilm:
enabled: false
template:
settings:
index:
number_of_shards: 1
number_of_replicas: 0
name: "filebeat"
pattern: "filebeat-*"
kibana:
host: "kibana:5601"
output:
# logstash:
# hosts: ["logstash:5044"]
elasticsearch:
hosts: ["elasticsearch:9200"]
index: "filebeat-%{+yyyy.MM.dd}"
docker-compose命令:
#启动服务
docker-compose up -d
#启动并编译
docker-compose up -d --build
#停止并删除容器
docker-compose down
#查看容器日志
docker-compose logs
docker logs 容器id
1、docker-compose.yml
version: "3.9"
services:
elasticsearch:
image: elasticsearch:7.9.3
restart: always
container_name: elasticsearch
ports:
- 9200:9200
- 9300:9300
environment:
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms64m -Xmx128m
volumes:
- ./elasticsearch/data:/usr/share/elasticsearch/data
- ./elasticsearch/download:/usr/share/elasticsearch/download
kibana:
image: kibana:7.9.3
restart: always
container_name: kibana
ports:
- 5601:5601
environment:
- elasticsearch_url=elasricsearch:9200
depends_on:
- elasticsearch
filebeat:
image: elastic/filebeat:7.9.3
restart: always
container_name: filebeat
volumes:
- ./filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml
- ./filebeat/logs:/var/log/filebeat/logs
depends_on:
- elasticsearch
- kibana
logstash:
image: logstash:7.9.3
restart: always
container_name: logstash
volumes:
- ./logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
- ./logstash/template.json:/etc/logstash/template.json
ports:
- "5044:5044"
- "9600:9600"
environment:
LS_JAVA_OPTS: "-Xms512m -Xmx512m"
depends_on:
- elasticsearch
2、filebeat.yml
filebeat:
inputs:
- type: log
enabled: true
paths:
- /var/log/filebeat/logs/*.log
setup:
ilm:
enabled: false
template:
settings:
index:
number_of_shards: 1
number_of_replicas: 0
name: "filebeat"
pattern: "filebeat-*"
kibana:
host: "kibana:5601"
output:
logstash:
hosts: ["logstash:5044"]
# elasticsearch:
# hosts: ["elasticsearch:9200"]
# index: "filebeat-%{+yyyy.MM.dd}"
3、logstash.conf
input {
beats {
port => 5044
}
}
filter {
grok {
pattern_definitions => {
"QUALIFIED" => "[a-zA-Z0-9$_.]+"
}
match => {
"message" => "%{TIMESTAMP_ISO8601:logdate}%{SPACE}\[%{USERNAME:logthread}\]%{SPACE}%{WORD:loglevel}%{SPACE}%{QUALIFIED:logclass:text}%{SPACE}-%{SPACE}%{GREEDYDATA:logmsg:text}"
}
}
}
output {
elasticsearch {
hosts =>["elasticsearch:9200"]
index => "logstash-%{+yyyy.MM.dd}"
template => "/etc/logstash/template.json"
template_name => "logstash"
}
}
4、template.json
{
"template": "logstash-*",
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"properties": {
"logclass": {
"type": "text"
},
"logdate": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss.SSS"
},
"loglevel": {
"type": "keyword"
},
"logthread": {
"type": "keyword"
},
"logmsg": {
"type": "text"
}
}
}
}
参考地址:https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/ecs-v1/grok-patterns
正则表达式:https://www.runoob.com/regexp/regexp-rule.html