文章目录
一、ELK日志分析系统简介
1.1日志处理的步骤
1.将APP servers的日志进行集中化管理到Logstash agent
2.将日志格式化(Logstash)并输出到Elasticsearch cluster
3.对格式化后的数据进行索引和存储(Elasticsearch)
4.前端数据的展示(Kibana)
5.可以在线查看界面化展示
1.2 ELK日志分析系统三部分
- Elasticsearch
- Logstash
- Kibana
Logstash 收集APP server产生的log,然后存放到Elasticsearch集群节点中
kibana从Elasticsearch集群节点中查询数据生成图表,再返回给Brower
1.3日志服务器(一般)
- 提高安全性
- 集中存放日志
-缺陷:对日志的分析困难
二、Elasticsearch介绍
2.1 Elasticsearch概述
1.提供了一个分布式多用户能力的全文搜索引擎
2.是一个基于Lucene的搜索服务器
3.基于restful web接口
4.使用java开发
5.作为apache许可条款下的开放源码发布,是第二流行的企业搜索引擎
6.被设计用于云计算中,能够达到实时搜索、稳定、可靠、快速、安装实用方便的需求
2.2 Elasticsearch的概念
-
接近实时(NRT)
Elasticsearch是一个接近即时的搜索平台,从索引一个文档知道这个文档能够被搜索到的过程中有一个轻微的延迟(通常是1S) -
集群(cluster)
由一个及其以上的节点组织在一起,它们共同持有整个数据,并一起提供索引和搜索功能
其中一个节点为主节点,这个节点是可以通过选举产生,并提供跨节点的联合索引和搜索的功能
集群有一个唯一标识的名字,默认是elaticsearch
集群名字很重要,每个节点是基于集群名字加入到其集群中;因此,要确保集群的唯一性,在不同环境中使用不同的集群名字
一个集群只可以有一个节点,建议在配置elasticsearch时,配置成集群模式
- 节点(node)
节点就是一台单一的服务器,是集群的一部分,存储数据并参与集群的索引和搜索功能
像集群一样,节点之间可是通过名字来标识区分,默认是在节点启动时随机分配的字符名
当然,你可以自己定义,该名字很重要,起到在集群中定位到对应的节点
节点可以通过指定集群名字来加入到集群中,默认情况下,每个节点被设置成加入到elasticsearch集群。
如果启动了多个节点,假设能够自动发现对方,他们将会自动组建一个名为elastisearch的集群
- 索引(index)——索引(库)——类型(表)——文档(记录)
一个索引就是一个拥有几分相似特征的文档的集合
比如说,你可以有一个客户数据的索引、一个产品目录的索引、还有一个订单数据的索引
一个索引用一个名字来标识(必须全部是小写字母组合),并且当我们要对相应的索引中的文档进行索引、收缩、更新和删除的时候,都要用到这个名字
在一个集群中,可以定义多个索引
- 类型(type)
在一个索引中,你可以定义一种或多种类型
一个类型是你的索引的一个逻辑上的分类分区,其寓意完全由你来定义
通常,会为具有一组共同字段的文档定义一个类型
比如:我们假设运营一个博客平台并且将所有的数据存储到一个索引中,在这个索引中,你可以为用户数据定义一个类型,为博客数据定义一个类型,也可以为评论数据定义另一个类型
- 文档(Document)
一个文档是一个可被索引的基础信息单元
比如:你可以拥有一个客户的文档,某一个产品的文档;文档以JSON(Javascript Object Notation)格式来表示,json是一个通用的互联网数据交互模式
在一个index/type内,你可以存储任意多的文档
注意:虽然一个文档在物理上位于一个索引内,但是实际上一个文档必须在一个索引内可以被索引和分配一个类型
- 分片和副本 (shards & replicas)
在实际情况下,索引存储的数据可能超过单个节点的硬件设置
比如十亿个文档需要1TB空间存储,可能不适合存储在单个节点上,读写被限制在单个节点;从单个节点搜索请求也太慢了
为了解决这个问题,elasticsearch集群提供将索引分割开,进行分片的功能
当创建索引时,可以定义想要分片的数量
每一个分片就是一个全功能的独立的索引,可以位于集群中的任何节点上
2.3 为什么要采用分片
1.可以进行水平分割横向扩展,增大存储量
2.分布式并行跨分片操作,提高性能和吞吐量
2.4 开启分片副本的主要原因
1.高可用性,以应对分片或者节点故障,处于这个原因,分片副本要在不同节点上
2.提高IO性能,增大吞吐量,搜索可以并行在所有副本执行
1.总之,每个索引可以被分成多个分片,一个索引也可以被复制0次或者多次
2.一旦复制了,每个索引就有了主分片(可以作为复制源的原始分片)和复制分片(主分片的拷贝)之分
3.分片和副本的数量可以在索引创建的时候指定,在索引创建之后,你可以在任何时候动态改变副本的数量,但是你事后无法改变分片的数量
4.默认情况下,Elasticsearch中的每个索引被分片为5个主分片和1个副本,这意味着,如果你的集群中至少有两个节点的情况下,你的索引将会有5个主分片和另外5个副本分片(1个完全拷贝),这样的话每个索引总共就有10个分片
三:Logstash介绍
3.1 Logstash概述
- 一款强大的数据处理工具,可以实现数据传输、格式处理、格式化输出
- 工作思路:数据输入(collect)、数据加工(如过滤、改写等enrich)以及数据输出(transport)
- 由LRuby语言编写,基于消息(message-based)的简单架构,并运行在Java虚拟机(JVM)上。
- 不同于分离的代理端(agent)或主机端(server),Logstash可配置单一的代理端(agent)与其他开源软件结合,以实现不同的功能
3.2 Logstash主要组件
- Shipper:日志收集
负责监控本地日志文件的变化,及时把日志文件的最新内容收集起来
通常,远程代理端(agent)只需要运行这个组件即可
-
Indexer:日志存储
负责接受日志并写入到本地文件 -
Broker:日志hub
负责链接多个shipper和对应数目的indexer -
Search and Storage
允许对事件进行搜索和存储 -
Web Interface
基于web的展示界面
以上组件在lLogstash架构中可以独立部署,因此提供了很好的集群扩展性
四:Kibana介绍
4.1 Kibana概述
- 一个针对Elasticsearch的开源分析及可视化平台
- 搜索、查看存储在Elasticsearch索引中的数据
- 通过各种图标进行高级数据分析及展示
- 让海量数据更容易理解
- 操作简单,基于浏览器地用户界面就可以快速创建仪表板(dashboard)实时显示Elasticsearch查询动态
- 设置安装Kibana非常简单,无需编写代码,几分钟内就可以完成Kibana安装并启动Elasticsearch监测
4.2 Kibana主要功能
- Elasticsearch无缝之集成。Kibana架构为Elasticsearch定制,可以将任何结构化和非结构化加入Elasticsearch索引,Kibana还充分利用了Elasticsearch强大的搜索和分析功能
- 整合数据,复杂数据分析;根据海量数据创建柱形图、折线图、三代泥土、直方图、饼图和地图;提升了Elasticsearch地分析能力,更够更加智能化地分析数据,执行数学转化并且根据要求对数据切割分块
- 让更多团队成员受益;强大的数据可视化让各个业务岗位都可以直观了解数据
- 接口灵活,分享更容易;使用Kibana可以更加方便地创建保存和分享数据,并将可视化数据快速交流
- 配置简单,可视化多数据源;Kibana地配置和启动非常简单,用户体验友好,Kibana自带web服务器,可以快速运行;kibana可以非常方便地把来自logstash、ES-hadoop、Beats或第三方技术整合到Elasticsearch,支持地第三方技术包括apacheflume、fluentd等
- 简单数据导出;Kibana可以方便地导出感兴趣地数据,与其他数据融合后快速建模分析,发现新结果
五:实操
环境:
IP地址 | 节点 | 安装 |
---|---|---|
20.0.0.101 | node1 | elasticsearch、node-v8.2.1.tar.gz、phantomjs |
20.0.0.102 | node2 | elasticsearch、node-v8.2.1.tar.gz |
20.0.0.103 | master | kibana、apache、logstash |
实验步骤
node1 配置
- 关闭防火墙与核心防护
[root@localhost ~]# hostnamectl set-hostname node1
[root@localhost ~]# su
[root@node1 ~]# systemctl stop firewalld
[root@node1 ~]# setenforce 0
2.在两个elk节点上配置域名解析,通过/etc/hosts文件实现
[root@node2 ~]# vi /etc/hosts
[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)
3.安装elasticsearch到opt目录
[root@node1 ~]# cd /opt
[root@node1 opt]# rz -E
rz waiting to receive.
[root@node1 opt]# rpm -ivh elasticsearch-5.5.0.rpm
4.加载系统服务
[root@node1 opt]# systemctl daemon-reload
[root@node1 opt]# systemctl enable elasticsearch.service
Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.
5.更改elasticsearch主配置文件
[root@node1 opt]# cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
[root@node1 opt]# vim /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 ###不在启动的时候锁定内存
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"] ####集群发现通过单播实现
[root@node1 opt]# mkdir -p /data/elk_data ##创建日志文件目录
[root@node1 opt]# chown elasticsearch:elasticsearch /data/elk_data/ ####授权
[root@node1 opt]# systemctl start elasticsearch.service ##开启elasticsearch服务
[root@node1 opt]# netstat -anpt | grep 9200 ###过滤9200
tcp6 0 0 :::9200 :::* LISTEN 38889/java
[root@node1 opt]# systemctl status elasticsearch.service ##查看当前elasticsearch状态
6.真机浏览器打开http://20.0.0.101:9200/ 查看节点信息
7.检查集群健康状态
http://20.0.0.101:9200/_cluster/health?pretty
8.上传node-v8.2.1.tar.gz插件到opt目录
[root@node1 ~]# cd /opt
[root@node1 opt]# yum -y install gcc gcc-c++ make //安装依赖环境
9.编译安装node组件依赖包
[root@node1 opt]# tar xzvf node-v8.2.1.tar.gz
[root@node1 opt]# cd node-v8.2.1/
[root@node1 node-v8.2.1]# ./congfigure
[root@node1 node-v8.2.1]# make -j3 && make install
10.安装phantomjs——前端框架,上传到/usr/local/src目录下
[root@node1 node-v8.2.1]# cd /usr/local/src
[root@node1 src]# ls
[root@node1 src]# rz -E
rz waiting to receive.
[root@node1 src]# ls
phantomjs-2.1.1-linux-x86_64.tar.bz2
[root@node1 src]# tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 ## 解压phantomjs压缩包
[root@node1 src]# cd phantomjs-2.1.1-linux-x86_64/bin
[root@node1 bin]# cp phantomjs /usr/local/bin //复制前端框架到bin目录下
11.安装elasticsearch-head.tar.gz 数据可视化工具
[root@node1 bin]# cd /usr/local/src
[root@node1 src]# rz -E
rz waiting to receive.
[root@node1 src]# ls
elasticsearch-head.tar.gz phantomjs-2.1.1-linux-x86_64.tar.bz2
phantomjs-2.1.1-linux-x86_64
[root@node1 src]# tar zxvf elasticsearch-head.tar.gz
[root@node1 src]# cd elasticsearch-head/
[root@node1 elasticsearch-head]# npm install
11.修改主配置文件
[root@node1 elasticsearch-head]# cd ~
[root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml ##配置文件插在末尾
http.cors.enabled: true ##开启跨域访问支持,默认的是false
http.cors.allow-origin: "*” ####跨域访问允许的域名地址
[root@node1 ~]# systemctl restart elasticsearch.service
[root@node1 ~]# cd /usr/local/src/elasticsearch-head/
[root@node1 elasticsearch-head]# npm run start & //后台运行
[root@node1 elasticsearch-head]# netstat -lunpt | grep 9200 //过滤9200
tcp6 0 0 :::9200 :::* LISTEN 48735/java
[root@node1 elasticsearch-head]# netstat -lunpt | grep 9100 //过滤9100
tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 48486/grunt
12.测试
真机打开浏览器 http://20.0.0.101:9100/ 然后在elasticsearch后面的搜索栏中输入 http://20.0.0.101:9200/ 可以看到如下图群集显示健康是绿色的。
13.添加索引命令
[root@node2 elasticsearch-head]# curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'
- 配置Master服务器
1.安装apache服务(httpd)
[root@master ~]# yum -y install httpd
[root@master ~]# systemctl start httpd.service //开启httpd服务
[root@master ~]# cd /var/log
[root@master log]# cd httpd/
[root@master ~]# java -version
2.安装logstash
上传logstash压缩包到opt目录下
[root@master ~]# cd /opt
[root@master opt]# rz -E
rz waiting to receive.
[root@master opt]# ls
logstash-5.5.1.rpm rh
[root@master opt]# rpm -ivh logstash-5.5.1.rpm
[root@master ~]# systemctl start logstash.service ##开启logstash服务
[root@master ~]# systemctl enable logstash.service ##设置开机自启
Created symlink from /etc/systemd/system/multi-user.target.wants/logstash.service to /etc/systemd/system/logstash.service.
[root@master ~]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/ ###创建软链接
3.输入采用标准输入,输出采用标准输出
[root@master ~]# logstash -e 'input { stdin{} } output { stdout{} }'
[root@master ~]# logstash -e 'input { stdin{} } output { stdout{codec=>rubydebug } }'
www.kgc.com ###输入内容
www.baidu.com ###输入
4.使用logstash将信息写入elasticsearch
[root@master ~]# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["20.0.0.101:9200"] } }'
www.kgc.com
www.baidu.com
5.登录真机打开浏览器输入http://20.0.0.101:9100/ 查看索引信息
会增加如下图所示的索引
[root@master ~]# chmod o+r /var/log/messages //给其他人授予读的权限
[root@master ~]# ll /var/log/messages
-rw----r--. 1 root root 2216038 Oct 29 03:17 /var/log/messages
[root@master ~]# cd /etc/logstash/
6.系统日志文件采集的配置文件
[root@master logstash]# cd conf.d/
[root@master conf.d]# ls
[root@master conf.d]# vim system.conf
input {
file{
path => "/var/log/messages"
type => "system"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["20.0.0.101:9200"]
index => "system-%{+YYY.MM.dd}"
}
}
[root@master conf.d]# systemctl restart logstash.service //重启
7.登录真机打开浏览器输入http://20.0.0.101:9100/ 查看索引信息
会增加如下图所示的索引
8.登录20.0.0.103 kibana主机
上传kibana压缩包到/usr/local/src目录
[root@localhost ~]# hostnamectl set-hostname kibana
[root@localhost ~]# su
[root@kibana ~]# cd /usr/local/src
[root@kibana src]# rz -E
rz waiting to receive.
[root@kibana src]# rpm -ivh kibana-5.5.1-x86_64.rpm
[root@kibana src]# cd /etc/kibana/
[root@kibana kibana]# cp kibana.yml kibana.yml.bak
9.修改kibana配置文件
[root@kibana kibana]# vi kibana.yml ###把该配置文件中修改如下
2 server.port: 5601 ###kibana打开的端口
7 server.host: "0.0.0.0" ####kibana侦听的地址
21 elasticsearch.url: "http://20.0.0.101:9200" #####和elasticserach建立联系
30 kibana.index: ".kibana" ##在elasticsearch中添加.kibana索引
[root@kibana kibana]# systemctl start kibana.service ##启动kibana服务
[root@kibana kibana]# systemctl enable kibana.service ##开机自启kibana服务
Created symlink from /etc/systemd/system/multi-user.target.wants/kibana.service to /etc/systemd/system/kibana.service.
Kibana 是为 Elasticsearch设计的开源分析和可视化平台。你可以使用 Kibana 来搜索,查看存储在Elasticsearch 索引中的数据并与之交互。你可以很容易实现高级的数据分析和可视化,以图标的形式展现出来。
10.登录真机
浏览器输入20.0.0.103:5601
创建一个索引名:system-* ###这是对接系统日志文件
如下图所示
对接apache主机的apache日志文件
[root@master opt]# cd /etc/logstash/conf.d/
[root@master conf.d]# touch apache_log.conf
[root@master 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.101:9200"]
index => "apache_access-%{+YYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["20.0.0.101:9200"]
index => "apache_error-%{+YYY.MM.dd}"
}
}
}
[root@master conf.d]# /usr/share/logstash/bin/logstash -f apache_log.conf
11.登录主机
打开输入http://20.0.0.101:9100 查看索引信息,能发现apache_error apache_access
打开浏览器输入http://20.0.0.101:5601
点击左边的management选项——》index patterns——》create index pattern——分别创建apache_error-*和 apache_access-*的索引