一、ELK日志分析系统简介
- 日志服务器
- 提高安全性
- 集中存放日志
- 缺陷
- 对日志的分析很困难
- ELK日志分析系统
- Elasticsearch:通过搭建群集;存储日志数据,索引日志数据
- Logstash:收集日志,收集到了后给es存储
- Kibana:视图形式展现日志信息,更加人性化
- 日志处理步骤
- 1)将日志进行集中化管理
- 2)将日志格式化(Logstash)并输出到Elasticsearch
- 3)对格式化后的数据进行索引和存储(Elasticsearch)
- 4)前段数据的展示(Kibana)
二、Elasticsearch介绍
- Elasticsearch的概述
- 提供了一个分布式多用户能力的全文搜索引擎
- Elasticsearch核心概念
- 接近实时(NRT)
lasticsearch是一个接近实时的搜索品台,这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒) - 集群(cluster)
es具有集群机制,节点通过集群名称加入到集群中,同时在集群中的节点会有自己的唯一身份标识 - 节点
节点就是一台单一的服务器,是集群的一部分,存储数据并参与集群的索引和搜索功能。项集群一样,节点也是通过名字来标识,默认是在节点启动时随机分配的字符名,也可以自定义名字,是用于识别服务器对应的节点。
节点可以通过指定集群名字来加入到集群中。默认情况,每个节点被设置成加入到elasticsearch集群。如果启动了多个节点,假设能自动发现对方,他们将会自动组建一个名为elasticsearch的集群。 - 索引
- 索引(库)——>类型(表)——>文档(记录)
- 分片和副本
分片的两个最主要原因:1.水平分割扩展,增大存储量 2.分布式并行跨分片操作,提高性能和吞吐量
副本的两个最主要原因:1.高可用性,以应对分片或节点故障。处于这个原因,分片副本要在不同节点上 2.增大吞吐量,搜索可以并行在所有副本上执行
- 接近实时(NRT)
三、Logstash介绍
- 一款强大的数据处理工具
- 可实现数据传输、格式处理、格式化输出
- 数据输入、数据加工(如过滤、改写等)以及数据输出
四、Logstash主要组件
- Shipper日志收集者:负责监控本地日志文件的变化,及时把日志文件的最新内容收集起来
- Indexer日志存储者:负责接收日志并写入到本地文件
- Broker日志Hub:负责连接多个Shipper和多个Indexer
- Search and Storage:允许对时间进行搜索和存储
- Web Interface:基于Web的展示界面
五、Kibana介绍
- 一个针对Elasticsearch的开源分析及可视化平台
- 搜索、查看存储在Elasticsearch索引棕的数据
- 通过各种图表进行高级数据分析及展示
六、Kibana主要功能
- Elasticsearch无缝之集成
- 整合数据,复杂数据分析
- 让更多团队成员受益
- 接口灵活,分享更容易
- 配置简单,可视化多数据源
- 简单数据导出
七、搭建部署
7.1 部署环境
node1节点:192.168.10.10 主要软件:es数据库和Kibana
node2节点:192.168.10.20 主要软件:es数据库
Apache节点:192.168.10.30 主要软件:httpd和Logstash
7.2 三个节点添加主机映射,并安装JDK
vi /etc/hosts
192.168.10.10 node1
192.168.10.20 node2
tar zxf jdk-8u91-linux-x64.tar.gz
mv jdk1.8.0_91/ /usr/local/java
cd /etc/profile.d/
vim java.sh
export JAVA_HOME=/usr/local/java ##设置java根目录
export PATH=$PATH:$JAVA_HOME/bin ##在PATH环境变量中添加JAVA根目录下的bin子目录
source java.sh ##java.sh脚本导入到环境变量,使其生效
7.3 node1节点和node2节点部署elasticsearch软件
注意:node1和node2部署过程相同,但是在修改配置文件时需要注意node.name的时候需要对应各节点自己的主机名
[root@node1 ~]# rpm -ivh elasticsearch-5.5.0.rpm
[root@node1 ~]# systemctl daemon-reload
[root@node1 ~]# systemctl enable 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 ## 17行修改集群名称两个节点保持一致
23 node.name: node1 ## 23行修改节点名称两个节点对应自己的主机名
33 path.data: /data/elk_data ## 33行修改工作目录
37 path.logs: /var/log/elasticsearch/ ## 37行修改工作目录
43 bootstrap.memory_lock: false ## 43行防止交换swap分区
55 network.host: 0.0.0.0 ## 55行监听所有网段
59 http.port: 9200 ## 59行开启9200端口
68 discovery.zen.ping.unicast.hosts: ["node1", "node2"] ## 68行集群发现通过单播实现,单播的主机名为"node1",和"node2"
## 创建工作目录授权,开启服务
[root@node1 ~]# mkdir -p /data/elk_data
[root@node1 ~]# chown elasticsearch:elasticsearch /data/elk_data/
[root@node1 ~]# systemctl start elasticsearch.service
[root@node1 ~]# netstat -anpt | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 93303/java
打开浏览器测试
7.4 node1和node2节点安装elasticsearch-head插件
7.4.1 编译安装node组件
[root@node1 ~]# tar xzvf node-v8.2.1.tar.gz
[root@node1 ~]# cd node-v8.2.1/
[root@node1 node-v8.2.1]# ./configure
[root@node1 node-v8.2.1]# make && make install
7.4.2 安装phantomjs和elasticsearch-head
[root@node1 ~]# tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2
[root@node1 ~]# mv phantomjs-2.1.1-linux-x86_64 /usr/local/src/
[root@node1 ~]# cp /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/
[root@node1 ~]# tar zxvf elasticsearch-head.tar.gz
[root@node1 ~]# mv elasticsearch-head /usr/local/src/
[root@node1 ~]# cd /usr/local/src/elasticsearch-head/
[root@node1 elasticsearch-head]# npm install
## 修改主配置文件在末尾添加如下内容
[root@node1 ~]# vi /etc/elasticsearch/elasticsearch.yml
http.cors.enabled: true
http.cors.allow-origin: "*"
[root@node1 ~]# systemctl restart elasticsearch ## 重启服务,使修改内容生效
## 启动elasticsearch-head服务在后台运行
[root@node1 ~]# cd /usr/local/src/elasticsearch-head/
[root@node1 elasticsearch-head]# npm run start &
## 检查9200和9100是否正常启动
[root@node1 ~]# netstat -anpt | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 93303/java
[root@node1 ~]# netstat -anpt | grep 9100
tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 93426/grunt
验证:
7.4.3 添加索引
curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'
7.5 apache节点安装logstash
## 安装Apache服务
[root@apache ~]# yum -y install httpd
[root@apache ~]# systemctl start httpd
[root@apache ~]# netstat -anpt | grep httpd
tcp6 0 0 :::80 :::* LISTEN 17190/httpd
## 安装JDK
[root@apache ~]# tar zxf jdk-8u91-linux-x64.tar.gz
[root@apache ~]# mv jdk1.8.0_91/ /usr/local/java
[root@apache ~]# cd /etc/profile.d/
[root@apache profile.d]# vim java.sh
[root@apache profile.d]# source java.sh
## 安装logstash
## 上传依赖包到opt目录安装并启动服务
[root@apache opt]# rpm -ivh logstash-5.5.1.rpm
警告:logstash-5.5.1.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID d88e42b4: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:logstash-1:5.5.1-1 ################################# [100%]
Using provided startup.options file: /etc/logstash/startup.options
Successfully created system startup script for Logstash
[root@apache opt]# systemctl start logstash.service
[root@apache opt]# systemctl enable logstash.service
Created symlink from /etc/systemd/system/multi-user.target.wants/logstash.service to /etc/systemd/system/logstash.service.
[root@apache opt]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
## 使用Logstash将信息写入到es数据库中
[root@apache opt]# logstash -e 'input{ stdin{} } output {elasticsearch {hosts => ["192.168.10.10:9200"]}}'
www.baidu.com ##输入
www.sina.com
www.google.com
浏览器访问192.168.10.10:9100查看索引信息
7.6 Apache主机做对接配置
[root@apache ~]# chmod o+r /var/log/messages =
[root@apache ~]# vim /etc/logstash/conf.d/system.conf
vi /etc/logstash/conf.d/system.conf
input {
file{
path => "/var/log/messages" ## 从/var/log/messages输入
type => "system" ## 类型为system
start_position => "beginning" ## 起始位
}
}
output { ## 输出:输出给es数据库
elasticsearch {
hosts => ["192.168.10.10:9200"] ## ip地址指定es数据库
index => "system-%{+YYYY.MM.dd}"
}
}
[root@apache ~]# systemctl restart logstash.service
7.7 在node1节点安装kibana
[root@node1 ~]# mv kibana-5.5.1-x86_64.rpm /usr/local/src/
[root@node1 ~]# cd /usr/local/src/
[root@node1 src]# rpm -ivh kibana-5.5.1-x86_64.rpm
[root@node1 src]# cp /etc/kibana/kibana.yml /etc/kibana/kibana.yml.bak ## 备份主配置文件
[root@node1 src]# vi /etc/kibana/kibana.yml ## 修改主配置文件
2 server.port: 5601 ## 第2行,开启端口
7 server.host: "0.0.0.0" ## 第4行,监听网络
21 elasticsearch.url: "http://192.168.10.10:9200" ## 21行,es数据库的地址
30 kibana.index: ".kibana"
[root@node1 ~]# systemctl start kibana.service
[root@node1 ~]# systemctl enable kibana.service
Created symlink from /etc/systemd/system/multi-user.target.wants/kibana.service to /etc/systemd/system/kibana.service.
浏览器访问kibana主页192.168.10.10:5601
首次登录提示创建一个索引名字:填入system-*
7.8 对接Apache主机的Apache日志文件
[root@apache ~]# cd /etc/logstash/conf.d/
[root@apache conf.d]# touch apache_log.conf
[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 => ["192.168.10.10:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["192.168.10.10:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}
[root@apache conf.d]# /usr/share/logstash/bin/logstash -f apache_log.conf
先访问Apache主页,再在Kibana主页中新建访问、错误日志的索引