ELK日志分析系统
概述
ELK日志分析系统是Logstash、Elasticsearch、Kibana开源软件的集合,对外是作为一个日志管理系统的开源方案,它可以从任何来源、任何格式进行日志搜索、分析与可视化展示。
组成
elasticsearch(es):通过搭建群集;存储日志数据,索引日志数据
logstash :收集日志,收集到了后给es存储
kibana :视图形式展现日志信息,更加人性化
步骤
将日志进行集中化管理
将日志格式化(Logstash)并输出到Elasticsearch
对格式化后的数据进行索引和存储(Elasticsearch)
前端数据的展示(Kibana)
三款软件
Elasticsearch
概述
提供了一个分布式多用户能力的全文搜索引擎
核心概念
接近实时(NRT)
elasticsearch是一个接近实时的搜索平台,这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒)
集群(cluster)
一个集群就是由一个或多个节点组织在一起,它们共同持有你整个的数据,并一起提供索引和搜索功能。其中一个节点为主节点,这个主节点是可以通过选举产生的,并提供跨节点的联合索引和搜索的功能。集群有一个唯一性标示的名字,默认是elasticsearch,集群名字很重要,每个节点是基于集群名字加入到其集群中的。因此,确保在不同环境中使用不同的集群名字。
一个集群可以只有一个节点。强烈建议在配置elasticsearch时,配置成集群模式。
节点(node)
节点就是一台单一的服务器,是集群的一部分,存储数据并参与集群的索引和搜索功能。像集群一样,节点也是通过名字来标识,默认是在节点启动时随机分配的字符名。当然,你可以自己定义。该名字也很重要,在集群中用于识别服务器对应的节点。
节点可以通过指定集群名字来加入到集群中。默认情况,每个节点被设置成加入到elasticsearch集群。如果启动了多个节点,假设能自动发现对方,他们将会自动组建一个名为elasticsearch的集群。
索引(type)
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。
类型相对于关系型数据库的表
索引(库)–》类型(表)–》文档(记录)
分片和副本(shards & replicas)
在实际情况下,索引存储的数据可能超过单个节点的硬件限制。如一个100亿文档需12TB空间可能不适合存储在单个节点的磁盘上,或者从单个节点搜索请求太慢了。为了解决这个问题,elasticsearch提供将索引分成多个分片的功能。当在创建索引时,可以定义想要分片的数量。每一个分片就是一个全功能的独立的索引,可以位于集群中任何节点上。
每个索引可以被分成多个分片。一个索引也可以被复制0次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和副本的数量可以在索引创建的时候指定。
在索引创建之后,你可以在任何时候动态地改变副本的数量,但是你事后不能改变分片的数量。
默认情况下,Elasticsearch中的每个索引被分片5个主分片和1个副本,这意味着,如果你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个副本分片(1个完全拷贝),这样的话每个索引总共就有10个分片。
Logstash
概述
一款强大的数据处理工具
可实现数据传输、格式处理、格式化输出
数据输入(从业务输入)、数据加工(如过滤、改写等)以及数据输出(输出到Elasticsearch群集)
主要组件
shipper:日志收集者,负责监控本地日志文件的变化,及时把日志文件的最新内容收集起来。通常,远程代理端(agent)只需要运行这个组件即可
indexer:日志存储者,负责接收日志并写入到本地文件
broker:日志hub,负责连接多个shipper和多个indexer
search and storage:允许对事件进行搜索和存储
web interface:基于Web的展示界面
Kibana介绍
概述
一个针对Elasticsearch的开源分析及可视化平台
搜索、查看存储在Elasticsearch索引中的数据
通过各种图表进行高级数据分析及展示
主要功能
Elasticsearch无缝之集成
整合数据,复杂数据分析
让更多团队成员收益
接口灵活,分享更容易
配置简单,可视化多数据源
简单数据导出
ELK日志分析系统部署
环境
主机名 | IP地址 | 主要软件 |
---|---|---|
apache | 192.168.1.10 | httpd、logstash |
node1 | 192.168.1.15 | Elasticsearch、kibana |
node2 | 192.168.1.20 | Elasticsearch |
步骤
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)
vi /etc/hosts
192.168.1.15 node1
192.168.1.20 node2
node1/2部署Elasticsearch
cd /opt/,拖入elasticsearch-5.5.0.rpm安装包
rpm -ivh elasticsearch-5.5.0.rpm
根据提示加载elasticsearch服务
systemctl daemon-reload
systemctl enable elasticsearch.service
更改elasticsearch主配置文件
cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak #备份
vi /etc/elasticsearch/elasticsearch.yml
cluster.name: my-elk-cluster #17行集群名字
node.name: node1 #23行节点名字,node2改为2就可以了
path.data: /data/elk_data #33行数据存放路径
path.logs: /var/log/elasticsearch #37行日志存放路径
bootstrap.memory_lock: false #43行不在启动的时候锁定内存(这样可以让图片等资源加载时使用内存)
network.host: 0.0.0.0 #55行提供服务绑定的IP地址,0.0.0.0代表所有地址
http.port: 9200 #59行监听端口为9200
discovery.zen.ping.unicast.hosts: ["node1", "node2"] #68行集群发现通过单播实现,单播的主机名为"node1", "node2"
创建数据存放路径并授权
mkdir -p /data/elk_data
chown elasticsearch.elasticsearch /data/elk_data/
开启服务
systemctl start elasticsearch.service
netstat -ntap | grep 9200 #端口开启比较慢,多等一会
测试
检测集群的健康情况和状态
green代表健康
http://192.168.1.15:9200/_cluster/state?pretty #比健康情况显示的更加详细
两个节点安装elasticsearch-head插件
yum -y install gcc gcc-c++ make
tar zxvf node-v8.2.1.tar.gz
cd node-v8.2.1/
./configure
make -j3 (用3个核心数处理)
make install
编译安装phantomjs(前端框架),elasticsearch-head(数据可视化工具)
cd /usr/local/src/
tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2
cd phantomjs-2.1.1-linux-x86_64/bin/
cp phantomjs /usr/local/bin/
cd /usr/local/src/
tar zxf elasticsearch-head.tar.gz
cd elasticsearch-head/
npm install
修改elasticsearch.yml主配置文件
vi /etc/elasticsearch/elasticsearch.yml #添加
http.cors.enabled: true
http.cors.allow-origin: "*"
systemctl restart elasticsearch.service
后台启动elasticsearch-head服务
cd /usr/local/src/elasticsearch-head/
npm run start &
netstat -ntap | grep 9100 #检测elasticsearch-head端口是否开启
真机访问
创建索引
curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhusan","mesg":"hello"}'
apache主机安装logstash
安装apache
yum -y install httpd
systemctl start httpd
安装logstash,上传安装包
rpm -ivh logstash-5.5.1.rpm
systemctl start logstash.service
systemctl enable logstash.service
ln -s /usr/share/logstash/bin/logstash /usr/local/bin/ #建立命令软链接
logstash命令选项解释:
-f:指定logstash的配置文件,根据配置文件配置logstash
-e:后面跟着字符串,该字符串可以被当做logstash的配置(如果是“ ”,则默认使用stdin做输入,stdout为输出)
-t:测试配置文件是否正确,然后退出
#输入采用标准输入,输出采用标准输出
logstash(apache)与elasticsearch(node)功能是否正常,做对接测试
logstash -e 'input { stdin{} } output { stdout{} }'
使用rubydebug显示详细输出,codec为一种编解码器
logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
使用logstash将信息输出给elasticsearch
logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.1.15:9200"] } }'
......省略
www.baidu.com
www.taobao.com
打开浏览器,查看索引信息
在apache主机中做对接配置
logstash配置文件主要由三部分组成:input、output、filter
chmod o+r /var/log/messages #允许其他用户访问
ll /var/log/messages
vi /etc/logstash/conf.d/system.conf
input { #logstash输入:从/var/log/messages输入,类型为system,起始位 置为从头开始
file {
path => "/var/log/messages"
type => "system"
start_position => "beginning"
}
}
output { #logstash输出:输出给elasticsearch(以IP地址指定位置)
elasticsearch {
hosts => ["192.168.1.15:9200"]
index => "system-%{+YYY.MM.dd}"
}
}
systemctl restart logstash.service
node1安装kibana
上传kibana安装包到/usr/local/src
cd /usr/local/src/
rpm -ivh kibana-5.5.1-x86_64.rpm
cd /etc/kibana/
cp kibana.yml kibana.yml.bak #备份
vi kibana.yml
server.port: 5601 #2行 kibana打开的端口
server.host: "0.0.0.0" #7行 kibana侦听的地址
elasticsearch.url: "http://192.168.1.15:9200" #21 行和elasticsearch建立联系
kibana.index: ".kibana" #30行 在elasticsearch中添加.kibana索引
systemctl start kibana.service #启动kibana服务
systemctl enable kibana.service #开机启动kibana服务
浏览器中登录,首次登录创建一个索引名字system-*
同时也能看到刚才在kibana.yml中添加的在elasticsearch中添加.kibana索引配置生效了
apache添加logstash配置
收集apache服务的访问日志和错误日志中的数据
cd /etc/logstash/conf.d/
vim 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 => ["192.168.1.15:9200"]
index => "apache_access-%{+YYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["192.168.1.15:9200"]
index => "apache_error-%{+YYY.MM.dd}"
}
}
}
logstash -f apache_log.conf ##指定logstash的配置文件,根据apache_log.conf配置logstash(-f可以不重启加载)
浏览器访问,查看apache日志文件的索引是否建立成功。如果未曾出现access目录,登录apache主页,刷新几次再看就会有了
kibana中添加刚才elasticsearch中新建的索引,可以以更加人性化的视图界面查看、分析日志。点击management模块,点击index patterns 创建新的索引,点击create index pattern,之后步骤类似上方步骤。
回到discover可查看所有索引内容。