ELK日志分析系统
ELK日志分析系统简介
ELK日志分析系统是Logstash、Elasticsearch、Kibana开源软件的集合,对外是作为一个日志管理系统的开源方案,它可以从任何来源、任何格式进行日志搜索、分析与可视化展示
ELK日志分析系统组成
elasticsearch(es):通过搭建群集;存储日志数据,索引日志数据
logstash :收集日志,收集到了后给es存储
kibana :视图形式展现日志信息,更加人性化
日志处理步骤
1.将日志进行集中化管理
2.将日志格式化(Logstash)并输出到Elasticsearch
3.对格式化后的数据进行索引和存储(Elasticsearch)
4.前端数据的展示(Kibana)
三款软件各自概念
Elasticsearch介绍
Elasticsearch的概述
提供了一个分布式多用户能力的全文搜索引擎
Elasticsearch核心概念
(1)接近实时(NRT)
elasticsearch是一个接近实时的搜索平台,这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒)
(2)集群(cluster)
一个集群就是由一个或多个节点组织在一起,它们共同持有你整个的数据,并一起提供索引和搜索功能。其中一个节点为主节点,这个主节点是可以通过选举产生的,并提供跨节点的联合索引和搜索的功能。集群有一个唯一性标示的名字,默认是elasticsearch,集群名字很重要,每个节点是基于集群名字加入到其集群中的。因此,确保在不同环境中使用不同的集群名字。
一个集群可以只有一个节点。强烈建议在配置elasticsearch时,配置成集群模式。
总结:
es具有集群机制,节点通过集群名称加入到集群中,同时在集群中的节点会有一个自己的唯一身份标识(自己的名称)
(3)节点(node)
节点就是一台单一的服务器,是集群的一部分,存储数据并参与集群的索引和搜索功能。像集群一样,节点也是通过名字来标识,默认是在节点启动时随机分配的字符名。当然,你可以自己定义。该名字也很重要,在集群中用于识别服务器对应的节点。
节点可以通过指定集群名字来加入到集群中。默认情况,每个节点被设置成加入到elasticsearch集群。如果启动了多个节点,假设能自动发现对方,他们将会自动组建一个名为elasticsearch的集群。
(4)索引(type)
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。
类型相当于关系型数据库的表
索引(库)–》类型(表)–》文档(记录)
(5)类型(type)
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。
在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。
类型相当于关系型数据库的表
(6)文档(document)
一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以JSON (Javascript Object Notation)格式来表示,而JSON是一个到处存在的互联网数据交互格式。在一个index/type里面,只要你想,你可以存储任意多的文档。注意,虽然一个文档在物理上位于一个索引中,实际上一个文档必须在一个索引内被索引和分配一个类型。
文档相当于关系型数据库的列。
(7)分片和副本(shards & replicas)
在实际情况下,索引存储的数据可能超过单个节点的硬件限制。如一个10亿文档需1TB空间可能不适合存储在单个节点的磁盘上,或者从单个节点搜索请求太慢了。为了解决这个问题,elasticsearch提供将索引分成多个分片的功能。当在创建索引时,可以定义想要分片的数量。每一个分片就是一个全功能的独立的索引,可以位于集群中任何节点上。
分片的两个最主要原因:
- 水平分割扩展,增大存储量
- 分布式并行跨分片操作,提高性能和吞吐量分布式分片的机制和搜索请求的文档如何汇总完全是有elasticsearch控制的,这些对用户而言是透明的。**
网络问题等等其它问题可以在任何时候不期而至,为了健壮性,强烈建议要有一个故障切换机制,无论何种故障以防止分片或者节点不可用。
为此,elasticsearch让我们将索引分片复制一份或多份,称之为分片副本或副本。
**副本两个最主要原因: **
- 高可用性,以应对分片或者节点故障。出于这个原因,分片副本要在不同的节点上。
- ×××能,增大吞吐量,搜索可以并行在所有副本上执行。
每个索引可以被分成多个分片。一个索引也可以被复制0次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和副本的数量可以在索引创建的时候指定。
在索引创建之后,你可以在任何时候动态地改变副本的数量,但是你事后不能改变分片的数量。
默认情况下,Elasticsearch中的每个索引被分片5个主分片和1个副本,这意味着,如果你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个副本分片(1个完全拷贝),这样的话每个索引总共就有10个分片。
Logstash介绍
1、一款强大的数据处理工具
2、可实现数据传输、格式处理、格式化输出
3、数据输入(从业务输入)、数据加工(如过滤、改写等)以及数据输出(输出到Elasticsearch群集)
4、Logstash的主要组件
shipper:日志收集者,负责监控本地日志文件的变化,及时把日志文件的最新内容收集起来。通常,远程代理端(agent)只需要运行这个组件即可
indexer:日志存储者,负责接收日志并写入到本地文件
broker:日志hub,负责连接多个shipper和多个indexer
search and storage:允许对事件进行搜索和存储
web interface:基于Web的展示界面
Kibana介绍
1、一个针对Elasticsearch的开源分析及可视化平台
2、搜索、查看存储在Elasticsearch索引中的数据
3、通过各种图表进行高级数据分析及展示
4、主要功能
Elasticsearch无缝之集成
整合数据,复杂数据分析
让更多团队成员收益
接口灵活,分享更容易
配置简单,可视化多数据源
简单数据导出
ELK日志分析系统部署
实验环境及准备
主机名 | IP地址 | 主要软件 |
---|---|---|
node1 | 20.0.0.11 | Elasticsearch、kibana |
node2 | 20.0.0.12 | Elasticsearch |
apache | 20.0.0.13 | httpd、logstash |
实验过程
node1
[root@node1 ~]# java -version #自带版本
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)
添加本地解析,识别群集主机名
[root@node1 ~]# vi /etc/hosts
20.0.0.11 node1
20.0.0.12 node2
部署Elasticsearch
部署yum源,安装elasticsearch及java
[root@node1 ~]# unzip elk.zip
[root@node1 ~]# cd elk/
[root@node1 elk]# ls
elasticsearch-5.5.0.rpm logstash-5.5.1.rpm
elasticsearch-head.tar.gz node-v8.2.1.tar.gz
kibana-5.5.1-x86_64.rpm phantomjs-2.1.1-linux-x86_64.tar.bz2
[root@node1 elk]# rpm -ivh elasticsearch-5.5.0.rpm
[root@node1 ~]# systemctl daemon-reload
[root@node1 ~]# systemctl enable elasticsearch.service
Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.
[root@node1 ~]# cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak #备份配置文件
[root@node1 ~]# vi /etc/elasticsearch/elasticsearch.yml
17 cluster.name: my-elk-cluster #集群名字
23 node.name: node1#节点名字
33 path.data: /data/elk_data #数据存放路径
37 path.logs: /var/log/elasticsearch/ #日志存放路径
43 bootstrap.memory_lock: false #不在启动的时候锁定内存(前端缓存。与IOPS-性能测试方式,每秒读写次数相关)
55 network.host: 0.0.0.0 #提供服务绑定的IP地址,0.0.0.0代表所有地址
59 http.port: 9200 #侦听端口为9200
68 discovery.zen.ping.unicast.hosts: ["node1", "node2"] #集群发现通过单播实现,unicast:单播
[root@node1 ~]# grep -v "^#" /etc/elasticsearch/elasticsearch.yml #通过反向过滤检查配置文件是否有问题
cluster.name: my-elk-cluster
node.name: node1
path.data: /data/elk_data
path.logs: /var/log/elasticsearch/
bootstrap.memory_lock: false
network.host: 0.0.0.0
http.port: 9200
discovery.zen.ping.unicast.hosts: ["node1", "node2"]
node2配置同node1相同,只需更改配置文件中node节点名称
grep -v "^#" /etc/elasticsearch/elasticsearch.yml #通过反向过滤检查配置文件是否有问题
………………
node.name: node2 #更改此处
………………
创建工作目录并更改属主和属组,开启服务
[root@node1 ~]# mkdir -p /data/elk_data #创建工作目录,需要跟配置文件中指定的路径相同
[root@node1 ~]# chown -R elasticsearch:elasticsearch /data/elk_data/ #更改工作目录的属主和数组
[root@node1 ~]# systemctl start elasticsearch.service #启动es服务
[root@node1 ~]# netstat -anpt | grep 9200 #程序启动时间长,稍等一会再查看
tcp6 0 0 :::9200 :::* LISTEN 5886/java
测试查看
[root@node1 ~]# curl 20.0.0.11:9200
{
"name" : "node1",
"cluster_name" : "my-elk-cluster",
"cluster_uuid" : "uwRhuKs_TJmjv2DT1RjkEw",
"version" : {
"number" : "5.5.0",
"build_hash" : "260387d",
"build_date" : "2017-06-30T23:16:05.735Z",
"build_snapshot" : false,
"lucene_version" : "6.6.0"
},
"tagline" : "You Know, for Search"
}
[root@node2 ~]# curl 20.0.0.12:9200
{
"name" : "node2",
"cluster_name" : "my-elk-cluster",
"cluster_uuid" : "k5PoesRKRpWKs5RNTXjSXA",
"version" : {
"number" : "5.5.0",
"build_hash" : "260387d",
"build_date" : "2017-06-30T23:16:05.735Z",
"build_snapshot" : false,
"lucene_version" : "6.6.0"
},
"tagline" : "You Know, for Search"
}
健康检查
浏览器输入20.0.0.11:9200/_cluster/state?pretty #检查群集状态信息
浏览器输入20.0.0.11:9200/_cluster/health?pretty #检查群集健康状态
编译安装node组件依赖包
[root@node1 ~]# yum -y install gcc gcc-c++ make
[root@node1 elk]# tar zxvf node-v8.2.1.tar.gz
[root@node1 elk]# cd node-v8.2.1/
[root@node1 node-v8.2.1]# ./configure
[root@node1 node-v8.2.1]# make -j4 #(用四个核心数处理,按个人电脑配置而定)
[root@node1 node-v8.2.1]# make install
编译安装phantomjs(前端框架)
[root@node1 ~]# cd elk/
[root@node1 elk]# tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2
[root@node1 elk]# cd phantomjs-2.1.1-linux-x86_64/
[root@node1 phantomjs-2.1.1-linux-x86_64]# ls
bin ChangeLog examples LICENSE.BSD README.md third-party.txt
[root@node1 phantomjs-2.1.1-linux-x86_64]# cd bin/
[root@node1 bin]# ls
phantomjs
[root@node1 bin]# cp phantomjs /usr/local/bin/ #存放在命令文件中
安装elasticsearch-head(数据可视化工具)
两个节点安装elasticsearch-head插件(安装插件可以更人性化管理集群)
[root@node1 elk]# tar zxvf elasticsearch-head.tar.gz
[root@node1 elk]# cd elasticsearch-head/
[root@node1 elasticsearch-head]# ls
Dockerfile LICENCE README.textile
Dockerfile-alpine node_modules _site
elasticsearch-head.sublime-project package.json src
Gruntfile.js package-lock.json test
grunt_fileSets.js plugin-descriptor.properties
index.html proxy
[root@node1 elasticsearch-head]# npm install #npm:elasticsearch管理工具
修改elasticsearh-head配置文件
[root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml #末尾增加
http.cors.enabled: true #是否跨域访问支持,默认为false
http.cors.allow-origin: "*" #跨域访问允许的域名地址
启动elasticsearch-head服务
[root@node1 ~]# cd /root/elk/elasticsearch-head
[root@node1 elasticsearch-head]# npm run start &
[1] 52335
[root@node1 elasticsearch-head]#
> elasticsearch-head@0.0.0 start /root/elk/elasticsearch-head
> grunt server
Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100
[root@node1 elasticsearch-head]# netstat -anpt | grep 9100
tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 52345/grunt
[root@node1 elasticsearch-head]# netstat -anpt | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 52234/java
测试
浏览器地址栏输入20.0.0.11:9100
使用可视化工会据9100端口访问
输入节点1和2地址并连接,查看健康状态,green为健康 #有周期性连接机制,集群健康值显示未连接可以等待一会
创建索引(这次创建的为框架)
创建索引字段
索引名称为index-demo,类型为test
[root@node1 ~]# curl -XPUT ‘localhost:9200/index-demo/test/1?pretty&pretty’ -H ‘content-Type: application/json’ -d ‘{“user”:“wangwu”,“mesg”:“hello world”}’ #
{
“_index” : “index-demo”,
“_type” : “test”,
“_id” : “1”,
“_version” : 1,
“result” : “created”,
“_shards” : {
“total” : 2,
“successful” : 2,
“failed” : 0
},
“created” : true #创建状态,true成功
}
查看
查询
node2同node1操作相同
apache主机中安装logstash并作日志收集
安装apache服务并启动
[root@apache ~]# yum -y install httpd
[root@apache ~]# systemctl start httpd
安装java环境,可先查看系统是否自带
[root@apache ~]# java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)
没有自带可使用yum -y install java安装
安装logstash并启动
[root@apache elk]# rpm -ivh logstash-5.5.1.rpm
[root@apache elk]# systemctl start logstash.service
[root@apache elk]# systemctl enable logstash.service
Created symlink from /etc/systemd/system/multi-user.target.wants/logstash.service to /etc/systemd/system/logstash.service.
[root@apache elk]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/ #创建命令软链接
对接测试
测试logstash(apache)与elasticsearch(node)功能是否正常
logstash命令选项解释:
-f:指定logstash的配置文件,根据配置文件配置logstash
-e:后面跟着字符串,该字符串可以被当做logstash的配置(如果是“ ”,则默认使用stdin做输入,stdout为输出)
-t:测试配置文件是否正确,然后退出
输入采用标准输入,输出采用标准输出
[root@apache ~]# logstash -e 'input { stdin{} } output { stdout{} }' # stdin:标准输入; stdout:标准输入
………………
The stdin plugin is now waiting for input:
11:23:08.468 [Api Webserver] INFO logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
www.baidu.com #输入一个网址
2021-01-06T03:24:24.742Z apache www.baidu.com #输出
www.taobao.com
2021-01-06T03:24:55.819Z apache www.taobao.com
www.aiqiyi.com
2021-01-06T03:25:09.045Z apache www.aiqiyi.com
使用rubydebug显示详细输出,codec为一种编解码器(格式转化后输出)
[root@apache ~]# logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
The stdin plugin is now waiting for input:
11:25:57.034 [Api Webserver] INFO logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
www.baidu.com #随便输入一个网址
{
"@timestamp" => 2021-01-06T03:26:08.134Z,
"@version" => "1",
"host" => "apache",
"message" => "www.baidu.com"
}
使用logstash将信息输出给elasticsearch(输入输出对接)
[root@apache ~]# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["20.0.0.11:9200"] } }'
………………
The stdin plugin is now waiting for input:
11:27:05.746 [Api Webserver] INFO logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
www.baidu.com #随便输入几个网址测试
www.taobao.com
www.123.com
打开浏览器输入http://20.0.0.11:9100/,查看索引信息,显示新的数据信息说明输出到elasticsearch成功
在apache主机中做对接配置
[root@apache ~]# chmod o+r /var/log/messages ###允许其他用户访问
[root@apache ~]# ll /var/log/messages
-rw----r--. 1 root root 439103 11月 18 15:20 /var/log/messages
[root@apache ~]# vim /etc/logstash/conf.d/system.conf #配置logstash
input { ###logstash输入:从/var/log/messages输入,类型为system,起始位
file {
path => "/var/log/messages"
type => "system"
start_position => "beginning"
}
}
output { ###logstash输出:输出给elasticsearch(以IP地址指定位置)
elasticsearch {
hosts => ["20.0.0.11:9200"]
index => "system-%{+YYY.MM.dd}"
}
}
[root@apache ~]# systemctl restart logstash
在node1主机安装kibana
[root@node1 elk]# rpm -ivh kibana-5.5.1-x86_64.rpm
[root@node1 ~]# cd /etc/kibana/
[root@node1 kibana]# cp kibana.yml kibana.yml.bak #创建备份
[root@node1 kibana]# vim kibana.yml
2 server.port: 5601 #kibana打开端口
7 server.host: "0.0.0.0" #kibana侦听的地址
21 elasticsearch.url: "http://20.0.0.11:9200" #和elasticsearch建立联系
30 kibana.index: ".kibana" #再elasticsearch中添加.kibana服务
[root@node1 kibana]# systemctl start kibana.service
[root@node1 kibana]# systemctl enable kibana.service
Created symlink from /etc/systemd/system/multi-user.target.wants/kibana.service to /etc/systemd/system/kibana.service.
浏览器中登录20.0.0.11:5601,首次登录提示创建一个索引名字:system,即对接系统日志文件名
能看到刚才在kibana.yml中添加的在elasticsearch中添加.kibana索引配置生效了(用于验证kibana和elasticsearch是否成功连接)
apache服务器
添加logstash配置,收集apache服务的访问日志和错误日志中的数据
[root@apache conf.d]# vi apache_log.conf
input {
file {
path => "/etc/httpd/logs/access_log"
type => "access"
start_position => "beginning"
}
file {
path => "/etc/httpd/logs/error_log"
type => "error"
start_position => "beginning"
}
}
output {
if [type] == "access" {
elasticsearch {
hosts => ["20.0.0.11:9200"]
index => "apache_access-%{+YYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["20.0.0.11:9200"]
index => "apache_error-%{+YYY.MM.dd}"
}
}
}
[root@apache conf.d]# /usr/share/logstash/bin/logstash -f apache_log.conf
#指定logstash的配置文件,根据apache_log.conf配置logstash(-f可以不重启加载)
浏览器访问http://20.0.0.11:9100/,查看apache日志文件的索引是否建立成功
kibana中添加刚才elasticsearch中新建的索引,可以以更加人性化的视图界面查看、分析日志
总结:
ELK日志分析系统是一款非常强大的日志分析工具,能够帮助运维工程师更快更准确的定位到想要的日志,特别是kibana可视化工具,功能强大,使用起来非常人性化。