一、 ELK日志系统简介
日志分析是运维工程师解决系统故障、发现问题的主要手段。日志包含多种类型,包括程序日志、Web 访问日志、系统日志以及安全日志等。ELK可以很好地查找以及分析所需要的内容,快速定位是否出现故障,以及哪些机器、哪些服务存在故障。
1.1 ELK的组成
ELK 由 ElasticSearch、Logstash 和 Kiabana 三个开源工具组成,其官方网站为 https://www.elastic.co/cn。
- Elasticsearch 是一个开源分布式实时分析搜索引擎,建立在全文搜索引擎库 Apache Lucene 基础上,同时隐藏了 Apache Lucene 的复杂性。Elasticsearch 将所有的功能 打包成一个独立的服务,并提供了一个简单的 RESTfulAPI 接口。它具有分布式、零配置、自动发现、索引自动分片、索引副本机制、RESTful 风格接口、多数据源、自动搜索负载等特点。
- Logstash 是一个完全开源的工具,主要用于日志收集,同时可以对数据处理,并输出 给 Elasticsearch。
- Kibana 也是一个开源和免费的工具,Kibana 可以为 Logstash 和 ElasticSearch 提 供图形化的日志分析 Web 界面,可以汇总、分析和搜索重要数据日志。
1.2 日志分析的步骤
Logstash 收集 AppServer 产生的 Log,并存放到 ElasticSearch 群集中,而 Kibana 则 从 ES 群集中查询数据生成图表,再返回给 Browser。
- 将日志进行集中化管理。
- 将日志格式化(Logstash)并输出到 Elasticsearch。
- 对格式化后的数据进行索引和存储(Elasticsearch)。
- 前端数据的展示(Kibana)。
1.3 Elasticsearch 介绍
Elasticsearch 提供了一 个分布式多用户能力的全文搜索引擎,基于 RESTful Web 接口。通过该接口,用户可以通 过浏览器与 Elasticsearch 通信。具有实时搜索、稳定、可靠、快速、安装使用方便等特点。
1.3.1 Elasticsearch 的基础核心概念
- 接近实时(NRT):Elasticsearch 是一个搜索速度接近实时的搜索平台,响应速度非常 快,从开始索引一个文档到这个文档能够被搜索到只有一个轻微的延迟(通常是 1s) 。
- 群集(cluster) :在一个或多个节点上存放用户数据,并一起提供索引和搜索功能。通过选举产生主节点,并提供跨节点的联合索引和搜索的功能。
- 节点(node):是指一台单一的服务器,多个节点组织为一个群集,每个节点都存储数据并参与群集的索引和搜索功能。默认情况,每个节点都已经加入 Elasticsearch 群集。如果群集中有多个 节点,它们将会自动组建一个名为 Elasticsearch 的群集。
- 索引(index):类似于关系型数据库中的“库”。当索引一个文档后,就可以使用 Elasticsearch 搜索到该文档,在 index 下面包含存储数据的类型(Type),Type 类似于关系型数据 库中的“表”,用来存放具体数据,而 Type 下面包含文档(Document),文档相当于关 系型数据库的“记录”,一个文档是一个可被索引的基础信息单元。
- 分片和副本(shards & replicas):Elasticsearch 将索引分成若干个部分,每个部分称为一个分片,每个分片就是一个全功能的独立的索引。分片的数量一般在索引创建前指定,且创建索引后不能更改。
- 分片的两个最主要原因如下。
水平分割扩展,增大存储量。
分布式并行跨分片操作,提高性能和吞吐量。 - Elasticsearch 将索引分片复制一份或多份,称为副本。副本是索引 的另一个备份,用于数据冗余以及负载分担。默认情况下 Elasticsearch 自动对索引请求进行负载分担。
1.4 Logstash 介绍
Logstash 由 JRuby 语言编写,运行在 Java 虚拟机(JVM)上,常用于日志处理。Logstash 只做三件事情:数据输入、数据加工(如过滤,改写等) 以及数据输出。
LogStash 的主要组件如下。
- Shipper:日志收集者。负责监控本地日志文件的变化,及时收集最新的日志文件内容。通常远程代理端(agent)只需要运行这个组件即可。
- Indexer:日志存储者。负责接收日志并写入到本地文件。
- Broker:日志 Hub。负责连接多个 Shipper 和多个 Indexer。
- Search and Storage:允许对事件进行搜索和存储。
- WebInterface:基于 Web 的展示界面。
Logstash 使用管道方式进行日志的搜集处理和输出。有点类似 Linux 系统的管道命令, 将前一个流程的处理结果发送到后一个流程继续处理。在 Logstash 中,包括了三个阶段, 分别是输入(Input )、处理(Filter,非必需)和输出(Output)。
1.5 Kibana 介绍
Kibana可以搜索、查看存储在 Elasticsearch 索引中的数据,并通过各种图表进行高级数据分析及展示,让数据看起来一目了然。
Kibana 的主要功能如下。
- Elasticsearch 无缝之集成。Kibana 架构是为 Elasticsearch 定制的,可以将任何(结构 化和非结构化)数据加入 Elasticsearch 索引。
- 整合数据。Kibana 可以让海量数据变得更容易理解,根据数据内容可以创建形象的柱形图、折线图、散点图、直方图、饼图和地图,方便用户查看。
- 复杂数据分析。Kibana 提升了 Elasticsearch 的分析能力,能够更加智能地分析数据,执行数据转换并且根据要求对数据切割分块。
- 让更多团队成员受益。强大的数据库可视化接口让各业务岗位都能够从数据集合受益。
- 接口灵活,分享更容易。使用 Kibana 可以更加方便地创建、保存、分享数据,并将可视化数据快速交流。
- 配置简单。Kibana 的配置和启用非常简单,用户体验非常友好。Kibana 自带 Web 服务,可以快速启动运行。
- 可视化多数据源。Kibana 可以非常方便地把来自 Logstash、ES-Hadoop、Beats 或第三方技术的数据整合到 Elasticsearch。
- 简单数据导出。Kibana 可以方便地导出感兴趣的数据,与其他数据整合并融合后快速建模分析,发现新结果。
二、 部署Elasticsearch 群集
部署Elasticsearch 群集至少需要两台服务器
2.1 部署过程
1. 准备环境
修改主机名、hosts文件、关闭防火墙、内核防护
[root@localhost ~]# hostnamectl set-hostname node1
[root@localhost ~]# su
[root@node1 ~]# vim /etc/hosts ##在hosts文件中写入下面的解析条目
14.0.0.77 node1
14.0.0.110 node2
[root@node1 ~]# systemctl stop firewalld.service
[root@node1 ~]# setenforce 0
[root@node1 ~]# java -version ##查看jdk是否安装
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
[root@localhost ~]# hostnamectl set-hostname node2
[root@localhost ~]# su
[root@node2 ~]# vim /etc/hosts
14.0.0.77 node1
14.0.0.110 node2
[root@node2 ~]# systemctl stop firewalld.service
[root@node2 ~]# setenforce 0
2. 安装Elasticsearch软件
两个节点服务器进行相同的操作,以node1服务器为例
[root@node1 ~]# cd /opt ##将软件包拷贝到/opt目录下
rz waiting to receive.
[root@node1 opt]# ls
elasticsearch-5.5.0.rpm logstash-5.5.1.rpm rh
elasticsearch-head.tar.gz node-v8.2.1.tar.gz
kibana-5.5.1-x86_64.rpm phantomjs-2.1.1-linux-x86_64.tar.bz2
[root@node1 opt]# rpm -ivh elasticsearch-5.5.0.rpm ##rpm方式安装elasticsearch软件
警告:elasticsearch-5.5.0.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID d88e42b4: NOKEY
准备中... ################################# [100%]
Creating elasticsearch group... OK
Creating 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@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.
3. 更改elasticsearch主配置文件
node1与node2做同样的操作
[root@node1 opt]# cp -p /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak ##将配置文件做备份,防止错改配置文件
[root@node1 opt]# cd /etc/elasticsearch/
[root@node1 elasticsearch]# vim elasticsearch.yml
cluster.name: my-elk-cluster ##17行,设置集群名字
node.name: node1 ##23行,设置节点名字
path.data: /data/elk_data ##33行,数据存放路径
path.logs: /var/log/elasticsearch/ ##37行,日志存放路径
bootstrap.memory_lock: false ##43行,不在启动的时候锁定内存
network.host: 0.0.0.0 ##55行,提供服务绑定的IP地址,0.0.0.0代表所有网段
http.port: 9200 ##59行,侦听端口9200
discovery.zen.ping.unicast.hosts: ["node1", "node2"] ##68行,集群发现通过单播实现
[root@node1 elasticsearch]# grep -v '^#' elasticsearch.yml ##查看刚刚更改的配置文件是否成功
cluster.name: my-elk-cluster
node.name: node1
path.data: /data/elk_data
path.logs: /var/log/elasticsearch/
bootstrap.memory_lock: false
network.host: 0.0.0.0
http.port: 9200
discovery.zen.ping.unicast.hosts: ["node1", "node2"]
[root@node1 elasticsearch]# mkdir -p /data/elk_data ##创建elasticsearch的数据文件存放位置
[root@node1 elasticsearch]# id elasticsearch ##查看用户
uid=987(elasticsearch) gid=981(elasticsearch) 组=981(elasticsearch)
[root@node1 elasticsearch]# chown elasticsearch.elasticsearch /data/elk_data/ ##设置elasticsearch的数据文件存放目录属组、属主为elasticsearch
4. 开启elastisearch,并测试
node1和node2做同样的操作
[root@node1 elasticsearch]# systemctl start elasticsearch.service ##需要等待一会端口开会开启
[root@node1 elasticsearch]# netstat -ntap | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 65901/java
在真机中访问
http://14.0.0.77:9200
http://14.0.0.110:9200
http://14.0.0.77:9200/_cluster/health?pretty
http://14.0.0.110:9200/_cluster/health?pretty
http://14.0.0.77:9200/_cluster/state?pretty
http://14.0.0.110:9200/_cluster/state?pretty
5. 安装node组件(手工编译安装)
软件包之前已经拷贝到/opt目录下了,直接进行解压安装
[root@node1 elasticsearch]# cd /opt
[root@node1 opt]# yum install gcc gcc-c++ -y
[root@node1 opt]# tar zxvf node-v8.2.1.tar.gz ##解压
[root@node1 node-v8.2.1]# ./configure ##configure配置
[root@node1 node-v8.2.1]# make -j4 ##编译安装,-j4是指四个线程运行,编译速度比较慢,大概20分钟
[root@node1 node-v8.2.1]# make install ##安装
6. 安装前端框架 phantomjs(手工编译安装)
[root@node1 opt]# tar jvxf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src/ ##解压
[root@node1 opt]# cd /usr/local/src/phantomjs-2.1.1-linux-x86_64/
[root@node1 phantomjs-2.1.1-linux-x86_64]# cd bin/
[root@node1 bin]# ls
phantomjs
[root@node1 bin]# cp phantomjs /usr/local/bin/ ##将脚本拷贝到指定目录下,便于系统识别
7. 安装elasticsearch-head插件(手工编译安装)
[root@node1 bin]# cd /opt
[root@node1 opt]# tar zxvf elasticsearch-head.tar.gz -C /usr/local/src/
[root@node1 opt]# cd /usr/local/src/elasticsearch-head/
[root@node1 elasticsearch-head]# npm install ##等待安装
8. 修改elasticsearch主配置文件
[root@node1 elasticsearch-head]# vim /etc/elasticsearch/elasticsearch.yml ##在文件末尾写入下面两句
http.cors.enabled: true ##开启跨域访问支持,默认为false
http.cors.allow-origin: "*" ##跨域访问允许的域名地址
[root@node1 elasticsearch-head]# systemctl restart elasticsearch.service
9. 启动elasticsearch-head 服务器
[root@node1 elasticsearch-head]# pwd
/usr/local/src/elasticsearch-head
[root@node1 elasticsearch-head]# npm run start & ##开启服务,在后台运行
[1] 112187
[root@node1 elasticsearch-head]#
> elasticsearch-head@0.0.0 start /usr/local/src/elasticsearch-head
> grunt server
Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100 ##端口为9100
[root@node1 elasticsearch-head]# netstat -ntap | grep 9100
tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 112197/grunt
10. 进行访问
在真机中进行访问
14.0.0.77:9100
14.0.0.110:9100
11. 添加数据并查看
[root@node1 elasticsearch-head]# curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}' ##存数据
{
"_index" : "index-demo",
"_type" : "test",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"created" : true
}
三、 安装logstash
这里还是再准备两台centos7的虚拟机,一台作为web服务器,安装apache服务,另外一台安装logstash收集apache的日志,并交给elasticsearch进行存储。
3.1 logstash的安装过程
1. web服务器的部署
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# hostnamectl set-hostname apache
[root@localhost ~]# su
[root@apache ~]# yum install httpd -y
[root@apache ~]# systemctl start httpd
2. 查看JAVA环境
[root@apache ~]# java -version ##如果没有安装,使用yum install java -y 安装
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
3. 安装logstash
[root@apache ~]# cd /opt
将软件包拷贝到这个目录下
[root@apache opt]# rpm -ivh logstash-5.5.1.rpm ##安装logstash
警告: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 (Apache)与elasticsearch (node)功能是否正常,可以使用logstash命令做对接测试,常用命令参数如下:
- -f 通过这个选项可以指定logstash的配置文件,根据配置文件配置logstash
- -e后面跟着字符串该字符串可以被当做logstash的配置(如果是””,则默认使用stdin做为输入、stdout作为输出)
- -t测试配置文件是否正确,然后退出
4. 测试logstash命令
- 输入采用标准输入输出采用标准输出—在Apache服务器上
[root@apache opt]# logstash -e 'input { stdin {} } output { stdout {} }'
输入命令后会进入一个输入输出的状态,我们输入什么,就会按照格式给我们输出出来
...
省略掉部分提示信息
2020-09-15T14:28:01.479Z apache
www.njit.com ##这里就是自己输入的内容
2020-09-15T14:29:54.032Z apache www.njit.com ##这是按照格式输出的内容
zhangsan
2020-09-15T14:30:00.274Z apache zhangsan
- 使用rubydebug显示详细输出,codec为一种编解码器
[root@apache opt]# logstash -e 'input { stdin {} } output { stdout { codec=>rubydebug } }'
...
省略掉部分提示信息
www.njit.com ##输入信息,以下为输出信息
{
"@timestamp" => 2020-09-15T14:37:50.914Z,
"@version" => "1",
"host" => "apache",
"message" => "www.njit.com"
zhangsan ####输入信息,以下为输出信息
{
"@timestamp" => 2020-09-15T14:38:18.485Z,
"@version" => "1",
"host" => "apache",
"message" => "zhangsan"
}
5. 使用logstash将信息写入elasticsearch中–输入输出对接
[root@apache opt]# logstash -e 'input { stdin {} } output { elasticsearch { hosts=>["14.0.0.77:9200"] } }' ##将信息写入elasticsearch中
...
省略部分信息
www.njit.com
在真机上进行查看
6. 修改logstash配置文件
Logstash配置文件主要由三部分组成: input、output、filter(根据需要)
[root@apache opt]# cd /var/log/
[root@apache log]# ll | grep messages
-rw-------. 1 root root 678003 9月 15 22:52 messages ##权限为管理员读写,需要被其它用户读
[root@apache log]# chmod o+r messages
[root@apache log]# ll | grep messages
-rw----r--. 1 root root 685620 9月 15 22:54 messages
[root@apache log]# cd /etc/logstash/
[root@apache logstash]# vim logstash.yml ##配置文件中写明了子配置文件的路径,需要到这个路径下创建文件才能被识别
[root@apache log]# vim /etc/logstash/conf.d/system.conf
input {
file{
path => "/var/log/messages"
type => "system"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["14.0.0.77:9200"]
index => "system-%{+YYYY.MM.dd}"
}
}
[root@apache logstash]# systemctl restart logstash.service
在真机中访问,产生了新的索引文件
三、 kibana部署与使用
3.1 部署kibana
再使用一台新的虚拟机14.0.0.107作为kibana服务器,也可以在node1节点服务器上直接安装
[root@localhost ~]# hostnamectl set-hostname kibana
[root@localhost ~]# su
将软件包拷贝到当前目录下
[root@kibana ~]# rpm -ivh kibana-5.5.1-x86_64.rpm
[root@kibana ~]# cd /etc/kibana/
[root@kibana kibana]# cp kibana.yml kibana.yml.bak
[root@kibana kibana]# vim kibana.yml
server.port: 5601 ##2行,kibana打开的端口
server.host: "0.0.0.0" ##7行,kibana侦听的地址
elasticsearch.url: "http://14.0.0.77:9200" ##21行,和elasticsearch建立联系
kibana.index: ".kibana" ##30行,在elasticsearch中添加.kibana索引
[root@kibana kibana]# systemctl start kibana.service
[root@kibana kibana]# systemctl enable kibana.service
Created symlink from /etc/systemd/system/multi-user.target.wants/kibana.service to /etc/systemd/system/kibana.service.
在真机查看索引
3.2 对接apache的日志文件
[root@apache logstash]# cd /etc/logstash/conf.d/
[root@apache conf.d]# vim apache_log.conf
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 => ["14.0.0.77:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["14.0.0.77:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}
[root@apache conf.d]# /usr/share/logstash/bin/logstash -f apache_log.conf ##不重启服务,直接加载配置文件
3.3 在kibana中进行创建、查看
在真机中进行查看
在kibana中为apache日志创建索引
同样的操作创建apache_error