ELK日志分析系统
ELK
- ELK日志分析
- 日志服务器
- ELK日志分析系统组成
- 处理步骤
- Elasticsearch索引数据库
- 概述
- 核心理念
- Logstash
- Kibana
- 项目配置
- 环境准备
- 配置文件
ELK日志分析
日志服务器
- 提高安全性
- 集中存放日志
- 缺陷
- 对日志的分析困难
ELK日志分析系统组成
- Elasticsearch
- Logstash
- Kibana
处理步骤
将日志进行集中化管理
- 因为es拥有前端和后端所有集群的数据信息,对于es来说就是集中化管理,不需要每一台去收集,Logstash回去收集信息,只需管理和 Logstash对接的日志数据源就可以
将日志格式化(Logstash) 并输出到Elasticsearch
- 格式化目的:输出为一个标准可以作为展示页面的输出
对格式化后的数据进行索引和存储( Elasticsearch)
- 非常强大的索引,百度和谷歌都用这个搜索引擎
前端数据的展示( Kibana)
Elasticsearch索引数据库
概述
- 提供了一个分布式多用户能力的全文搜索引擎
- 搜索引擎效率高是因为有分片和副本机制
核心理念
接近实时(NRT)
- elasticsearch是一个接近实时的搜索平台,这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒)
集群(cluster)
- 一个集群就是由一个或多个节点组织在一起,它们共同持有你整个的数据,并一起提供索引和搜索功能。其中一个节点为主节点,这个主节点是可以通过选举产生的,并提供跨节点的联合索引和搜索的功能。集群有一个唯一性标示的名字,默认是elasticsearch,集群名字很重要,每个节点是基于集群名字加入到其集群中的。因此,确保在不同环境中使用不同的集群名字。
- 一个集群可以只有一个节点。强烈建议在配置elasticsearch时,配置成集群模式。
节点(node)
- 节点就是一台单一的服务器,是集群的一部分,存储数据并参与集群的索引和搜索功能。像集群一样,节点也是通过名字来标识,默认是在节点启动时随机分配的字符名。当然,你可以自己定义。该名字也很重要,在集群中用于识别服务器对应的节点。
- 节点可以通过指定集群名字来加入到集群中。默认情况,每个节点被设置成加入到elasticsearch集群。如果启动了多个节点,假设能自动发现对方,他们将会自动组建一个名为elasticsearch的集群。
索引(type)
- 在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。
- 类型相对于关系型数据库的表
- 索引(库)–》类型(表)–》文档(记录)
- 类型相对于关系型数据库的表
- 在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。
分片和副本(shards & replicas)
- 在实际情况下,索引存储的数据可能超过单个节点的硬件限制。如一个10亿文档需1TB空间可能不适合存储在单个节点的磁盘上,或者从单个节点搜索请求太慢了。为了解决这个问题,elasticsearch提供将索引分成多个分片的功能。当在创建索引时,可以定义想要分片的数量。每一个分片就是一个全功能的独立的索引,可以位于集群中任何节点上。
每个索引可以被分成多个分片。一个索引也可以被复制0次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和副本的数量可以在索引创建的时候指定。 - 在索引创建之后,你可以在任何时候动态地改变副本的数量,但是你事后不能改变分片的数量。
- 默认情况下,Elasticsearch中的每个索引被分片5个主分片和1个副本,这意味着,如果你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个副本分片(1个完全拷贝),这样的话每个索引总共就有10个分片
- 在实际情况下,索引存储的数据可能超过单个节点的硬件限制。如一个10亿文档需1TB空间可能不适合存储在单个节点的磁盘上,或者从单个节点搜索请求太慢了。为了解决这个问题,elasticsearch提供将索引分成多个分片的功能。当在创建索引时,可以定义想要分片的数量。每一个分片就是一个全功能的独立的索引,可以位于集群中任何节点上。
Logstash
- 一款强大的数据处理工具
- 可实现数据传输、格式处理、格式化输出
- 数据输入(从业务输入)、数据加工(如过滤、改写等)以及数据输出(输出到Elasticsearch群集)
- Logstash的主要组件
shipper:日志收集者,负责监控本地日志文件的变化,及时把日志文件的最新内容收集起来。通常,远程代理端(agent)只需要运行这个组件即可indexer:日志存储者,负责接收日志并写入到本地文件broker:日志hub,负责连接多个shipper和多个indexersearch and storage:允许对事件进行搜索和存储web interface:基于Web的展示界面
Kibana
- 一个针对Elasticsearch的开源分析及可视化平台
- 搜索、查看存储在Elasticsearch索引中的数据
- 通过各种图表进行高级数据分析及展示
- 主要功能
- Elasticsearch无缝之集成
- 整合数据,复杂数据分析
- 让更多团队成员收益
- 接口灵活,分享更容易
- 配置简单,可视化多数据源
- 简单数据导出
项目配置
环境准备
node01 20.0.0.14
node02 20.0.0.15
apache 20.0.0.13
配置文件
在node01,node02上配置
[root@node01 ~]# vi /etc/hosts[root@node01 ~]# java -version
node01,node02
[root@node01 ~]# rpm -ivh elasticsearch-5.5.0.rpm 警告:elasticsearch-5.5.0.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID d88e42b4: NOKEY准备中... ################################# [100%]Creating elasticsearch group... OKCreating elasticsearch user... OK正在升级/安装... 1:elasticsearch-0:5.5.0-1 ################################# [100%]### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd sudo systemctl daemon-reload sudo systemctl enable elasticsearch.service### You can start elasticsearch service by executing sudo systemctl start elasticsearch.service[root@node01 ~]# systemctl daemon-reload [root@node01 ~]# systemctl enable elasticsearch.service Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.
[root@node01 ~]# cd /etc/elasticsearch/[root@node01 elasticsearch]# ll总用量 16-rw-rw----. 1 root elasticsearch 2854 7月 1 2017 elasticsearch.yml-rw-rw----. 1 root elasticsearch 3117 7月 1 2017 jvm.options-rw-rw----. 1 root elasticsearch 4456 7月 1 2017 log4j2.propertiesdrwxr-x---. 2 root elasticsearch 6 7月 1 2017 scripts[root@node01 elasticsearch]# cp elasticsearch.yml elasticsearch.yml.bak #备份[root@node01 elasticsearch]# ll总用量 20-rw-rw----. 1 root elasticsearch 2854 7月 1 2017 elasticsearch.yml-rw-r-----. 1 root root 2854 1月 5 22:45 elasticsearch.yml.bak-rw-rw----. 1 root elasticsearch 3117 7月 1 2017 jvm.options-rw-rw----. 1 root elasticsearch 4456 7月 1 2017 log4j2.propertiesdrwxr-x---. 2 root elasticsearch 6 7月 1 2017 scripts
[root@node01 elasticsearch]# vi elasticsearch.yml17行 cluster.name: my-elk-cluster23行 node.name: node0133行 path.data: /data/elk_data37行 path.logs: /var/log/elasticsearch/43行 bootstrap.memory_lock: false55行 network.host: 0.0.0.059行 http.port: 920068行 discovery.zen.ping.unicast.hosts: ["node01", "node02"] [root@node01 elasticsearch]# grep -v "^#" /etc/elasticsearch/elasticsearch.yml #反向过滤掉带#号的行[root@node01 elasticsearch]# mkdir -p /data/elk_data[root@node01 elasticsearch]# chown elasticsearch.elasticsearch /data/elk_data/[root@node01 elasticsearch]# systemctl start elasticsearch.service #开启服务[root@node01 elasticsearch]# netstat -ntap | grep 9200 #查看端口服务 开启的比较慢需要等待一会儿
检查验证
在本地浏览器中访问
node02上按照node01的配置进行适当修改即可
集群检查健康
浏览器上输入
http://20.0.0.14:9200/_cluster/health?pretty
http://20.0.0.15:9200/_cluster/health?pretty
群集检查状态
http://20.0.0.14:9200/_cluster/state?pretty
http://20.0.0.15:9200/_cluster/state?pretty
安装elasticsearch-head插件
编译安装node组件依赖包
[root@node01 ~]# tar zxvf node-v8.2.1.tar.gz[root@node01 ~]# ll[root@node01 ~]# cd node-v8.2.1/[root@node01 node-v8.2.1]# ./configure[root@node01 node-v8.2.1]# make[root@node01 node-v8.2.1]# make install
安装phantomjs前端框架
[root@node01 ~]# tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2[root@node01 ~]# cd phantomjs-2.1.1-linux-x86_64/bin[root@node01 bin]# cp phantomjs /usr/local/bin
安装可视化工具
[root@node01 ~]# tar zxvf elasticsearch-head.tar.gz[root@node01 ~]# cd elasticsearch-head/[root@node01 elasticsearch-head]# npm install
编辑配置文件
[root@node01 ~]# vi /etc/elasticsearch/elasticsearch.yml末尾添加http.cors.enabled: true #开启跨域访问支持,默认为falsehttp.cors.allow-origin: "*" #跨域访问允许的域名地址
启动elasticsearch-head
[root@node01 ~]# cd elasticsearch-head/[root@node01 elasticsearch-head]# npm run start & #切换到后台运行[1] 112034[root@node01 elasticsearch-head]# > elasticsearch-head@0.0.0 start /root/elasticsearch-head> grunt serverRunning "connect:server" (connect) taskWaiting forever...Started connect web server on http://localhost:9100[root@node01 elasticsearch-head]# netstat -lnupt | grep 9100tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 112044/grunt [root@node01 elasticsearch-head]# netstat -lnupt | grep 9200tcp6 0 0 :::9200 :::* LISTEN 111214/java
node02上也需要打以上的命令
在浏览器上输入20.0.0.14:9100/ 查看
输入20.0.0.15:9100 查看效果
添加索引
先在页面创建索引 再添加配置
node1上查看添加的索引
[root@node01 ~]# curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'-XPUT ‘localhost:9200 #指定在本地/index-demo/test/ #索引中建立test1?pretty&pretty’ #问好后面跟一些参数application/json #以json格式插入数据
再次连接 20.0.0.14:9200/
查看添加的信息
添加成功
Apache主机上安装logstash
安装apache
[root@apache ~]# yum -y install httpd[root@apache ~]# systemctl start httpd[root@apache ~]# netstat -anpt | grep httpd
安装logstash
添加软件包
[root@apache ~]# 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)[root@apache ~]# rpm -ivh logstash-5.5.1.rpm#启动logstash,并设置开机自启[root@apache ~]# systemctl start logstash.service[root@apache ~]# systemctl enable logstash.service
创建软链接
[root@apache ~]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
网页对接
[root@apache ~]# logstash -e 'input { stdin{} } output { stdout{} }'
验证logstash可进行格式化输出
# 使用rubydebug显示详细输出,codec为一种编解码器[root@apache ~]# logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
使用logstash将信息写入到elasticsearch
[root@apache ~]# logstash -e 'input { stdin{} } output { elasticsearch{ hosts=>["20.0.0.14:9200"] } }'
浏览器浏览集群
在apache主机做对接配置
logstash配置文件主要由三部分组成:
- input
- output
- filter
[root@apache ~]# ll /var/log/messages-rw-------. 1 root root 680574 1月 7 13:03 /var/log/messages[root@apache ~]# chmod o r /var/log/messages[root@apache ~]# ll /var/log/messages-rw----r--. 1 root root 688306 1月 7 13:04 /var/log/messages[root@apache ~]# cd /etc/logstash/[root@apache logstash]# lsconf.d jvm.options log4j2.properties logstash.yml startup.options[root@apache logstash]# cd conf.d/[root@apache conf.d]# vi system.conf#添加input { file{ path => "/var/log/messages" type => "system" start_position => "beginning" } }output { elasticsearch { hosts => ["20.0.0.14:9200"] index => "system-%{ YYYY.MM.dd}" } }[root@apache conf.d]# systemctl restart logstash.service
浏览器中访问
在node01上安装kibana
[root@node01 ~]# rpm -ivh kibana-5.5.1-x86_64.rpm
配置文件
[root@node01 ~]# cd /etc/kibana/[root@node01 kibana]# cp kibana.yml kibana.yml.bak[root@node01 kibana]# vi kibana.yml第二行 server.port: 5601第七行 server.host: "0.0.0.0"第二十一行 elasticsearch.url: "http://20.0.0.14:9200"第三十行 kibana.index: ".kibana"[root@node01 kibana]# systemctl start kibana.service #重启服务[root@node01 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.14:5601
创建
system-*
查看创建的信息
以不同的类型来查看
对接apache主机的apache日志文件
在Apache主机上
[root@apache conf.d]# vi apache_log.confinput { 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.14:9200"] index => "apache_access-%{ YYYY.MM.dd}" } } if [type] == "error" { elasticsearch { hosts => ["20.0.0.14:9200"] index => "apache_error-%{ YYYY.MM.dd}" } } }[root@apache conf.d]# logstash -f apache_log.conf
浏览器访问
20.0.0.14:9100
浏览器访问apache主机20.0.0.13
然后访问20.0.0.14:9100
查看apache_access
查看apache_error
查看kibana,并创建新索引
apache_access-*
apache_error-*
查看
创建成功
ELK完成来源:https://www.icode9.com/content-4-812951.html