目录
一、ELK简介
日志分析是运维工程师解决系统故障,发现问题的主要手段。日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因,经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
日志是一个非常庞大的数据,并且常常被分散在不同的设备上,这样排查问题的时候找日志就非常繁琐困难。
这时,一个专门处理日志的系统就非常必要,这里介绍其中的一种,ELK日志分析系统(ELasticsearch+Logstash+Kibana)
日志服务器
提高安全性、集中存放日志、缺陷:对日志分析困难
ELK日志分析系统的日志处理步骤
- 将日志进行集中化管理
- 将日志格式化(logstash)
- 对格式化后的数据进行索引和存储(elasticsearch)
- 前端数据的展示(Kibana)
- 用户通过自己的设备访问Kibana页面查看
二、Elasticsearch简介
■ Elasticsearch的概述
提供了一个分布式多用户能力的全文搜索引擎
■ Elasticsearch核心概念
- 接近实时
- 集群
- 节点
- 索引
◆索引(库)> 类型(表)> 文档(记录) - 分片和副本
三、Logstash简介
■ Logstash介绍
- 一款强大的数据处理工具
- 可实现数据传输、格式处理、格式化输出
- 数据输入、数据加工(如过滤,改写等)以及数据输出
■ LogStash主要组件·
- Shipper: 日志收集者。负责监控本地日志文件的变化,及时收集最新的日志文件内容。
- Indexer:日志存储者。负责接收日志并写入到本地文件。
- Broker: 日志Hub。 负责连接多个Shipper 和多个Indexer.
- Search and Storage: 允许对事件进行搜索和存储。
- Web Interface: 基于Web 的展示界面。
在Logstash 中,包括了三个阶段,分别是输入(Input )、处理(Filter, 非必需)和输出(Output) 。
四、Kibana简介
■ Kibana介绍
- 一个针对Elasticsearch的开源分析及可视化平台
- 搜索、查看存储在Elasticsearch索引中的数据
- 通过各种图表进行高级数据分析及展示
■ Kibana主要功能
- Elasticsearch无缝之集成
- 整合数据,复杂数据分析
- 让更多团队成员受益
- 接口灵活,分享更容易
- 配置简单,可视化多数据源
- 简单数据导出
五、ELK案例部署
5.1 案例环境
一台主机部署Apache服务,并部署logstash收
一台主机部署elasticsearch和kibana
另一台部署elasticsearch
两台elasticsearch构成ELS群集
需求:
- 配置ELK日志分析群集
- 使用logstash收集Apache日志信息
- 由elasticsearch存储和建立索引
- 使用Kibana查看分析日志
5.2 部署elasticsearch
两台主机修改主机名为node1,node2,并添加IP与主机名的映射,再配置elasticsearch,以node1为例
安装elasticsearch
#准备yum源,yum安装
rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
cd /etc/yum.repo.d/
vim 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
yum install elasticsearch -y
yum install java -y (1.8版本) #安装Java,因为有JVM,日志收集最好的开发语言就是java
修改配置文件
[root@node1 ~]# cd /etc/elasticsearch/
[root@node1 elasticsearch]# ls
elasticsearch.yml log4j2.properties jvm.options scripts
[root@node1 elasticsearch]# cp -p elasticsearch.yml elasticsearch.yml.bak ## 先把原配置文件做一下备份,再修改配置文件
[root@node1 elasticsearch]# vim elasticsearch.yml
17: cluster.name: elk-cluster ## 集群名称
23: node.name: node1 ## 当前节点名
33: path.data: /data/elk-data ## 数据存储的位置(目录不存在,需要创建)
37: path.logs: /var/log/elasticsearch/ ## 日志文件存放的位置
43: bootstrap.memory_lock: false
## true:允许内存中的数据交还给SWAP,flase:不允许内存中的数据交还给SWAP。
选择false,因为swap分区实在硬盘上建立的,如果内存不够,数据溢出,分到硬盘上的话,会影响速度
55: network.host: 0.0.0.0 ## 监听地址,0.0.0.0表示所有网段
59: http.port: 9200 ## ES端口号,外部通信的端口号 PS:9300是集群内部通信端口
68: discovery.zen.ping.unicast.hosts: ["node1", "node2"] ## 群集中包含的节点名
开启服务
[root@node1 elasticsearch]# mkdir -p /data/elk-data ## 创建数据存放目录
[root@node1 elasticsearch]# id elasticsearch ## ES的程序用户,安装的时候自动创建的用户
uid=990(elasticsearch) gid=985(elasticsearch) 组=985(elasticsearch)
[root@node1 elasticsearch]# chown elasticsearch.elasticsearch /data/elk-data/ ## 授权,交给用户 elasticsearch去管理
[root@node1 elasticsearch]# systemctl start elasticsearch.service ## 开启服务
[root@node1 elasticsearch]# netstat -anpt | grep 9200 ## 过滤9200端口(外部访问集群端口)
tcp6 0 0 :::9200 :::* LISTEN 15726/java
网页测试,访问此端口,可查看节点信息
群集健康状态检查
群集属性状态 ,可以看到群集内部通信端口9300
安装elasticsearch-head插件,可视化工具,更方便查看集群信息,并管理集群,以node1为例
[root@node1 ~]# /usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head
安装位置/usr/share/elasticsearch/plugins/head
访问head插件页面
创建一个索引信息,创建索引为index-demo,类型为test,可以看到成功创建,这里的数据会被存储到ES集群中。
curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello}‘
刷新一下,可以看到存储的分片处理与备份,暂时不存在节点间的主备关系。加粗的是主文件的,细框的是备份文件,不论哪个节点宕机,存储都不会丢失,很安全,一个节点有五个分片,两个节点共10个分片
利用组件的复合查询进行索引的创建、查询、删除
创建索引index-demo2
提交后结果
可看到分片存储情况
查询
删除
设置主备节点,node1为主,node2为备
先关闭node2的elasticsearch,重启node1服务,再开启node2 (主备由先后开启服务决定),刷新查看分片情况:
elasticsearch的监控组件安装
/usr/share/elasticsearch/bin/plugin install lmenezes/elasticsearch-kopf
访问http://192.168.247.160:9200/_plugin/kopf/#!/cluster
在生产环境中
--------------生产环境中必须要修改(注意)------------------
ulimit -a
open files (-n) 1024
方法:
/etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
//重启生效
--------------------------------------------------
解决de-01和node-02日志提示不让锁内存
less /var/log/elasticsearch/abner.log
......
vim /etc/security/limits.conf
//末尾插入
# allow user 'elasticsearch' mlockall
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
systemctl stop elasticsearch.service
systemctl start elasticsearch.service
5.3 部署Apache、logstash
yum简易安装Apache
[root@client ~]# yum -y install httpd
[root@client ~]# systemctl start httpd
[root@client ~]# ll /etc/httpd/logs/ #开启服务后,日志自动生成
总用量 4
-rw-r--r--. 1 root root 0 11月 18 08:36 access_log
-rw-r--r--. 1 root root 941 11月 18 08:36 error_log
安装logstash
# 准备yum源
[root@client ~]# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
[root@client ~]# cd /etc/yum.repos.d/
[root@client yum.repos.d]# vim 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
[root@client yum.repos.d]# yum install logstash -y
[root@client yum.repos.d]# ln -s /opt/logstash/bin/logstash /usr/local/bin/
[root@client yum.repos.d]# systemctl start logstash.service
查看java版本
[root@client yum.repos.d]# 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)
logstash(Apache)与elasticsearch (node)功能是否正常,做对接测试
logstash字段描述解释:
-f通过这个选项可以指定logstash的配置文件,根据配置文件配置logstash
-e后面跟着字符串该字符串可以被当做logstash的配置(如果是””,则默认使用stdin做为输入、stdout作为输出)
-t测试配置文件是否正确,然后退出
定义输入和输出流,类似管道,并验证输入输出
[root@client ~]# /opt/logstash/bin/logstash -e 'input { stdin{} } output { stdout{} }'
Settings: Default filter workers: 1
Logstash startup completed
www.baidu.com #输入
2020-11-18T00:59:30.296Z client www.baidu.com #输出
www.taobao.com #输入
2020-11-18T00:59:42.230Z client www.taobao.com #输出
验证输出格式化,使用 rubydebug 显示详细信息输出,code为一种编解码
[root@client ~]# /opt/logstash/bin/logstash -e 'input { stdin{} } output { stdout{codec => rubydebug} }'
Settings: Default filter workers: 1
Logstash startup completed
yiyi123123 #输入
{ #输出
"message" => "yiyi123123",
"@version" => "1",
"@timestamp" => "2020-11-18T01:03:03.212Z",
"host" => "client"
}
使用logstash将信息写入elasticsearch 输入 输出 对接
[root@client bin]# /opt/logstash/bin/logstash -e 'input { stdin{} } output { elasticsearch { hosts => ["192.168.247.160:9200"] } }'
Settings: Default filter workers: 1
Logstash startup completed
www.baidu.com #输入三条数据
aaa123
bbb111
在node1上查看elasticsearch网页,成功输出
写入ES和同时生成文本
[root@client bin]# /opt/logstash/bin/logstash -e 'input { stdin{} } output { elasticsearch { hosts => ["192.168.247.160:9200"] } stdout { codec => rubydebug } }'
Settings: Default filter workers: 1
Logstash startup completed
liliy111 #输入
{
"message" => "liliy111",
"@version" => "1",
"@timestamp" => "2020-11-18T01:27:33.127Z",
"host" => "client"
}
测试系统日志能否被采集
[root@client bin]# vi /etc/logstash/conf.d/system.conf
input {
file{
path => "/var/log/messages"
type => "system" #系统类型
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["192.168.247.160:9200"]
index => "system-%{+YYYY.MM.dd}"
}
}
[root@client bin]# logstash -f /etc/logstash/conf.d/system.conf #指定logstash配置文件,输出系统日志
#node1上重启elasticsearch
[root@node1 elasticsearch-head]# systemctl restart elasticsearch.service
刷新网页,查看索引数据,成功输出了系统日志
查看索引切片情况
5.4 在node1节点安装kibana
xshell传入kibana安装包
[root@node1 ~]# mkdir -p /usr/local/kibana
[root@node1 ~]# tar xzf kibana-4.3.1-linux-x64.tar.gz -C /usr/local/kibana
#修改配置文件
[root@node1 ~]# vi /usr/local/kibana/kibana-4.3.1-linux-x64/config/kibana.yml
//2行
server.port: 5601 #服务端口安徽
//5行
server.host: "0.0.0.0"
//12行 ES地址
elasticsearch.url: "http://192.168.247.160:9200“ #和ES建立联系
//20行
kibana.index: ".kibana" #建立索引
[root@node1 ~]# yum install screen -y
[root@node1 ~]# /usr/local/kibana/kibana-4.3.1-linux-x64/bin/kibana #启动kibana监听
#ctrl+a+d 进行丢入后台
5.4.1 对接system系统日志
访问192.168.247.160:5601,kibana,创建system的索引图表,对接了system的系统日志
Discover里查看日志,图表式显示
5.4.2 对接Apache日志
#在logstash上输入Apache日志,输出到elasticsearch
[root@client ~]# vi /etc/logstash/conf.d/apache-log.conf
input { #输入Apache日志
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 { #输出到ES
if [type] == "access" {
elasticsearch {
hosts => ["192.168.247.160:9200"]
index => "apache_access.%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["192.168.247.160:9200"]
index => "apache_error.%{+YYYY.MM.dd}"
}
}
}
[root@client ~]# logstash -f /etc/logstash/conf.d/apache_log.conf #启动脚本,进行输出
刷新ES网页,查看索引,建议先访问apache页面,否则可能刷新不出来
在kibana创建Apache索引图表
查看图表日志