ELK日志分析系统
ELK日志分析系统
一、ELK简介
日志分析是运维工程师解决系统故障,发现问题的主要手段。日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因,经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
日志是一个非常庞大的数据,并且常常被分散在不同的设备上,这样排查问题的时候找日志就非常繁琐困难。
这时,一个专门处理日志的系统就非常必要。
ELK日志分析系统(ELasticsearch+Logstash+Kibana)是Logstash、Elasticsearch、Kibana开源软件的集合,对外是作为一个日志管理系统的开源方案,它可以从任何来源、任何格式进行日志搜索、分析与可视化展示
二、ELK的组成
elasticsearch(es):通过搭建群集;存储日志数据,索引日志数据
elasticsearch的概述
提供了一个分布式多用户能力的全文搜索引擎
Elasticsearch核心概念
(1)接近实时(NRT)
elasticsearch是一个接近实时的搜索平台,这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒)
(2)集群(cluster)
一个集群就是由一个或多个节点组织在一起,它们共同持有你整个的数据,并一起提供索引和搜索功能。其中一个节点为主节点,这个主节点是可以通过选举产生的,并提供跨节点的联合索引和搜索的功能。集群有一个唯一性标示的名字,默认是elasticsearch,集群名字很重要,每个节点是基于集群名字加入到其集群中的。因此,确保在不同环境中使用不同的集群名字。
一个集群可以只有一个节点。强烈建议在配置elasticsearch时,配置成集群模式。
(3)节点(node)
节点就是一台单一的服务器,是集群的一部分,存储数据并参与集群的索引和搜索功能。像集群一样,节点也是通过名字来标识,默认是在节点启动时随机分配的字符名。当然,你可以自己定义。该名字也很重要,在集群中用于识别服务器对应的节点。
节点可以通过指定集群名字来加入到集群中。默认情况,每个节点被设置成加入到elasticsearch集群。如果启动了多个节点,假设能自动发现对方,他们将会自动组建一个名为elasticsearch的集群。
(4)索引(type)
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。
(5)分片和副本(shards & replicas)
在实际情况下,索引存储的数据可能超过单个节点的硬件限制。如一个10亿文档需1TB空间可能不适合存储在单个节点的磁盘上,或者从单个节点搜索请求太慢了。为了解决这个问题,elasticsearch提供将索引分成多个分片的功能。当在创建索引时,可以定义想要分片的数量。每一个分片就是一个全功能的独立的索引,可以位于集群中任何节点上。
每个索引可以被分成多个分片。一个索引也可以被复制0次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和副本的数量可以在索引创建的时候指定。
在索引创建之后,你可以在任何时候动态地改变副本的数量,但是你事后不能改变分片的数量。
默认情况下,Elasticsearch中的每个索引被分片5个主分片和1个副本,这意味着,如果你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个副本分片(1个完全拷贝),这样的话每个索引总共就有10个分片。
logstash :收集日志,收集后给es存储
一款强大的数据处理工具
可实现数据传输、格式处理、格式化输出
数据输入、数据加工(如过滤,改写等)以及数据输出
LogStash主要组件·
Shipper: 日志收集者。负责监控本地日志文件的变化,及时收集最新的日志文件内容。
Indexer:日志存储者。负责接收日志并写入到本地文件。
Broker: 日志Hub。 负责连接多个Shipper 和多个Indexer.
Search and Storage: 允许对事件进行搜索和存储。
Web Interface: 基于Web 的展示界面。
在Logstash 中,包括了三个阶段,分别是输入(Input )、处理(Filter, 非必需)和输出(Output) 。
kibana :视图形式展现日志信息,更加人性化
一个针对Elasticsearch的开源分析及可视化平台
搜索、查看存储在Elasticsearch索引中的数据
通过各种图表进行高级数据分析及展示
Kibana主要功能
Elasticsearch无缝集成
整合数据,复杂数据分析
让更多团队成员受益
接口灵活,分享更容易
配置简单,可视化多数据源
简单数据导出
三、ELK部署案例
部署两台Elasticsearch做集群部署,其中node1做ELK日志分析系统
|
Apache |
20.0.0.30 |
Httpd |
|
logstach |
||
|
Node1 |
20.0.0.50 |
Elasticsearch |
|
kibana |
||
|
Node2 |
20.0.0.60 |
elasticsearch |
1.1、Elasticsearch配置(node1、node2上均要配置)
[root@node1 ~]# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch ###在线安装 [root@node1 ~]# cd /etc/yum.repos.d/ [root@node1 yum.repos.d]# vi elasticsearch.repo [elasticsearch-2.x] name=Elasticsearch repository for 2.x packages baseurl=http://packages.elastic.co/elasticsearch/2.x/centos gpgcheck=1 gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch enable=1 [root@node1 ~]# yum list #查看yum清单 [root@node1 ~]# yum install elasticsearch -y #安装elasticsearch [root@node1 ~]# yum install java -y #安装Java [root@node1 ~]# java -version #查看Java版本 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)
1.2、修改配置文件
[root@node1 yum.repos.d]# vi /etc/elasticsearch/elasticsearch.yml 修改以下几行的内容 去掉注释使其生效 17行 集群名称 cluster.name: elastic 23行 节点名称 node.name: linux-node1 #node2为node.name: linux-node2 33行 工作目录 path.data: /data/es-data
path.logs: /var/log/elasticsearch/ 43行 防止交换swap分区 bootstrap.memory_lock: true 54行 监听网络 network.host: 0.0.0.0 58行 端口 http.port: 9200
1.3、开启服务
mkdir -p /data/es-data chown -R elasticsearch:elasticsearch /data/es-data systemctl start elasticsearch.service netstat -anpt | grep 9200 tcp6 0 0 :::9200 :::* LISTEN 54134/java
1.4、测试


[root@node1 yum.repos.d]# curl -i -XGET 'http://20.0.0.50:9200/_count?pretty' -d '{
> "query": {
> "match_all": {}
> }
> }'
HTTP/1.1 200 OK #输出项
Content-Type: application/json; charset=UTF-8
Content-Length: 95
{
"count" : 0,
"_shards" : {
"total" : 0,
"successful" : 0,
"failed" : 0
}
}
[root@node2 yum.repos.d]# curl -i -XGET 'http://20.0.0.60:9200/_count?pretty' -d '{
> "query": {
> "match_all": {}
> }
> }'
HTTP/1.1 200 OK #输出项
Content-Type: application/json; charset=UTF-8
Content-Length: 95
{
"count" : 0,
"_shards" : {
"total" : 0,
"successful" : 0,
"failed" : 0
}
}
[root@node1 yum.repos.d]# /usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head #安装Elasticsearch插件
测试


1.5、elasticsearch集群部署
[root@node1 yum.repos.d]# vi /etc/elasticsearch/elasticsearch.yml 找到69行 将括号内的内容替换成node1 node2的地址 discovery.zen.ping.unicast.hosts: ["20.0.0.50", "20.0.0.60"]
重启服务
systemctl restart elasticsearch.service
测试

1.6、Logstash部署(apache上部署)
[root@apache ~]# yum -y install httpd [root@apache ~]# systemctl start httpd [root@apache ~]# netstat -anpt | grep httpd tcp6 0 0 :::80 :::* LISTEN 15620/httpd [root@apache ~]# echo '<h1>this is web!</h1>' > /var/www/html/index.html [root@apache ~]# curl http://localhost <h1>this is web!</h1> 安装秘钥及logstach源 [root@node1 ~]# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch [root@node1 ~]# vi /etc/yum.repos.d/logstash.repo [logstash-2.1] name=Logstash repository for 2.1.x packages baseurl=http://packages.elastic.co/logstash/2.1/centos gpgcheck=1 gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch enable=1 安装Logstash [root@node1 ~]# yum install logstash -y
1.7安装java环境,没有自带安装使用yum -y install java安装
[root@apache ~]# yum -y install 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)6 [root@apache bin]# ln -s /opt/logstash/bin/logstash /usr/local/bin/
1.8、logstash(apache)与elasticsearch(node)功能是否正常,做对接测试

1.9、使用logstash将信息输出给elasticsearch
[root@apache bin]# logstash -e 'input { stdin{} } output { elasticsearch { hosts => ["20.0.0.50:9200"] } }'
Settings: Default filter workers: 1
Logstash startup completed
abc123 #输入内容
abc456
abc789
测试


在apache主机中做对接配置,logstash收集系统日志
[root@apache bin]# chmod o+r /var/log/messages #允许其他用户访问
[root@apache bin]# ll /var/log/messages
-rw----r--. 1 root root 250721 11月 18 16:40 /var/log/message
[root@apache ~]# vi /etc/logstash/conf.d/system.conf
input {
file {
path => "/var/log/messages"
type => "system"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["20.0.0.50:9200"]
index => "system-%{+YYY.MM.dd}"
}
}
[root@apache ~]# systemctl restart logstash.service
测试


2.1、在node1主机安装kibana
上传kibana-4.3.1-linux-x64.tar.gz到/root下
[root@node1 ~]# tar zxf kibana-4.3.1-linux-x64.tar.gz [root@node1 ~]# mv kibana-4.3.1-linux-x64 kibana [root@node1 ~]# mv kibana /usr/local/ [root@node1 ~]# cd /usr/local/kibana/ [root@node1 kibana]# vi config/kibana.yml //2行 kibana打开的端口 server.port: 5601 //5行 kibana侦听的地址 server.host: "0.0.0.0" //12行 和elasticsearch建立联系 elasticsearch.url: "http://20.0.0.50:9200" //20行 在elasticsearch中添加.kibana索引 kibana.index: ".kibana" [root@node1 kibana]# yum -y install screen
启动kibana

填入system-*,即对接系统日志文件名



2.2、添加logstash配置,收集apache服务的访问日志和错误日志中的数据
[root@apache ~]# cd /etc/logstash/conf.d/
[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.50:9200"]
index => "apache_access-%{+YYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["20.0.0.50:9200"]
index => "apache_error-%{+YYY.MM.dd}"
}
}
}
[root@apache conf.d]# logstash -f apache_log.conf
测试



浙公网安备 33010602011771号