这里写目录标题
一、ELK简介
顾名思义ELK是由Elasticsearch,Logstash,Kibana三大组件构成的一个基于web页面的日志分析工具。
日志分析是运维工程师解决系统故障,发现问题的主要手段。日志包含多种类型,包括程序日志,系统日志以及安全日志等。通过对日志分析,预发故障的发生,又可以在故障发生时,寻找到蛛丝马迹,快速定位故障点。及时解决。
组件结构:
- Elasticsearch:是一个开源分布式时实分析搜索引擎,建立在全文搜索引擎库Apache Lucene基础上,同时隐藏了Apache Lucene的复杂性。Elasticsearch将所有的功能打包成一个独立的动画片,索引副本机制,RESTful风格接口,多数据源。自动搜索等特点。
- Logstash :是一个完全开源的工具,主要用于日志收集,同时可以对数据处理,并输出给Elasticarch
- Kibana:也是一个完全开源的工具,kibana可以为Logstash和Elasticsearch提供图形化的日志分析。Web界面,可以汇总,分析和搜索重要数据日志。
日志服务器
提高安全性、集中存放日志
缺陷:对日志分析困难
ELK日志分析系统的日志处理步骤
- 将日志进行集中化管理
- 将日志格式化(logstash)
- 对格式化后的数据进行索引和存储(elasticsearch)
- 前端数据的展示(Kibana)
- 用户通过自己的设备访问Kibana页面查看
二、ELK组件介绍
2.1 ELasticsearch的概述
- 提供了一个分布式多用户能力的全文搜索引擎
2.2 Elasticsearch核心概念
- 接近实时
elasticsearch是一个接近实时的搜索平台,这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒)
- 集群
一个集群就是由一个或多个节点组织在一起,它们共同持有你整个的数据,并一起提供索引和搜索功能。其中一个节点为主节点,这个主节点是可以通过选举产生的,并提供跨节点的联合索引和搜索的功能。集群有一个唯一性标示的名字,默认是elasticsearch,集群名字很重要,每个节点是基于集群名字加入到其集群中的。因此,确保在不同环境中使用不同的集群名字。一个集群可以只有一个节点。强烈建议在配置elasticsearch时,配置成集群模式。
- 节点
节点就是一台单一的服务器,是集群的一部分,存储数据并参与集群的索引和搜索功能。像集群一样,节点也是通过名字来标识,默认是在节点启动时随机分配的字符名。当然,你可以自己定义。该名字也很重要,在集群中用于识别服务器对应的节点。节点可以通过指定集群名字来加入到集群中。默认情况,每个节点被设置成加入到elasticsearch集群。如果启动了多个节点,假设能自动发现对方,他们将会自动组建一个名为elasticsearch的集群。
- 索引
索引(库)→类型(表)→文档(记录)
- 分片和副本
在实际情况下,索引存储的数据可能超过单个节点的硬件限制。如一个10亿文档需1TB空间可能不适合存储在单个节点的磁盘上,或者从单个节点搜索请求太慢了。为了解决这个问题,elasticsearch提供将索引分成多个分片的功能。当在创建索引时,可以定义想要分片的数量。每一个分片就是一个全功能的独立的索引,可以位于集群中任何节点上。
每个索引可以被分成多个分片。一个索引也可以被复制0次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和副本的数量可以在索引创建的时候指定。
在索引创建之后,你可以在任何时候动态地改变副本的数量,但是你事后不能改变分片的数量。
默认情况下,Elasticsearch中的每个索引被分片5个主分片和1个副本,这意味着,如果你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个副本分片(1个完全拷贝),这样的话每个索引总共就有10个分片。
2.3 Logstash介绍
-
Logstash介绍
- 一款强大的数据处理工具
- 可实现数据传输、格式处理、格式化输出
- 数据输入、数据加工(如过滤,改写等)以及数据输出
-
Logstash主要组件
- Shipper:日志收集者,负责监控本地日志文件的变化,及时把日志文件的最新内容收集起来。通常,远程代理端(agent)只需要运行这个组件即可\
- Indexer:日志存储者,负责接收日志并写入到本地文件
- Broker:日志hub,负责连接多个shipper和多个indexer
- Search and Storage:允许对事件进行搜索和存储
- Web Interface:基于Web的展示界面
2.4 Kibana介绍
-
Kibana介绍
- 一个针对Elasticsearch的开源分析及可视化平台
- 搜索、查看存储在Elasticsearch索引中的数据
- 通过各种图表进行高级数据分析及展示
-
Kibana主要功能
- Elasticsearch无缝之集成
- 整合数据,复杂数据分析
- 让更多团队成员受益
- 接口灵活,分享更容易
- 配置简单,可视化多数据源
- 简单数据导出
三、案例部署
3.1 案例环境
主机名 | IP地址 | 主要软件 |
---|---|---|
apache | 10.0.0.70 | Apache-httpd、Logstash |
node-1 | 10.0.0.71 | Elasticsearch、Kibana |
node-2 | 10.0.0.72 | Elasticsearch |
3. 2 案例操作
3.2.1 部署Elasticsearch
node-1、node-2
# 安装密钥及elasticsearch源
[root@node-1 ~]# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
[root@node-1 ~]# cd /etc/yum.repos.d/
[root@node-1 yum.repos.d]# vi 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
[root@node-1 ~]# yum list # 查看yum清单
[root@node-1 ~]# yum install elasticsearch -y # 安装elasticsearch
[root@node-1 ~]# yum install java -y # 安装Java
[root@node-1 yum.repos.d]# java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
# 修改配置文件
[root@node-1 yum.repos.d]# vi /etc/elasticsearch/elasticsearch.yml
17: cluster.name: elk-cluster # 集群名称
23: node.name: node-1 ## 当前节点名
33: path.data: /data/elk-data # 数据存储的位置(目录不存在,需要创建)
37: path.logs: /var/log/elasticsearch/ # 日志文件存放的位置
43: bootstrap.memory_lock: false
# true:允许内存中的数据交还给SWAP,flase:不允许内存中的数据交还给SWAP。
选择false,因为swap分区实在硬盘上建立的,如果内存不够,数据溢出,分到硬盘上的话,会影响速度
54: network.host: 0.0.0.0 # 监听地址,0.0.0.0表示所有网段
58: http.port: 9200 # ES端口号,外部通信的端口号 PS:9300是集群内部通信端口
67: discovery.zen.ping.unicast.hosts: ["node-1", "node-2"] # 群集中包含的节点名,也可以用IP地址
# 添加映射
[root@node-1 ~]# vi /etc/hosts
10.0.0.71 node-1
10.0.0.72 node-2
# 创建目录及开启服务
[root@node-1 ~]# mkdir -p /data/elk-data # 创建数据存放目录
[root@node-1 ~]# id elasticsearch # ES的程序用户,安装的时候自动创建的用户
uid=998(elasticsearch) gid=996(elasticsearch) groups=996(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 2288/java
测试
网页测试,访问此端口,可查看节点信息
群集健康状态检查
群集属性状态 ,可以看到群集内部通信端口9300
安装Elasticsearch-head插件,可视化工具,更方便查看集群信息,并管理集群
[root@node-1 ~]# /usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head
测试
两种方法和ES进行交互
- JAVA API
- RESTful API (通过json格式交互)
创建一个索引信息,创建索引为index-demo,类型为test,可以看到成功创建,这里的数据会被存储到ES集群中
[root@node-1 ~]# curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"jack","mesg":"hello world"}'
{
"_index" : "index-demo",
"_type" : "test",
"_id" : "1",
"_version" : 1,
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"created" : true
}
刷新一下,可以看到存储的分片处理与备份,暂时不存在节点间的主备关系。加粗的是主文件的,细框的是备份文件,不论哪个节点宕机,存储都不会丢失,很安全,一个节点有五个分片,两个节点共10个分片
利用组件的复合查询进行索引的创建、查询、删除
创建索引index-demo2
- 提交请求
- 查询
- 删除
解决node-01和node-02日志提示不让锁内存
[root@node-1 ~]# vi /etc/security/limits.conf
//末尾插入
# allow user 'elasticsearch' mlockall
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
systemctl stop elasticsearch.service
[root@node-1 ~]# systemctl restart elasticsearch
安装监控组件
[root@node-1 elasticsearch]# /usr/share/elasticsearch/bin/plugin install lmenezes/elasticsearch-kopf
测试
3.2.2 部署Apache、Logstash
# 安装httpd并开启服务
[root@apache ~]# yum -y install httpd
[root@apache ~]# systemctl start httpd
[root@apache ~]# netstat -anpt | grep 80
tcp6 0 0 :::80 :::* LISTEN 2427/httpd
# 安装Logstash源,java环境
[root@apache ~]# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
[root@apache ~]# vi /etc/yum.repos.d/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@apache ~]# yum -y install logstash java
[root@apache ~]# ln -s /opt/logstash/bin/logstash /usr/local/bin/
logstash(Apache)与elasticsearch (node)功能是否正常,做对接测试
logstash字段描述解释:
-f:指定logstash的配置文件,根据配置文件配置logstash
-e:后面跟着字符串,该字符串可以被当做logstash的配置(如果是“ ”,则默认使用stdin做输入,stdout为输出)
-t:测试配置文件是否正确,然后退出
#输入采用标准输入,输出采用标准输出
# 定义输入和输出流,类似管道,并验证输入输出
[root@apache ~]# logstash -e 'input { stdin{} } output { stdout{} }'
www.baidu.com # 输入
Settings: Default filter workers: 1
Logstash startup completed
2020-11-22T10:00:44.035Z apache www.baidu.com # 输出
www.sohu.com
2020-11-22T10:00:49.930Z apache www.sohu.com
# 验证输出格式化,使用 rubydebug 显示详细信息输出,code为一种编解码
[root@apache ~]# logstash -e 'input { stdin{} } output { stdout{ codec => rubydebug } }'
www.baidu.com # 输入
Settings: Default filter workers: 1
Logstash startup completed
{ #输出
"message" => "www.baidu.com",
"@version" => "1",
"@timestamp" => "2020-11-22T10:29:14.957Z",
"host" => "apache"
}
sohu
{
"message" => "sohu",
"@version" => "1",
"@timestamp" => "2020-11-22T10:30:15.771Z",
"host" => "apache"
}
使用logstash将信息写入elasticsearch 输入 输出 对接
[root@apache ~]# logstash -e 'input { stdin{} } output { elasticsearch { hosts => ["10.0.0.71:9200"] } }'
Settings: Default filter workers: 1
Logstash startup completed
123123
qwe123
ben
www.baidu.com
写入ES和同时生成文本
[root@apache ~]# logstash -e 'input { stdin{} } output { elasticsearch { hosts => ["10.0.0.71:9200"] } stdout { codec => rubydebug } }'
Settings: Default filter workers: 1
Logstash startup completed
abc123
{
"message" => "abc123",
"@version" => "1",
"@timestamp" => "2020-11-22T10:55:26.379Z",
"host" => "apache"
}
测试
在apache主机中做对接配置,logstash收集系统日志
[root@apache ~]# chmod o+r /var/log/messages # 增加可读的权限
[root@apache ~]# 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 => ["10.0.0.71:9200"]
index => "system-%{+YYY.MM.dd}"
}
}
[root@apache ~]# systemctl restart logstash.service
刷新网页,查看索引数据,成功输出了系统日志
3.2.3 在node-1节点安装kibana
# 解压缩kibana安装包
[root@node-1 ~]# tar zxf kibana-4.3.1-linux-x64.tar.gz
[root@node-1 ~]# mv kibana-4.3.1-linux-x64 /usr/local/kibana
# 修改配置文件
[root@node-1 ~]# vi /usr/local/kibana/config/kibana.yml
# 2行 kibana打开的端口
server.port: 5601
# 5行 kibana侦听的地址
server.host: "0.0.0.0"
# 12行 和elasticsearch建立联系
elasticsearch.url: "http://10.0.0.71:9200"
# 20行 在elasticsearch中添加.kibana索引
kibana.index: ".kibana"
[root@node-1 ~]# yum -y install screen
[root@node-1 ~]# /usr/local/kibana/bin/kibana
log [19:22:44.457] [info][status][plugin:kibana] Status changed from uninitialized to green - Ready
log [19:22:44.501] [info][status][plugin:elasticsearch] Status changed from uninitialized to yellow - Waiting for Elasticsearch
log [19:22:44.519] [info][status][plugin:kbn_vislib_vis_types] Status changed from uninitialized to green - Ready
log [19:22:44.529] [info][status][plugin:markdown_vis] Status changed from uninitialized to green - Ready
log [19:22:44.536] [info][status][plugin:metric_vis] Status changed from uninitialized to green - Ready
log [19:22:44.550] [info][status][plugin:spyModes] Status changed from uninitialized to green - Ready
log [19:22:44.555] [info][status][plugin:statusPage] Status changed from uninitialized to green - Ready
log [19:22:44.561] [info][status][plugin:table_vis] Status changed from uninitialized to green - Ready
log [19:22:44.578] [info][listening] Server running at http://0.0.0.0:5601
- 对接system系统日志
访问10.0.0.71:5601,kibana,创建system的索引图表,对接了system的系统日志
- 对接Apache日志
[root@apache ~]# 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 => ["10.0.0.71:9200"]
index => "apache_access-%{+YYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["10.0.0.71:9200"]
index => "apache_error-%{+YYY.MM.dd}"
}
}
}
[root@apache ~]# logstash -f /etc/logstash/conf.d/apache_log.conf
刷新ES网页,查看索引,建议先访问apache页面,否则可能刷新不出来
在kibana创建Apache索引图表
总结
ELK日志分析系统是一款非常强大的日志分析工具,能够帮助运维工程师更快更准确的定位到想要的日志,特别是kibana可视化工具,功能强大,使用起来非常人性化