ELK基本信息
ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。
Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。
Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
官方文档
Logstash:
https://www.elastic.co/cn/products/logstash
https://www.elastic.co/guide/en/logstash/current/index.html
Kibana:
https://www.elastic.co/cn/products/kibana
https://www.elastic.co/guide/en/kibana/current/index.html
Elasticsearch:
https://www.elastic.co/cn/products/elasticsearch
https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
elasticsearch中文社区:
https://elasticsearch.cn/
Elasticsearch
Near Realtime (NRT)
Elasticsearch是一个近乎实时的搜索平台。这意味着从索引文档到可以搜索的时间只有轻微的延迟(通常是1秒)。
Cluster
集群是一个或多个节点(服务器)的集合,它们共同保存你的整个数据,并提供跨所有节点的联合索引和搜索功能。一个集群由一个唯一的名称标识,默认这个唯一标识的名称是"elasticsearch"。这个名称很重要,因为如果节点被设置为按其名称加入集群,那么节点只能是集群的一部分。
确保不要在不同的环境中用相同的集群名称,否则可能导致节点加入到错误的集群中。例如,你可以使用"logging-dev", "logging-test", "logging-prod"分别用于开发、测试和正式集群的名字。
Node
节点是一个单独的服务器,它是集群的一部分,存储数据,并参与集群的索引和搜索功能。就像集群一样,节点由一个名称来标识,默认情况下,该名称是在启动时分配给节点的随机通用唯一标识符(UUID)。如果不想用默认的节点名,可以定义任何想要的节点名。这个名称对于管理来说很重要,因为你希望识别网络中的哪些服务器对应于你的Elasticsearch集群中的哪些节点。
一个节点可以通过配置集群名称来加入到一个特定的集群中。默认情况下,每个节点都被设置加入到一个名字叫"elasticsearch"的集群中,这就意味着如果你启动了很多个节点,并且假设它们彼此可以互相发现,那么它们将自动形成并加入到一个名为"elasticsearch"的集群中。
一个集群可以有任意数量的节点。此外,如果在你的网络上当前没有运行任何节点,那么此时启动一个节点将默认形成一个单节点的名字叫"elasticsearch"的集群。
Index
索引是具有某种相似特征的文档的集合。例如,你可以有一个顾客数据索引,产品目录索引和订单数据索引。索引有一个名称(必须是小写的)标识,该名称用于在对其中的文档执行索引、搜索、更新和删除操作时引用索引。
Document
文档是可以被索引的基本信息单元。文档用JSON表示。
Shards & Replicas
一个索引可能存储大量数据,这些数据可以超过单个节点的硬件限制。例如,一个包含10亿条文档占用1TB磁盘空间的索引可能不适合在单个节点上,或者可能太慢而不能单独处理来自单个节点的搜索请求。
为了解决这个问题,Elasticsearch提供了将你的索引细分为多个碎片(或者叫分片)的能力。在创建索引时,可以简单地定义所需的分片数量。每个分片本身就是一个功能完全独立的“索引”,可以驻留在集群中的任何节点上。
分片之所以重要,主要有两个原因:
它允许你水平地分割/扩展内容卷
它允许你跨分片(可能在多个节点上)分布和并行操作,从而提高性能和吞吐量
在一个网络/云环境中随时都有可能出现故障,强烈推荐你有一个容灾机制。Elasticsearch允许你将一个或者多个索引分片复制到其它地方,这被称之为副本。
复制之所以重要,有两个主要原因:
它提供了在一个shard/node失败是的高可用性。出于这个原因,很重要的一个点是一个副本从来不会被分配到与它复制的原始分片相同节点上。也就是说,副本是放到另外的节点上的。
它允许扩展搜索量/吞吐量,因为搜索可以在所有副本上并行执行。
总而言之,每个索引都可以分割成多个分片。索引也可以被复制零(意味着没有副本)或更多次。一旦被复制,每个索引都将具有主分片(被复制的原始分片)和副本分片(主分片的副本)。在创建索引时,可以为每个索引定义分片和副本的数量。创建索引后,您可以随时动态地更改副本的数量,但不能更改事后分片的数量。
在默认情况下,Elasticsearch中的每个索引都分配了5个主分片和1个副本,这意味着如果集群中至少有两个节点,那么索引将有5个主分片和另外5个副本分片(PS:这5个副本分片组成1个完整副本),每个索引总共有10个分片。
Kibana
Kibana是一个Web应用程序,你可以通过5601来访问它。例如:localhost:5601 或者 http://YOURDOMAIN.com:5601
当访问Kibana时,默认情况下,Discover页面加载时选择了默认索引模式。时间过滤器设置为最近15分钟,搜索查询设置为match-all(*)
Logstash
Logstash是一个开源的服务器端数据处理管道,可以同时从多个数据源获取数据,并对其进行转换,然后将其发送到你最喜欢的“存储”。(当然,我们最喜欢的是Elasticsearch)
输入:采集各种样式、大小和来源的数据
过滤器:实时解析和转换数据
数据从源传输到存储库的过程中,Logstash 过滤器能够解析各个事件,识别已命名的字段以构建结构,并将它们转换成通用格式,以便更轻松、更快速地分析和实现商业价值。
Logstash 能够动态地转换和解析数据,不受格式或复杂度的影响:
- 利用 Grok 从非结构化数据中派生出结构
- 从 IP 地址破译出地理坐标
- 将 PII 数据匿名化,完全排除敏感字段
- 整体处理不受数据源、格式或架构的影响
输出:选择你的存储,导出你的数据
尽管 Elasticsearch 是我们的首选输出方向,能够为我们的搜索和分析带来无限可能,但它并非唯一选择。Logstash 提供众多输出选择,您可以将数据发送到您要指定的地方,并且能够灵活地解锁众多下游用例。
安装Logstash
可以直接从官网上下载安装包(Java环境需要JDK),也可以使用docker镜像
首先,让我们通过最基本的Logstash管道来测试一下刚才安装的Logstash
Logstash管道有两个必需的元素,输入和输出,以及一个可选元素过滤器。输入插件从数据源那里消费数据,过滤器插件根据你的期望修改数据,输出插件将数据写入目的地。
我们可以通过命令行的形式进行测试,也可以配置配置文件
./bin/logstash -e 'input { stdin {} } output { stdout {} }'
或者新建一个配置文件,然后读取配置文件
./bin/logstash -f ./config/newconfig.conf
Logstash 解析日志
在上一小节中,你已经创建了一个基本的Logstash管道来测试你的Logstash设置。在现实世界中,一个Logstash管理会稍微复杂一些:它通常有一个或多个input, filter 和 output 插件。
在这一小节中,你将创建一个Logstash管道,并且使用Filebeat将Apache Web日志作为input,解析这些日志,然后将解析的数据写到一个Elasticsearch集群中。你将在配置文件中定义管道,而不是在命令行中定义管道配置。
(在GitHub上有一些案例可以供我们进行练习)https://github.com/elastic/examples
1.安装并配置filebeat,在filebeat安装目录下新建.yml文件
filebeat.inputs:
- type: log
paths:
- /var/log/*.log
output.logstash:
hosts: ["localhost:5048"]
paths的可以进行调整,放置将要进行解析的日志文件
2.在logstash目录下新建一个文件first-pipeline.conf(不一定在安装目录下)具体配置如下:
3.检查配置并启动Logstash
./bin/logstash -f ./config/myconfig.conf --config.test_and_exit
./bin/logstash -f ./config/myconfig.conf --config.reload.automatic
(
--config.test_and_exit选项的意思是解析配置文件并报告任何错误
--config.reload.automatic选项的意思是启用自动配置加载,以至于每次你修改完配置文件以后无需停止然后重启Logstash
)
4.启动filebeat
./filebeat -e -c filebeat-new1.yml -d "publish"
./filebeat -c filebeat-new1.yml
在Logstash控制台上会出现
用Grok过滤器插件解析日志
现在你有了一个工作管道,可以从Filebeat读取日志行。但是你可能已经注意到日志消息的格式并不理想。你想要解析日志消息,以便从日志中创建特定的、命名的字段。为此,您将使用grok filter插件。
grok 过滤器插件是Logstash中默认可用的几个插件之一。
grok 过滤器插件允许你将非结构化日志数据解析为结构化和可查询的数据。
因为 grok 过滤器插件在传入的日志数据中查找模式
为了解析数据,你可以用 %{COMBINEDAPACHELOG} grok pattern ,这种模式(或者说格式)的schema如下
修改Logstash下的newconfig.conf 配置如下:
input {
beats {
port => "5048"
}
}
filter {
grok {
match => {"message" => "%{COMBINEDAPACHELOG}" }
}
date {
match => [ "timestamp", "dd/MMM/YYYY:HH:mm:ss Z" ]
locale => en
}
geoip {
source => "clientip"
}
}
output {
stdout { codec => rubydebug }
}
清理filebeat目录下的data/data/registry/下的filebeat,删除即可,重启filebeat
./filebeat -e -c filebeat-new1.yml -d "publish"
会有以下的结果:
"message" => "3.149.9.216 - - [17/May/2015:10:05:12 +0000] \"GET /presentations/logstash-monitorama-2013/plugin/zoom-js/zoom.js HTTP/1.1\" 200 7697 \"http://semicomplete.com/presentations/logstash-monitorama-2013/\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
"clientip" => "3.149.9.216",
"referrer" => "\"http://semicomplete.com/presentations/logstash-monitorama-2013/\"",
"geoip" => {
"country_code3" => "US",
"continent_code" => "NA",
"location" => {
"lat" => 37.751,
"lon" => -97.822
},
"latitude" => 37.751,
"longitude" => -97.822,
"country_name" => "United States",
"country_code2" => "US",
"ip" => "3.149.9.216"
之后我们可以利用Elasticsearch和Kibana进行demo的演示
所需要的log文件在GitHub上有地址
新建Logstash下的apache_logstash.conf 配置如下:
input {
beats {
port=>"5048"
}
}
filter {
grok {
match => {
"message" => '%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response:int} (?:-|%{NUMBER:bytes:int}) %{QS:referrer} %{QS:agent}'
}
}
date {
match => [ "timestamp", "dd/MMM/YYYY:HH:mm:ss Z" ]
locale => en
}
geoip {
source => "clientip"
}
# useragent {
# # source => "agent"
# # target => "useragent"
# }
}
output {
stdout {
codec => dots {}
}
elasticsearch {
index => "my_test3"
template => "./apache_template.json"
template_name => "my_test3"
template_overwrite => true
}
}
启动Logstash
./bin/logstash -f ./config/apache_logstash.conf --config.reload.automatic
清理filebeat目录下的data/data/registry/下的filebeat,删除即可,重启filebeat
./filebeat -e -c filebeat-new2.yml -d "publish"
之后就可以通过Elasticsearch和Kinana 进行可视化的展示了。
Logstash 导入数据
可以在Kibana下的Management/Saved objects进行模板导入(这里是模版)
Logstash 配置监控
在Logstash安装目录下的logstash.yml文件中输入(具体详细可以参考这里)
xpack.monitoring.elasticsearch.hosts: ["http://localhost:9200"]
之后可以在Kibana进行监控,这需要重新录入以下数据,
然后在Stack Monitor 中可以看到之前的数据了
参考内容:https://www.cnblogs.com/cjsblog/p/9459781.html