一、ELK日志分析系统简介
1.1 普通日志服务器:
-
提高安全性
-
集中存放日志
-
缺陷
-
对日志的分析困难
-
1.2 ELK日志分析系统的组成
-
Elasticsearch
-
Logstash
-
Kibana
1.3 ELK日志系统处理步骤
-
将日志进行集中化管理
-
将日志格式化(Logstash)并输出到Elasticsearch
-
对格式化后的数据进行索引和存储(Elasticsearch)
-
前端数据的展示(Kibana)
二、Elasticsearch简介
-
提供了一个分布式多用户能力的全文搜索引擎
2.1 Elasticsearch 的基础核心概念
-
接近实时(NRT):Elasticsearch 是一个搜索速度接近实时的搜索平台,响应速度非常快,从开始索引一个文档到这个文档能够被搜索到只有一个轻微的延迟(通常是 1s)。
-
群集(cluster):群集就是由一个或多个节点组织在一起,在所有节点上存放用户数据,并一起提供索引和搜索功能。通过选举产生主节点,并提供跨节点的联合索引和搜索的功能。每个群集都有一个唯一标识的名称,默认是 Elasticsearch,每个节点是基于群集名字加入到群集中的。一个群集可以只有一个节点,为了具备更好的容错性,通常配置多个节点,在配置群集时,建议配置成群集模式。
-
节点(node):是指一台单一的服务器,多个节点组织为一个群集,每个节点都存储数据并参与群集的索引和搜索功能。和群集一样,节点也是通过名字来标识的,默认情况下,在节点启动时会随机分配字符名,也可以自定义。通过指定群集名字,节点可以加 入到群集中。默认情况,每个节点都已经加入 Elasticsearch 群集。如果群集中有多个节点,它们将会自动组建一个名为 Elasticsearch 的群集。
-
索引(index ): 类似于关系型数据库中的“ 库”。当索引一个文档后, 就可以使用 Elasticsearch 搜索到该文档,也可以简单地将索引理解为存储数据的地方,可以方便地进行全文索引。在 index 下面包含存储数据的类型(Type),Type 类似于关系型数据库中的“表”,用来存放具体数据,而 Type 下面包含文档(Document),文档相当于关系型数据库的“记录”,一个文档是一个可被索引的基础信息单元。索印(库)>>>类型(表)>>>文档(记录)
-
分片和副本(shards & replicas):Elasticsearch 将索引分成若干个部分,每个部分称为一个分片,每个分片就是一个全功能的独立的索引。分片的数量一般在索引创建前指定,且创建索引后不能更改。分片的两个最主要原因如下。
-
水平分割扩展,增大存储量
-
分布式并行跨分片操作,提高性能和吞吐量。
-
三、logstash简介
-
由 JRuby 语言编写,运行在 Java 虚拟机(JVM),是一款强大的数据处理工具
-
可以实现数据传输、格式处理、格式化输出
-
只做三件事情:数据输入、数据加工(如过滤,改写等) 以及数据输出
3.1 LogStash 的主要组件
-
Shipper:日志收集者。负责监控本地日志文件的变化,及时收集最新的日志文件内容。 通常远程代理端(agent)只需要运行这个组件即可。
-
Indexer:日志存储者。负责接收日志并写入到本地文件。
-
Broker:日志 Hub。负责连接多个 Shipper 和多个 Indexer。
-
Search and Storage:允许对事件进行搜索和存储。
-
Web Interface:基于 Web 的展示界面。
四、Kibana介绍
-
一个针对Elasticsearch的开源分析及可视化平台
-
搜索、查看存储在Elasticsearch索引中的数据
-
通过各种图表进行高级数据分析及展示
4.1 Kibana主要功能
-
Elasticsearch无缝之集成
-
整合数据,复杂数据分析
-
让更多团队成员受益
-
接口灵活,分享更容易
-
配置简单,可视化多数据源
-
简单数据导出
五、部署ELK集群
实验环境
-
三台虚拟机配置改为2核4G
主机名 | hostnamectl set-hostname apache hostnamectl set-hostname node1 hostnamectl set-hostname node2 |
---|---|
IP | apache:172.16.10.10 node1:172.16.10.11 node2:172.16.10.12 |
关闭防火墙和selinux | systemctl stop firewalld systemctl disable firewalld setenforce 0 |
修改host文件 | vim /etc/hosts 172.16.10.10 apache 172.16.10.11 node1 172.16.10.12 node2 |
时间同步 | yum -y install chrony systemctl start chronyd chronyc sources -v |
5.1 部署node节点
5.1.1安装elasticsearch
-
两个node节点都需要同样操作
# 安装 Java环境 [root@node1 ~]# yum -y install java-1.8.0-openjdk # 安装 elasticsearch-5.5.0 [root@node1 ~]# rpm -ivh elasticsearch-5.5.0.rpm [root@node1 ~]# systemctl daemon-reload [root@node1 ~]# systemctl enable elasticsearch.service Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.
5.1.2 配置elasticsearch
[root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml luster.name: my-elk ## 集群名字 node.name: node1 ## 节点名字 path.data: /data/elk_data ## 数据存放路径 path.logs: /var/log/elasticsearch ## 日志存放路径 bootstrap.memory_lock: false ## 在启动的时候不锁定内存 network.host: 0.0.0.0 ## 提供服务绑定的IP地址,0.0.0.0 代表所有地址 http.port: 9200 ## 监听端口为 9200 discovery.zen.ping.unicast.hosts: ["node1", "node2"] ## 集群各节点,集群发现通过单播实现 # 创建数据存放路径 [root@node1 ~]# mkdir /data/elk_data # 更改属组属组 [root@node1 ~]# chown -R elasticsearch:elasticsearch /data/
5.1.3 启动elasticsearch
[root@node1 ~]# systemctl start elasticsearch [root@node1 ~]# netstat -natp |grep 9200 tcp 0 0 172.16.10.12:55256 172.16.10.11:9200 TIME_WAIT - tcp6 0 0 :::9200 :::* LISTEN 3666/java tcp6 0 0 172.16.10.12:9200 172.16.10.1:50518 ESTABLISHED 3666/java
5.1.3 查看节点 Node1 的信息
# 可以使用curl或者浏览器访问 http://172.16.10.11:9200 [root@node2 ~]# curl http://172.16.10.11:9200 { "name" : "node1", "cluster_name" : "my-elk", "cluster_uuid" : "qF8vINTcT5CcEM8DF6fASQ", "version" : { "number" : "5.5.0", "build_hash" : "260387d", "build_date" : "2017-06-30T23:16:05.735Z", "build_snapshot" : false, "lucene_version" : "6.6.0" }, "tagline" : "You Know, for Search" }
5.1.4 查看群集的健康情况
# 可以使用curl或者浏览器访问 http://172.16.10.11:9200/_cluster/health?pretty [root@node2 ~]# curl http://172.16.10.11:9200/_cluster/health?pretty { "cluster_name" : "my-elk", "status" : "green", ## status 值为 green(绿色),表示节点健康运行 "timed_out" : false, "number_of_nodes" : 2, "number_of_data_nodes" : 2, "active_primary_shards" : 0, "active_shards" : 0, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 0, "delayed_unassigned_shards" : 0, "number_of_pending_tasks" : 0, "number_of_in_flight_fetch" : 0, "task_max_waiting_in_queue_millis" : 0, "active_shards_percent_as_number" : 100.0 }
5.2 部署Elasticsearch-head 插件,更方便地管理群集
-
Elasticsearch 在 5.0 版本后,Elasticsearch-head 插件需要作为独立服务进行安装,需要 npm 命令。安装 Elasticsearch-head 需要提前安装 node 和 phantomjs。其中,前者是一个基于 Chrome V8 引擎的 JavaScript 运行环境, 而 phantomjs 是一个基于 webkit 的JavaScriptAPI,可以理解为一个隐形的浏览器,任何基于 webkit 浏览器做的事情,它都可以做到。
-
仅在node1节点安装
5.2.1 编译安装node
[root@node1 ~]# yum -y install gcc gcc-* [root@node1 ~]# tar zxf node-v8.2.1.tar.gz [root@node1 ~]# cd node-v8.2.1/ [root@node1 node-v8.2.1]# ./configure && make && make install
5.2.2 安装 phantomjs
[root@node1 ~]# tar jxf phantomjs-2.1.1-linux-x86_64.tar.bz2 [root@node1 ~]# cd phantomjs-2.1.1-linux-x86_64/bin/ [root@node1 bin]# cp phantomjs /usr/local/bin/
5.2.3 安装Elasticsearch-head
[root@node1 ~]# tar zxf elasticsearch-head.tar.gz [root@node1 ~]# cd elasticsearch-head/ [root@node1 elasticsearch-head]# npm install ## 安装依赖包 npm WARN elasticsearch-head@0.0.0 license should be a valid SPDX license expression npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.1.2 (node_modules/ fsevents): npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents @1.1.2: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch": "x64"}) added 115 packages in 51.594s
5.2.4 修改Elasticsearch主配置文件
[root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml # 在末尾添加以下两行内容: http.cors.enabled: true ## 开启跨域访问支持,默认为false http.cors.allow-origin: "*" ## 跨域访问允许的域名地址 [root@node1 ~]# systemctl restart elasticsearch ## 重启服务
5.2.5 启动Elasticsearch-head
-
必须在解压后的 elasticsearch-head 目录下启动服务, 进程会读取该目录下的gruntfile.js 文件,否则可能启动失败。elasticsearch-head 监听的端口是 9100,通过该端口是否监听来判断服务是否正常开启。
# 启动Elasticsearch-head [root@node1 elasticsearch-head]# npm run start & ## 前台启动,一旦关闭中断,服务也将随之关闭 [1] 2648 [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 # 查看Elasticsearch-head是否正常开启 [root@node1 elasticsearch-head]# netstat -lnupt | grep 9100 tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 2229/grunt [root@node1 elasticsearch-head]# netstat -lnupt | grep 9200 tcp6 0 0 :::9200 :::* LISTEN 840/java
5.2.6 通过Elasticsearch-head 查看Elasticsearch 信息
-
通过浏览器访问http://172.16.10.11:9100/地址并连接群集。可以看到群集很健康,健康值为 green 绿色。单击数据浏览,可以查看索引信息。
5.3 部署logstash
-
Logstash 一般部署在需要监控其日志的服务器。在次实验中,Logstash 部署在 Apache 服务器上,用于收集 Apache 服务器的日志信息并发送到 Elasticsearch
-
部署在apache节点上
5.3.1 安装logstash
# 安装 Java环境 [root@apache ~]# yum -y install java-1.8.0-openjdk [root@apache ~]# 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@node1 ~]# systemctl start logstash.service # 创建软链接方便使用logstash命令 [root@apache ~]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
5.3.2 关于logstash的使用及索引的创建
-
Logstash 命令行中常用的命令选项:
-f:通过这个选项可以指定 Logstash 的配置文件,根据配置文件配置 Logstash。 -e:后面跟着字符串,该字符串可以被当作 Logstash 的配置(如果是“”,则默认使用 stdin 作为输入,stdout 作为输出)。 -t:测试配置文件是否正确,然后退出。Logstash 命令的使用方法如下所示: # 输入采用标准输入,输出采用标准输出 [root@apache ~]# logstash -e 'input { stdin{} } output { stdout{} }' # 使用rubydebug 显示详细输出,codec 为一种编解码器 [root@apache ~]# logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }' # 使用Logstash 将信息写入 Elasticsearch 中 [root@apache ~]# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["172.16.10.11:9200"] } }'
5.3.3 通过Logstash 配置文件创建索引
-
Logstash 配置文件基本由三部分组成:input、output 以及 filter(根据需要)
#通过修改 Logstash 配置文件,让其收集系统日志/var/log/messages,并将其输出到 elasticsearch 中 [root@apache ~]# vim /etc/logstash/conf.d/system.conf input { file{ path =>"/var/log/messages" type =>"system" start_position =>"beginning" } } output { elasticsearch { hosts => ["172.16.10.11:9200"] index =>"system-%{+YYYY.MM.dd}" } } [root@apache ~]# chmod +r /var/log/messages [root@apache ~]# systemctl restart logstash ##重启Logstash 服务
-
通过Elasticsearch-head 查看Elasticsearch 信息
通过浏览器访问http://172.16.10.11:9100/地址并连接群集,查看索引下的日志信息。
5.4 部署kibana
5.4.1 安装kibana
-
可以安装在任意节点,这里我们安装在node1节点
# 安装kibana [root@node1 ~]# rpm -ivh kibana-5.5.1-x86_64.rpm 警告:kibana-5.5.1-x86_64.rpm: 头 V4 RSA/SHA512 Signature, 密钥 ID d88e42b4: NOKEY 准备中... ################################# [100%] 正在升级/安装... 1:kibana-5.5.1-1 ################################# [100%] # 启动kibana [root@node1 ~]# systemctl enable kibana [root@node1 ~]# systemctl start kibana
5.4.2 修改kibana主配置文件
[root@node1 ~]# vim /etc/kibana/kibana.yml server.port: 5601 ##Kibana 打开的端口 server.host: "0.0.0.0" ##Kibana 侦听的地址 elasticsearch.url: "http:172.16.10.11:9200" ##和 Elasticsearch 建立连接 kibana.index: ".kibana" ##在Elasticsearch 中添加.kibana 索引 # 重启kibana [root@node1 ~]# systemctl restart kibana
5.4.3 验证 kibana
-
通过浏览器访问 http://172.16.10.11:5601,第一次登录需要添加一个 Elasticsearch 索引,添加前面创建的索引 system-*
-
单击“Discover”按钮查看图表信息及日志信息
5.5 将 Apache 服务器的日志添加到 Elasticsearch 并通过 Kibana 显示
-
同理,在logstash中添加Apache索引文件
5.5.1 安装Apache
[root@apache ~]# yum -y install httpd [root@apache ~]# systemctl start httpd
5.5.2 添加apache日志索引文件
[root@apache ~]# vim /etc/logstash/conf.d/system.conf input { file { path =>"/var/log/httpd/access_log" type =>"access" start_position =>"beginning" } file { path =>"/var/log/httpd/error_log" type =>"error" start_position =>"beginning" } } output { if [type] == "access" { elasticsearch { hosts =>["172.16.10.12:9200"] index =>"apache_access-%{+YYYY.MM.dd}" } } if [type] == "error" { elasticsearch { hosts =>["172.16.10.12:9200"] index =>"apache_error-%{+YYYY.MM.dd}" } } } [root@apache ~]# chmod -R +r /var/log/httpd/ [root@apache ~]# chmod -R +x /var/log/httpd/ [root@apache ~]# systemctl restart logstash ##重启Logstash 服务
-
通过浏览器访问 http://172.16.10.11:9100 查看索引是否创建
-
登录 Kibana,单击“Create Index Pattern”按钮添加索引