文章目录
- 一:ELK日志分析系统简介
- 二:Elasticsearch介绍
- 三:Logstash介绍
- 四:Kibana介绍
- 五:实操演示
前言
HDFS————大数据
GFS—————生产环境
CEPH————支持的环境多
MFS—————存在中心节点服务器单点故障,用的少
RSYNC————数据业务不是太大的情况下
前言:
日志分析是运维工程师解决系统故障,发现问题的主要手段。日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
通常,日志被分散的储存在不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志,即繁琐又效率低下。为此,我们可以使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。
集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于更高要求的查询、排序和统计等,再加上庞大的机器数量,使用这样的方法依然难免有点力不从心。
开源实时日志分析ELK平台能够完美的解决我们上述的问题,ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成。官方网站:https://www.elastic.co/products
Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
Logstash是一个完全开源的工具,它可以对你的日志进行收集、过滤,并将其存储,供以后使用(如,搜索)。
Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供友好的日志分析Web 界面,可以帮助您汇总、分析和搜索重要数据日志。
一:ELK日志分析系统简介
1.1 一般的日志服务器
- 提高安全性
- 集中存放日志
- 缺陷:对日志的分析困难
1.2 ELK日志分析系统
- Elasticsearch
- Logstash
- Kibana
1.3 日志处理步骤
1.将APP servers的日志进行集中化管理到Logstash agent
2.将日志格式化(Logstash)并输出到Elasticsearch cluster
3.对格式化后的数据进行索引和存储(Elasticsearch)
4.前端数据的展示(Kibana)
5.可以在线查看界面化展示
Logstash 收集APP server产生的log,然后存放到Elasticsearch集群节点中
kibana从Elasticsearch集群节点中查询数据生成图表,再返回给Brower
二:Elasticsearch介绍
2.1 Elasticsearch概述
- 提供了一个分布式多用户能力的全文搜索引擎
- 是一个基于Lucene的搜索服务器
- 基于restful web接口
- 使用java开发
- 作为apache许可条款下的开放源码发布,是第二流行的企业搜索引擎
- 被设计用于云计算中,能够达到实时搜索、稳定、可靠、快速、安装实用方便的需求
2.2 Elasticsearch的概念
- 接近实时(NRT)
Elasticsearch是一个接近即时的搜索平台,从索引一个文档知道这个文档能够被搜索到的过程中有一个轻微的延迟(通常是1S)
- 集群(cluster)
由一个及其以上的节点组织在一起,它们共同持有整个数据,并一起提供索引和搜索功能
其中一个节点为主节点,这个节点是可以通过选举产生,并提供跨节点的联合索引和搜索的功能
集群有一个唯一标识的名字,默认是elaticsearch
集群名字很重要,每个节点是基于集群名字加入到其集群中;因此,要确保集群的唯一性,在不同环境中使用不同的集群名字
一个集群只可以有一个节点,建议在配置elasticsearch时,配置成集群模式
- 节点(node)
节点就是一台单一的服务器,是集群的一部分,存储数据并参与集群的索引和搜索功能
像集群一样,节点之间可是通过名字来标识区分,默认是在节点启动时随机分配的字符名
当然,你可以自己定义,该名字很重要,起到在集群中定位到对应的节点
节点可以通过指定集群名字来加入到集群中,默认情况下,每个节点被设置成加入到elasticsearch集群。
如果启动了多个节点,假设能够自动发现对方,他们将会自动组建一个名为elastisearch的集群
- 索引(index)——索引(库)——类型(表)——文档(记录)
一个索引就是一个拥有几分相似特征的文档的集合
比如说,你可以有一个客户数据的索引、一个产品目录的索引、还有一个订单数据的索引
一个索引用一个名字来标识(必须全部是小写字母组合),并且当我们要对相应的索引中的文档进行索引、收缩、更新和删除的时候,都要用到这个名字
在一个集群中,可以定义多个索引
- 类型(type)
在一个索引中,你可以定义一种或多种类型
一个类型是你的索引的一个逻辑上的分类分区,其寓意完全由你来定义
通常,会为具有一组共同字段的文档定义一个类型
比如:我们假设运营一个博客平台并且将所有的数据存储到一个索引中,在这个索引中,你可以为用户数据定义一个类型,为博客数据定义一个类型,也可以为评论数据定义另一个类型
- 文档(Document)
一个文档是一个可被索引的基础信息单元
比如:你可以拥有一个客户的文档,某一个产品的文档;文档以JSON(Javascript Object Notation)格式来表示,json是一个通用的互联网数据交互模式
在一个index/type内,你可以存储任意多的文档
注意:虽然一个文档在物理上位于一个索引内,但是实际上一个文档必须在一个索引内可以被索引和分配一个类型
- 分片和副本 (shards & replicas)
在实际情况下,索引存储的数据可能超过单个节点的硬件设置
比如十亿个文档需要1TB空间存储,可能不适合存储在单个节点上,读写被限制在单个节点;从单个节点搜索请求也太慢了
为了解决这个问题,elasticsearch集群提供将索引分割开,进行分片的功能
当创建索引时,可以定义想要分片的数量
每一个分片就是一个全功能的独立的索引,可以位于集群中的任何节点上
2.3 分片的两个最主要原因:
1.可以进行水平分割横向扩展,增大存储量
2.分布式并行跨分片操作,提高性能和吞吐量
分布式分片的机制和搜索i请求的文档如何汇总由elasticsearch控制,这些对用户来说是透明的
网络问题等其他不可控因素可以在任何时候不期而至,为了集群的健壮性,可以做一个故障切换机制,无论出现何种故障以防止分片或者节点不可用,为此,elasticsearch可以将索引分片复制一份或者多分,这被称之为分片副本
2.4 开启分片副本的主要原因
1.高可用性,以应对分片或者节点故障,处于这个原因,分片副本要在不同节点上
2.提高IO性能,增大吞吐量,搜索可以并行在所有副本执行
总之,每个索引可以被分成多个分片,一个索引也可以被复制0次或者多次
一旦复制了,每个索引就有了主分片(可以作为复制源的原始分片)和复制分片(主分片的拷贝)之分
分片和副本的数量可以在索引创建的时候指定,在索引创建之后,你可以在任何时候动态改变副本的数量,但是你事后无法改变分片的数量
默认情况下,Elasticsearch中的每个索引被分片为5个主分片和1个副本,这意味着,如果你的集群中至少有两个节点的情况下,你的索引将会有5个主分片和另外5个副本分片(1个完全拷贝),这样的话每个索引总共就有10个分片
三:Logstash介绍
3.1 Logstash概述
- 一款强大的数据处理工具,可以实现数据传输、格式处理、格式化输出
- 工作思路:数据输入(collect)、数据加工(如过滤、改写等enrich)以及数据输出(transport)
- 由LRuby语言编写,基于消息(message-based)的简单架构,并运行在Java虚拟机(JVM)上。
- 不同于分离的代理端(agent)或主机端(server),Logstash可配置单一的代理端(agent)与其他开源软件结合,以实现不同的功能
3.2 Logstash主要组件
- Shipper:日志收集
负责监控本地日志文件的变化,及时把日志文件的最新内容收集起来
通常,远程代理端(agent)只需要运行这个组件即可
- Indexer:日志存储
负责接受日志并写入到本地文件
- Broker:日志hub
负责链接多个shipper和对应数目的indexer
- Search and Storage
允许对事件进行搜索和存储
- Web Interface
基于web的展示界面
以上组件在lLogstash架构中可以独立部署,因此提供了很好的集群扩展性
3.3 Logstash主机分类
- 代理主机(agent):作为事件的传递者(shipper),将各种日志数据发送到中心主机;只需要运行logstash代理程序
- 中心主机(central host):可运行包括中间转发器(broker)、索引器(indexer)、搜索和存储器(search & storage)、web界面端(web interface)在内的各个组件,以实现对日志数据地接收、处理和存储
四:Kibana介绍
4.1 Kibana概述
- 一个针对Elasticsearch的开源分析及可视化平台
- 搜索、查看存储在Elasticsearch索引中的数据
- 通过各种图标进行高级数据分析及展示
- 让海量数据更容易理解
- 操作简单,基于浏览器地用户界面就可以快速创建仪表板(dashboard)实时显示Elasticsearch查询动态
- 设置安装Kibana非常简单,无需编写代码,几分钟内就可以完成Kibana安装并启动Elasticsearch监测
4.2 Kibana主要功能
- Elasticsearch无缝之集成。Kibana架构为Elasticsearch定制,可以将任何结构化和非结构化加入Elasticsearch索引,Kibana还充分利用了Elasticsearch强大的搜索和分析功能
- 整合数据,复杂数据分析;根据海量数据创建柱形图、折线图、三代泥土、直方图、饼图和地图;提升了Elasticsearch地分析能力,更够更加智能化地分析数据,执行数学转化并且根据要求对数据切割分块
- 让更多团队成员受益;强大的数据可视化让各个业务岗位都可以直观了解数据
- 接口灵活,分享更容易;使用Kibana可以更加方便地创建保存和分享数据,并将可视化数据快速交流
- 配置简单,可视化多数据源;Kibana地配置和启动非常简单,用户体验友好,Kibana自带web服务器,可以快速运行;kibana可以非常方便地把来自logstash、ES-hadoop、Beats或第三方技术整合到Elasticsearch,支持地第三方技术包括apacheflume、fluentd等
- 简单数据导出;Kibana可以方便地导出感兴趣地数据,与其他数据融合后快速建模分析,发现新结果
五:实操演示
三台centos7服务器,配置安装ELK日志分析系统
安装集群方式,两个Elasticsearch节点,并监控apache服务器日志
主机名 | IP地址 | 安装软件 |
---|---|---|
node1 | 192.168.247.155 | Elasticsearch 、Kibana |
node2 | 192.168.247.20 | Elasticsearch |
apache | 192.168.247.134 | Logstash 、apahce |
5.1 修改主机名
[root@a ~]# hostnamectl set-hostname node1
[root@a ~]# su
[root@node1 ~]#
[root@rsyncd ~]# hostnamectl set-hostname node2
[root@rsyncd ~]# su
[root@node2 ~]#
[root@kehuduan ~]# hostnamectl set-hostname apache
[root@kehuduan ~]# su
[root@apache ~]#
5.2 三个节点修改hosts文件
[root@node1 ~]# vim /etc/hosts
192.168.247.155 node1
192.168.247.20 node2
192.168.247.134 apache
[root@node1 ~]# scp /etc/hosts root@192.168.247.160:/etc/
[root@node1 ~]# scp /etc/hosts root@192.168.247.134:/etc/
5.3 各个节点查看java环境(安装java-1.8.0版)
[root@apache ~]# java -version
bash: java: command not found
[root@apache ~]# yum install -y java-1.8.0
[root@apache ~]# java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)
5.4 部署Elasticsearch软件
5.4.1 node1节点
[root@node1 ~]# mount.cifs //192.168.0.88/linuxs /abc -o vers=2.0
Password for root@//192.168.0.88/linuxs:
[root@node1 ~]# cd /abc/ELK/
[root@node1 ELK]# ll
total 265132
-rwxr-xr-x 1 root root 33396354 Aug 11 2017 elasticsearch-5.5.0.rpm
-rwxr-xr-x 1 root root 37926436 Aug 19 2017 elasticsearch-head.tar.gz
-rwxr-xr-x 1 root root 52255853 Aug 11 2017 kibana-5.5.1-x86_64.rpm
-rwxr-xr-x 1 root root 94158545 Aug 11 2017 logstash-5.5.1.rpm
-rwxr-xr-x 1 root root 30334692 Aug 11 2017 node-v8.2.1.tar.gz
-rwxr-xr-x 1 root root 23415665 Aug 11 2017 phantomjs-2.1.1-linux-x86_64.tar.bz2
[root@node1 ELK]# rpm -ivh elasticsearch-5.5.0.rpm
5.4.2 加载系统服务
[root@node1 ELK]# systemctl daemon-reload
[root@node1 ELK]# systemctl enable elasticsearch.service
Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.
5.4.3 修改elasticsearch配置文件
[root@node1 ELK]# cd /etc/elasticsearch/
[root@node1 elasticsearch]# ll
total 16
-rw-rw---- 1 root elasticsearch 2854 Jul 1 2017 elasticsearch.yml
-rw-rw---- 1 root elasticsearch 3117 Jul 1 2017 jvm.options
-rw-rw---- 1 root elasticsearch 4456 Jul 1 2017 log4j2.properties
drwxr-x--- 2 root elasticsearch 6 Jul 1 2017 scripts
[root@node1 elasticsearch]# cp -p elasticsearch.yml elasticsearch.yml.bak
[root@node1 elasticsearch]# vim elasticsearch.yml
配置文件原文
1 # ======================== Elasticsearch Configuration =========================
2 #
3 # NOTE: Elasticsearch comes with reasonable defaults for most settings.
4 # Before you set out to tweak and tune the configuration, make sure you
5 # understand what are you trying to accomplish and the consequences.
6 #
7 # The primary way of configuring a node is via this file. This template lists
8 # the most important settings you may want to configure for a production cluster.
9 #
10 # Please consult the documentation for further information on configuration options :
11 # https://www.elastic.co/guide/en/elasticsearch/reference/index.html
12 #
13 # ---------------------------------- Cluster -----------------------------------
14 #
15 # Use a descriptive name for your cluster:
16 #
17 #cluster.name: my-application
18 #
19 # ------------------------------------ Node ------------------------------------
20 #
21 # Use a descriptive name for the node:
22 #
23 #node.name: node-1
24 #
25 # Add custom attributes to the node:
26 #
27 #node.attr.rack: r1
28 #
29 # ----------------------------------- Paths ------------------------------------
30 #
31 # Path to directory where to store the data (separate multiple locations by comma):
32 #
33 #path.data: /path/to/data
34 #
35 # Path to log files:
36 #
37 #path.logs: /path/to/logs
38 #
39 # ----------------------------------- Memory -----------------------------------
40 #
41 # Lock the memory on startup:
42 #
43 #bootstrap.memory_lock: true
44 #
45 # Make sure that the heap size is set to about half the memory available
46 # on the system and that the owner of the process is allowed to use this
47 # limit.
48 #
49 # Elasticsearch performs poorly when the system is swapping the memory.
50 #
51 # ---------------------------------- Network -----------------------------------
52 #
53 # Set the bind address to a specific IP (IPv4 or IPv6):
54 #
55 #network.host: 192.168.0.1
56 #
57 # Set a custom port for HTTP:
58 #
59 #http.port: 9200
60 #
61 # For more information, consult the network module documentation.
62 #
63 # --------------------------------- Discovery ----------------------------------
64 #
65 # Pass an initial list of hosts to perform discovery when new node is started:
66 # The default list of hosts is ["127.0.0.1", "[::1]"]
67 #
68 #discovery.zen.ping.unicast.hosts: ["host1", "host2"]
69 #
70 # Prevent the "split brain" by configuring the majority of nodes (total number of m aster-eligible nodes / 2 + 1):
71 #
72 #discovery.zen.minimum_master_nodes: 3
73 #
74 # For more information, consult the zen discovery module documentation.
75 #
76 # ---------------------------------- Gateway -----------------------------------
77 #
78 # Block initial recovery after a full cluster restart until N nodes are started:
79 #
80 #gateway.recover_after_nodes: 3
81 #
82 # For more information, consult the gateway module documentation.
83 #
84 # ---------------------------------- Various -----------------------------------
85 #
86 # Require explicit names when deleting indices:
87 #
88 #action.destructive_requires_name: true
修改内容如下
17 cluster.name: my-elk-cluster
###集群名字
23 node.name: node1
###节点名字
33 path.data: /data/elk_data
###数据存放路径
37 path.logs: /var/log/elasticsearch/
###日志存放路径
43 bootstrap.memory_lock: false
### 启动的时候不锁定内存
55 network.host: 0.0.0.0
### 指定提供服务地IP地址,0.0.0.0为所有IP
59 http.port: 9200
###开启端口号
68 discovery.zen.ping.unicast.hosts: ["node1", "node2"]
### 集群发现通过单播实现,指定集群node名字
5.4.4 查看验证
[root@node1 elasticsearch]# grep -v "^#" /etc/elasticsearch/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"]
5.4.5 创建配置文件中指定地两个数据目录并指定程序用户
备注:安装rpm时,程序用户也被创建
[root@node1 elasticsearch]# cat /etc/passwd | grep "elasticsearch"
elasticsearch:x:990:984:elasticsearch user:/home/elasticsearch:/sbin/nologin
[root@node1 elasticsearch]# cd ~
[root@node1 ~]# mkdir -p /data/elk_data /var/log/elasticsearch
[root@node1 ~]# chown elasticsearch:elasticsearch /data/elk_data /var/log/elasticsearch
5.4.6 启动elasticsearch 并检查端口
[root@node1 log]# systemctl start elasticsearch.service
[root@node1 log]# netstat -natp | grep 9200
[root@node1 log]# netstat -natp | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 48420/java
5.4.7 查看节点信息
5.4.8 在另外一个node2节点配置Elasticsearch
步骤跟配置node1的一样
[root@node2 ~]# mount.cifs //192.168.0.88/linuxs /abc -o vers=2.0
Password for root@//192.168.0.88/linuxs:
[root@node2 ~]# cd /abc/ELK/
[root@node2 ELK]# rpm -ivh elasticsearch-5.5.0.rpm
[root@node2 ELK]# systemctl daemon-reload
[root@node2 ELK]# systemctl enable elasticsearch.service
Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.
[root@node2 ELK]# cd /etc/elasticsearch/
[root@node2 elasticsearch]# cp -p /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
[root@node2 elasticsearch]# ll
total 20
-rw-rw---- 1 root elasticsearch 2854 Jul 1 2017 elasticsearch.yml
-rw-rw---- 1 root elasticsearch 2854 Jul 1 2017 elasticsearch.yml.bak
-rw-rw---- 1 root elasticsearch 3117 Jul 1 2017 jvm.options
-rw-rw---- 1 root elasticsearch 4456 Jul 1 2017 log4j2.properties
drwxr-x--- 2 root elasticsearch 6 Jul 1 2017 scripts
[root@node2 elasticsearch]# scp -p root@node1:/etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/
root@node1's password:
elasticsearch.yml 100% 2853 1.8MB/s 00:00 [root@node2 elasticsearch]# grep -v "^#" /etc/elasticsearch/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@node2 elasticsearch]# sed -i 's/^node.name.*/node.name: node2/' /etc/elasticsearch/elasticsearch.yml
[root@node2 elasticsearch]# grep -v "^#" /etc/elasticsearch/elasticsearch.yml
cluster.name: my-elk-cluster
node.name: node2
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@node2 elasticsearch]# cd ~
[root@node2 ~]# mkdir -p /data/elk_data /var/log/elasticsearch
[root@node2 ~]# chown elasticsearch:elasticsearch /data/elk_data /var/log/elasticsearch
[root@node2 ~]# systemctl start elasticsearch.service
[root@node2 ~]# netstat -natp | grep 9200
[root@node2 ELK]# netstat -natp | grep 9200
[root@node2 ELK]# netstat -natp | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 9303/java
5.4.9 查看node2的节点信息
5.4.10 检查elasticsearch群集健康情况
5.4.11 检查群集状态信息
5.5 安装elasticsearch-head插件
观看管理集群更方便
5.5.1 node1节点配置,先安装相关node组件包
[root@node1 abc]# cd /abc/ELK/
[root@node1 ELK]# tar xzvf node-v8.2.1.tar.gz -C /opt
[root@node1 ELK]# cd /opt/node-v8.2.1/
[root@node1 node-v8.2.1]# yum install gcc gcc-c++ make cmake perl* pcre* gd* -y
//编译包先安着再说
gcc
gcc-c++
expat-devel.x86_64
make
ncurses-devel
autoconf
cmake
gd
libpng libpng-devel
libjpeg-devel
zlib zlib-devel
pcre*
perl
expat-devel
cmake
ncurses*
bison
freetype freetype-devel \
libxml2 \
libxml2-devel \
curl curl-devel \
openssl openssl-devel
ncurses-devel perl-Module-Install
[root@node1 node-v8.2.1]# ./configure
[root@node1 node-v8.2.1]# make -j3 && make install
//安装时间长,node2也一起安装node-v8.2.1
[root@node2 node-v8.2.1]# make -j3 && make install
5.5.2 安装phantomjs,两个node节点都安装
[root@node1 node-v8.2.1]# cd /abc/ELK/
[root@node1 ELK]# tar xjvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /opt
[root@node2 ELK]# tar xjvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /opt
tar (child): bzip2: Cannot exec: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now
[root@node2 ELK]# yum -y install bzip2
[root@node1 ELK]# cd /opt/phantomjs-2.1.1-linux-x86_64/
[root@node1 phantomjs-2.1.1-linux-x86_64]# ls
bin ChangeLog examples LICENSE.BSD README.md third-party.txt
[root@node1 phantomjs-2.1.1-linux-x86_64]# cd bin/
[root@node1 bin]# ll
total 66340
-rwxr-xr-x 1 root root 67932064 Jan 25 2016 phantomjs
[root@node1 bin]# cp phantomjs /usr/local/bin/
5.5.3 环境包安装完毕,接下来安装elasticsearch-head
两个node节点都安装
[root@node1 bin]# tar zxvf /abc/ELK/elasticsearch-head.tar.gz -C /opt
[root@node1 bin]# cd /opt/elasticsearch-head/
[root@node1 elasticsearch-head]# ll
total 256
-rw-r--r-- 1 root root 248 Jul 27 2017 Dockerfile
-rw-r--r-- 1 root root 221 Jul 27 2017 Dockerfile-alpine
-rw-r--r-- 1 root root 104 Jul 27 2017 elasticsearch-head.sublime-project
-rw-r--r-- 1 root root 2231 Jul 27 2017 Gruntfile.js
-rw-r--r-- 1 root root 3482 Jul 27 2017 grunt_fileSets.js
-rw-r--r-- 1 root root 1088 Jul 27 2017 index.html
-rw-r--r-- 1 root root 559 Jul 27 2017 LICENCE
drwxr-xr-x 13 500 root 247 Aug 5 2017 node_modules
-rw-r--r-- 1 root root 886 Jul 27 2017 package.json
-rw-r--r-- 1 root root 216069 Aug 5 2017 package-lock.json
-rw-r--r-- 1 root root 100 Jul 27 2017 plugin-descriptor.properties
drwxr-xr-x 4 root root 53 Jul 27 2017 proxy
-rw-r--r-- 1 root root 6944 Jul 27 2017 README.textile
drwxr-xr-x 5 root root 140 Jul 27 2017 _site
drwxr-xr-x 4 root root 31 Jul 27 2017 src
drwxr-xr-x 4 root root 70 Jul 27 2017 test
[root@node1 elasticsearch-head]# npm install
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.0.0 (node_modules/karma/node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.12: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
npm WARN elasticsearch-head@0.0.0 license should be a valid SPDX license expression
up to date in 16.831s
5.5.4 修改head主配置文件,将head模块加入到配置文件中
两个节点都做
[root@node1 elasticsearch-head]# cd ~
[root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml
//末尾插入
http.cors.enabled: true
http.cors.allow-origin: "*"
[root@node1 ~]# systemctl restart elasticsearch
5.5.5 启动elasticsearch-head服务
两个节点都做
[root@node1 ~]# cd /opt/elasticsearch-head/
[root@node1 elasticsearch-head]# ls
Dockerfile Gruntfile.js LICENCE package-lock.json README.textile test
Dockerfile-alpine grunt_fileSets.js node_modules plugin-descriptor.properties _site
elasticsearch-head.sublime-project index.html package.json proxy src
[root@node1 elasticsearch-head]# npm run start &
//注意,得在解压包路径下做
[1] 10264
[root@node1 elasticsearch-head]#
> elasticsearch-head@0.0.0 start /opt/elasticsearch-head
> grunt server
Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100
[root@node1 elasticsearch-head]# netstat -lnupt | grep 9100
tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 10291/grunt
[root@node1 elasticsearch-head]# netstat -lnupt | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 6649/java
5.5.6 此时再用浏览器访问node1
修改链接
5.5.7 链接node2试试
5.6 测试创建索引
在node1创建
[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
}
在dashboard查看
5.7 在apache安装logstash并做一些日志搜集输出到elasticsearch中
5.7.1 关闭防火墙核心防护
[root@apache ~]# systemctl stop firewalld
[root@apache ~]# systemctl disable firewalld
[root@apache ~]# setenforce 0
setenforce: SELinux is disabled
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
5.7.2 安装httpd,查看java环境
[root@apache ~]# yum install -y httpd
[root@apache ~]# systemctl start httpd
[root@apache ~]# java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)
5.7.3 安装logstash
[root@apache ~]# mount.cifs //192.168.0.88/linuxs /abc -o vers=2.0
Password for root@//192.168.0.88/linuxs:
[root@apache ~]# cd /abc/ELK/
[root@apache ELK]# rpm -ivh logstash-5.5.1.rpm
[root@apache ELK]# systemctl start logstash.service
[root@apache ELK]# systemctl enable logstash.service
Created symlink from /etc/systemd/system/multi-user.target.wants/logstash.service to /etc/systemd/system/logstash.service.
[root@apache ELK]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
5.7.4 测试logstash(apache)与elasticsearch(node)之间功能对接是否正常
做对接测试
Logstash这个命令测试
字段描述解释:
● -f 通过这个选项可以指定logstash的配置文件,根据配置文件配置logstash
● -e 后面跟着字符串 该字符串可以被当做logstash的配置(如果是” ”,则默认使用stdin做为输入、stdout作为输出)
● -t 测试配置文件是否正确,然后退出
5.7.4.1 输入采用标准输入,输出采用标准输出
[root@apache ELK]# logstash -e 'input { stdin{} } output { stdout{} }'
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using --path.settings. Continuing using the defaults
Could not find log4j2 configuration at path //usr/share/logstash/config/log4j2.properties. Using default config which logs to console
00:32:57.242 [main] INFO logstash.setting.writabledirectory - Creating directory {:setting=>"path.queue", :path=>"/usr/share/logstash/data/queue"}
00:32:57.244 [main] INFO logstash.setting.writabledirectory - Creating directory {:setting=>"path.dead_letter_queue", :path=>"/usr/share/logstash/data/dead_letter_queue"}
00:32:57.259 [LogStash::Runner] INFO logstash.agent - No persistent UUID file found. Generating new UUID {:uuid=>"24a828bb-2012-40f7-b3d1-a3c79e1b3463", :path=>"/usr/share/logstash/data/uuid"}
00:32:57.647 [[main]-pipeline-manager] INFO logstash.pipeline - Starting pipeline {"id"=>"main", "pipeline.workers"=>2, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>250}
00:32:57.744 [[main]-pipeline-manager] INFO logstash.pipeline - Pipeline main started
The stdin plugin is now waiting for input:
00:32:57.929 [Api Webserver] INFO logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
www.baidu.com //输入www.baidu.com
2020-03-25T16:34:23.306Z apache www.baidu.com
www.sina.com.cn //输入www.sina.com.cn
2020-03-25T16:34:40.883Z apache www.sina.com.cn
//crtl+c 退出,进行下一个测试
5.7.4.2 使用rubydebug显示详细输出
codec为一种编码器
[root@apache ELK]# logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using --path.settings. Continuing using the defaults
Could not find log4j2 configuration at path //usr/share/logstash/config/log4j2.properties. Using default config which logs to console
00:40:02.023 [[main]-pipeline-manager] INFO logstash.pipeline - Starting pipeline {"id"=>"main", "pipeline.workers"=>2, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>250}
The stdin plugin is now waiting for input:
00:40:02.071 [[main]-pipeline-manager] INFO logstash.pipeline - Pipeline main started
00:40:02.253 [Api Webserver] INFO logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
www.badu^H^H //输入
{
"@timestamp" => 2020-03-25T16:40:53.764Z,
"@version" => "1",
"host" => "apache",
"message" => "www.badu\b\b"
}
www.baidu.com //输入
{
"@timestamp" => 2020-03-25T16:41:02.447Z,
"@version" => "1",
"host" => "apache",
"message" => "www.baidu.com"
}
5.7.4.3 使用logstash将信息写入到elsticsearch
输入、输出、对接
[root@apache ELK]# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.247.155:9200"] } }'
省略
The stdin plugin is now waiting for input:
00:48:25.589 [Api Webserver] INFO logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
www.baidu.com //输入内容
www.sina.com.cn //输入内容
www.google.com.cn
guoshiyuanzuishuai
gsyzs
5.7.4.4 切换到dashboard
5.7.5 做将logstash与系统日志文件对接配置
Logstash配置文件主要由三部分组成:input、output、filter(根据需要)
[root@apache ~]# chmod o+r /var/log/messages
[root@apache ~]# ll /var/log/messages
-rw----r--. 1 root root 1980059 Mar 26 07:49 /var/log/messages
[root@apache ~]# cd /etc/logstash/
[root@apache logstash]# ll
total 20
drwxrwxr-x 2 root root 6 Jul 19 2017 conf.d
-rw-r--r-- 1 root root 1738 Jul 19 2017 jvm.options
-rw-r--r-- 1 root root 1334 Jul 19 2017 log4j2.properties
-rw-r--r-- 1 root root 5660 Mar 26 00:27 logstash.yml
-rw-r--r-- 1 root root 1659 Jul 19 2017 startup.options
[root@apache logstash]# cd conf.d/
[root@apache conf.d]# ll
total 0
[root@apache conf.d]# vim system.conf
input {
file {
path => "/var/log/messages"
type => "system"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["192.168.247.155:9200"]
index => "system-%{+YYYY.MM.dd}"
}
}
[root@apache conf.d]# systemctl restart logstash.service
5.7.6 到elasticsearch节点查看
5.8 在node1节点上面安装Kibana
[root@node1 ~]# cd /abc/
[root@node1 abc]# cd ELK/
[root@node1 ELK]# rpm -ivh kibana-5.5.1-x86_64.rpm
[root@node1 ELK]# cd /etc/kibana/
[root@node1 kibana]# ll
total 8
-rw-r--r-- 1 root root 4649 Jul 19 2017 kibana.yml
[root@node1 kibana]# cp -p kibana.yml kibana.yml.bak
[root@node1 kibana]# vim kibana.yml
2 server.port: 5601 //开启端口
7 server.host: "0.0.0.0" //监听IP
20 elasticsearch.url: "http://192.168.247.155:9200" //指定elasticsearch路径
29 kibana.index: ".kibana" //添加索引
[root@node1 kibana]# systemctl start kibana.service
[root@node1 kibana]# systemctl enable kibana.service
Created symlink from /etc/systemd/system/multi-user.target.wants/kibana.service to /etc/systemd/system/kibana.service.
[root@node1 kibana]# netstat -natp | grep 5601
tcp 0 0 0.0.0.0:5601 0.0.0.0:* LISTEN 28205/node
5.8.2登录Kibana的dashboard
http://192.168.247.155:5601
创建一个索引
然后查看
添加类型
5.9 对接apache的日志文件(access、error)
5.9.1 首先先配置logstash去收集apache日志文件
[root@apache conf.d]# pwd
/etc/logstash/conf.d
[root@apache conf.d]# vim 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.247.155:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["192.168.247.155:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}
[root@apache conf.d]# ll /etc/httpd/logs/error_log
-rw-r--r-- 1 root root 669 Mar 26 00:25 /etc/httpd/logs/error_log
//不用添加权限
[root@apache conf.d]# /usr/share/logstash/bin/logstash -f apache_log.conf
//开启
5.9.2 查看elasticsearch的dashboard(head)
没有access,访问一下
刷新
5.9.3 查看Kibana的dashboard
创建apache_error-*和apache_access-*索引
切换索引
可以查询指定时间段