ELK日志分析系统

ELK

ELK 是一套开源的日志分析系统,由elasticsearch+logstash+Kibana 组成。
官网说明 : https://www.elastic.co/cn/products
首先 : 先一句话简单了解 E,L,K 这三个软件
elasticsearch: 分布式搜索引擎
logstash: 日志收集与过滤,输出给 elasticsearch
Kibana: 图形化展示

elasticsearch

elasticsearch****简介

Elasticsearch( 简称 ES) 是一个 开源的分布式搜索引擎 ,Elasticsearch 还是一个 分布式文档数据库 。所以它
提供了大量数据的 存储 功能 , 快速的 搜索分析 功能。
提到搜索 , 大家肯定就想到了百度 , 谷歌 , 必应等。当然也有如下的搜索场景。

elasticsearch集群部署

集群部署主要注意以下几个方面
1. 集群配置参数:
discovery.zen.ping.unicast.hosts , Elasticsearch 默认使用 Zen Discovery 来做节点发现机
制,推荐使用 unicast 来做通信方式,在该配置项中列举出 Master 节点。
discovery.zen.minimum_master_nodes ,该参数表示集群中 Master 节点可工作 Master 的最
小票数,默认值是 1 。为了提高集群的可用性,避免脑裂现象。官方推荐设置为 (N/2)+1 ,其中
N 是具有 Master 资格的节点的数量。
discovery.zen.ping_timeout ,表示节点在发现过程中的等待时间,默认值是 30 秒,可以根据
自身网络环境进行调整,一定程度上提供可用性。
2. 集群节点:
节点类型主要包括 Master 节点和 data 节点 (client 节点和 ingest 节点不讨论 ) 。通过设置两个配
置项 node.master 和 node.data 为 true 或 false 来决定将一个节点分配为什么类型的节点。
尽量将 Master 节点和 Data 节点分开,通常 Data 节点负载较重,需要考虑单独部署。
3. 内存:
Elasticsearch 默认设置的内存是 1GB ,对于任何一个业务部署来说,这个都太小了。通过指定
ES_HEAP_SIZE 环境变量,可以修改其堆内存大小,服务进程在启动时候会读取这个变量,并
相应的设置堆的大小。建议设置系统内存的一半给 Elasticsearch ,但是不要超过 32GB 。
4. 硬盘空间:
Elasticsearch 默认将数据存储在 /var/lib/elasticsearch 路径下,随着数据的增长,一定会出现
硬盘空间不够用的情形,大环境建议把分布式存储挂载到 /var/lib/elasticsearch 目录下以方便
扩容。
配置参考文档 : https://www.elastic.co/guide/en/elasticsearch/reference/index.html
首先在 ES 集群所有节点都安装 ES( 步骤省略 )
可以使用两台或两台以上 ES 做集群 , 以下就是两台 ES 做集群的配置

cpp 复制代码
//vm1,vm2搭建集群
//环境准备:   vm1.cluster.com 192.168.35.142 
//            vm2.cluster.com 192.168.35.143

//vm1
//安装java软件包
[root@vm1 ~]# yum -y install java-1.8.0*

//查看java版本
[root@vm1 ~]# java -version
openjdk version "1.8.0_422"

//安装elasticsearch
[root@vm1 ~]# rz -E
rz waiting to receive.
[root@vm1 ~]# ls
anaconda-ks.cfg  elasticsearch-6.5.2.rpm
[root@vm1 ~]# rpm -ivh elasticsearch-6.5.2.rpm 

//修改配置文件并从重启服务
[root@vm1 ~]# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: elk-cluster //可以自定义一个集群名称,不配置的话默认会取名为elasticsearch
node.name: 10.1.1.12  //本机IP或主机名
node.master: true   //指定为master节点
path.data: /var/lib/elasticsearch  //默认
path.logs: /var/log/elasticsearch 、、默认
network.host: 0.0.0.0 //打开注释,并修改为监听所有
http.port: 9200 //打开注释,监听端口9200
discovery.zen.ping.unicast.hosts: ["192.168.35.142", "192.168.35.143"] //集群所有节点IP 
[root@vm1 ~]# systemctl restart elasticsearch.service 
[root@vm1 ~]# systemctl enable elasticsearch.service 

//验证9200,9300端口
[root@vm1 ~]# ss -anlt
State  Recv-Q Send-Q  Local Address:Port    Peer Address:Port Process 
LISTEN 0      128           0.0.0.0:22           0.0.0.0:*            
LISTEN 0      5           127.0.0.1:25151        0.0.0.0:*            
LISTEN 0      5             0.0.0.0:873          0.0.0.0:*            
LISTEN 0      4096                *:9300               *:*            
LISTEN 0      511                 *:80                 *:*            
LISTEN 0      128              [::]:22              [::]:*            
LISTEN 0      511                 *:443                *:*            
LISTEN 0      5                [::]:873             [::]:*            
LISTEN 0      4096                *:9200               *:*

    
//vm2
//安装java软件包
[root@vm2 ~]# yum -y install java-1.8.0*

//查看java版本
[root@vm2 ~]# java -version
openjdk version "1.8.0_422"

//安装elasticsearch
[root@vm2 ~]# rz -E
rz waiting to receive.
[root@vm2 ~]# ls
anaconda-ks.cfg  elasticsearch-6.5.2.rpm
[root@vm2 ~]# rpm -ivh elasticsearch-6.5.2.rpm 

//修改配置文件并从重启服务
[root@vm2 ~]# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: elk-cluster //可以自定义一个集群名称,不配置的话默认会取名为elasticsearch
node.name: 10.1.1.12  //本机IP或主机名
node.master: true   //指定为master节点
path.data: /var/lib/elasticsearch  //默认
path.logs: /var/log/elasticsearch 、、默认
network.host: 0.0.0.0 //打开注释,并修改为监听所有
http.port: 9200 //打开注释,监听端口9200
discovery.zen.ping.unicast.hosts: ["192.168.35.142", "192.168.35.143"] //集群所有节点IP   
[root@vm2 ~]# systemctl restart elasticsearch.service 
[root@vm2 ~]# systemctl enable elasticsearch.service 

//验证9200,9300端口,使用curl命令或浏览器访问http:///192.168.35.143:9200/_cluster/health?pretty地址(IP为ES服务器IP),也可以在网页查询            
[root@vm2 ~]# ss -anlt
State  Recv-Q Send-Q   Local Address:Port   Peer Address:Port Process 
LISTEN 0      128            0.0.0.0:22          0.0.0.0:*            
LISTEN 0      4096                 *:9300              *:*            
LISTEN 0      128               [::]:22             [::]:*            
LISTEN 0      4096                 *:9200              *:*                     
[root@vm2 ~]# curl http://192.168.35.143:9200/_cluster/health?pretty
{
  "cluster_name" : "elk-cluster",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 2, //2个数据节点
  "number_of_data_nodes" : 2, //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
}

使用curl命令或浏览器访问http:///192.168.35.143:9200/_cluster/health?pretty地址(IP为ES服务器IP,访问ES集群中任何一个节点IP都可以)

elasticsearch****基础概念

主要的基础概念有 :Node, Index,Type,Document,Field,shard 和 replicas.
Node( 节点 ) :运行单个 ES 实例的服务器
Cluster( 集群 ) :一个或多个节点构成集群
Index( 索引 ) :索引是多个文档的集合
Type( 类型 ) :一个 Index 可以定义一种或多种类型,将 Document 逻辑分组
Document( 文档 ) : Index 里每条记录称为 Document ,若干文档构建一个 Index
Field( 字段 ) : ES 存储的最小单元
Shards( 分片 ) : ES 将 Index 分为若干份,每一份就是一个分片
Replicas( 副本 ) : Index 的一份或多份副本
为了便于理解 , 我们和 mysql 这种关系型数据库做一个对比 :

|-----------------------------------------------------|-------------------|
| 关系型数据库 ( mysql,oracle ) | elasticsearch |
| database 或 schema | index |
| table | type |
| row | document |
| column 或 field | field |

ES 是分布式搜索引擎,每个索引有一个或多个分片 (shard) ,索引的数据被分配到各个分片上。你可以看
作是一份数据分成了多份给不同的节点。
当 ES 集群增加或删除节点时 ,shard 会在多个节点中均衡分配。默认是 5 个 primary shard( 主分片 ) 和 1 个
replica shard( 副本 , 用于容错 ) 。

elaticsearch基础API****操作

什么是API? API(Application Programming Interface) 应用程序编程接口 ,就是无需访问程序源码或理解内部工 作机制就能实现一些相关功能的接口 。
RestFul API 格式

cpp 复制代码
curl -X<verb> '<protocol>://<host>:<port>/<path>?<query_string>'-d '<body>'

|--------------|---------------------------------------------|
| 参数 | 描述 |
| verb | HTTP 方法,比如 GET 、 POST 、 PUT 、 HEAD 、 DELETE |
| host | ES 集群中的任意节点主机名 |
| port | ES HTTP 服务端口,默认 9200 |
| path | 索引路径 |
| query_string | 可选的查询请求参数。例如 ?pretty 参数将返回 JSON 格式数据 |
| -d | 里面放一个 GET 的 JSON 格式请求主体 |
| body | 自己写的 JSON 格式的请求主体 |

更多 API 参考 : https://www.elastic.co/guide/en/elasticsearch/reference/6.2/index.html
查看节点信息
通过 curl或浏览器访问 192.168.35.143:9200/_cat/nodes?v (ip 为 ES 节点 IP, 如果有 ES 集群 , 则为 ES 任意节点IP)

查看索引信息

通过curl命令或浏览器访问

此时没有索引

新增索引

输入以下代码后刷新网页,索引添加成功

cpp 复制代码
[root@vm2 ~]# curl -X PUT http://192.168.35.143:9200/nginx_access_log
{"acknowledged":true,"shards_acknowledged":true,"index":"nginx_access_log"}[root@vm2 ~]# 


health:索引状态(green,yellow,red)
green :所有的主分片和副本分片都已分配。你的集群是 100% 可用的。
yellow :所有的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,所以搜索结果依 然是完整的。不过,你的高可用性在某种程度上被弱化。如果 更多的 分片消失,你就会丢数据了。把 yellow 想象成一个需要及时调查的警告。
red :至少一个主分片(以及它的全部副本)都在缺失中。这意味着你在缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。
index:索引名
pri:主分片
rep:副本
docs.count:文档的数量
docs.deleted:已删除文档数量

删除索引

cpp 复制代码
[root@vm2 ~]# curl -X DELETE http://192.168.35.143:9200/nginx_access_log
{"acknowledged":true}

通过curl或浏览器访问192.168.35.143:9200/_cat/indices?v

此时索引被删除了

ES****查询语句
ES 提供一种可用于执行查询 JSON 式的语言,被称为 Query DSL 。
查询匹配条件:
match_all
from,size
match
需提前导入数据源
参考地址:
https://raw.githubusercontent.com/elastic/elasticsearch/master/docs/src/test/res
ources/accounts.json

cpp 复制代码
//查询确认
[root@vm2 ~]# curl "192.168.35.143:9200/_cat/indices?v"
health status index uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   bank  npsciwz5SNef6pmkTQnvmA   5   1       1000            0    950.4kb        475.2kb

//查询bank索引的数据(使用查询字符串进行查询)
[root@vm2 ~]# curl -X GET "192.168.35.143:9200/bank/_search?q=*&sort=account_number:asc&pretty"

//查询bank索引的数据(使用json格式进行查询)
[root@vm2 ~]# curl-X GET "192.168.35.143:9200/bank/_search" -H 'Content-Type:application/json' -d'
> {
> "query":{"match_all":{} },
> "sort":[
> {"account_number":"asc"}
> ]
> }
> '

//查询bank索引的数据 (使用query格式进行查询)
[root@vm2 ~]# curl -X GET "192.168.35.143:9200/bank/_search" -H 'Content-Type:application/json' -d'
{
"query":{"match_all":{} },
"size":1
> }
> '

//指定位置与查询条数
[root@vm2 ~]# curl -X GET "192.168.35.143:9200/bank/_search" -H 'Content-Type:application/json' -d'
{
"query":{"match_all":{} },
"from": 0,
> "size": 2
> }
> '

//示例: 查询account_number从第501条到510条的数据
[root@vm2 ~]# curl -X GET "192.168.35.143:9200/bank/_search" -H 'Content-Type:application/json' -d'
{
"query":{"match_all":{} },
"from": 500,
"size": 10,
> "sort": [
> {"account_number":"asc"}
> ]
> }
> '

elasticsearch-head

elasticsearch-head 是集群管理、数据可视化、增删改查、查询语句可视化工具。从 ES5 版本后安装方式
和 ES2 以上的版本有很大的不同 , 在 ES2 中可以直接在 bin 目录下执行 plugin install xxxx 来进行安装 , 但是
在 ES5 中这种安装方式变了 , 要想在 ES5 中安装 Elasticsearch Head 必须要安装 NodeJs, 然后通过 NodeJS 来
启动 Head 。
官网地址 : https://github.com/mobz/elasticsearch-head
elasticsearch-head 安装
1 : 下载相关软件并上传到服务器
官网有安装说明 , 可以通过 git 安装 , 也可以下载 zip 包解压安装
下载相应的软件包 , 并拷贝到 ES 集群的一个节点上 ( 我这里拷贝到 192.168.35.143 这台 , 也就是 vm2 上 )

nodejs下载页面: https://nodejs.org/en/download/

2**:安装nodejs**

cpp 复制代码
[root@vm2 ~]# unzip elasticsearch-head-master.zip 
[root@vm2 ~]# ls
accounts.json            elasticsearch-head-master
anaconda-ks.cfg          elasticsearch-head-master.zip
elasticsearch-6.5.2.rpm  node-v10.24.1-linux-x64.tar.xz

3 : 安装 es-head

cpp 复制代码
[root@vm2 ~]# cd elasticsearch-head-master/
[root@vm2 elasticsearch-head-master]# npm install --registry=http://registry.npm.taobao.org
//此时安装完成后如果有ERR报错,执行如下命令,再重新安装
[root@vm2 elasticsearch-head-master]# npm install phantomjs-prebuilt@2.1.16 --ignore-script --registry=http://registry.npm.taobao.org
[root@vm2 elasticsearch-head-master]# npm install --registry=http://registry.npm.taobao.org

//放入后台运行,检查端口
[root@vm2 elasticsearch-head-master]# nohup npm run start &
[1] 1286
[root@vm2 elasticsearch-head-master]# nohup: ignoring input and appending output to 'nohup.out
[root@vm2 elasticsearch-head-master]# ss -anlt
State  Recv-Q Send-Q   Local Address:Port   Peer Address:Port Process 
LISTEN 0      511            0.0.0.0:9100        0.0.0.0:*            
LISTEN 0      128            0.0.0.0:22          0.0.0.0:*            
LISTEN 0      4096                 *:9200              *:*            
LISTEN 0      128               [::]:22             [::]:*            
LISTEN 0      4096                 *:9300              *:* 

4 : 浏览器访问
浏览器访问 http://es - head 节点IP:9100,
并在下面的地址里把 localhost 改为 es-head 节点 IP( 浏览器与 es-head 不是同一节点就要做 ),此时连接会发现连接不上,需要进一步进行配置

5**:修改ES集群配置文件,**并重启服务

cpp 复制代码
//在配置文件中discovery.zen.ping.unicast.hosts: ["192.168.35.142", "192.168.35.143"]后加上这两句,再重启服务,vm1,vm2都需要进行此操作
[root@vm1 ~]# vim /etc/elasticsearch/elasticsearch.yml  
http.cors.enabled: true
http.cors.allow-origin: "*"
[root@vm1 ~]# systemctl restart elasticsearch.service 
[root@vm1 ~]# systemctl enable elasticsearch.service 

此时刷新网页,进行连接会发现成功连接

logstash

logstash****简介

logstash 是一个开源的数据采集工具 , 通过数据源采集数据 . 然后进行过滤 , 并自定义格式输出到目的地。
数据分为 :

  1. 结构化数据 如 :mysql 数据库里的表等
  2. 半结构化数据 如 : xml,yaml,json 等
  3. 非结构化数据 如 : 文档 , 图片 , 音频 , 视频等
    logstash 可以采集任何格式的数据 , 当然我们这里主要是讨论采集系统日志 , 服务日志等日志类型数据。
    官方产品介绍 : https://www.elastic.co/cn/products/logstash

input 插件 : 用于导入日志源 ( 配置必须 )
https://www.elastic.co/guide/en/logstash/current/input-plugins.html
filter 插件 : 用于过滤 ( 不是配置必须的 )
https://www.elastic.co/guide/en/logstash/current/filter-plugins.html
output 插件 : 用于导出 ( 配置必须 )
https://www.elastic.co/guide/en/logstash/current/output-plugins.html

logstash****部署
cpp 复制代码
//环境准备: vm1.cluster.com 192.168.35.142
//           vm2.cluster.com 192.168.35.143
//           vm3.cluster.com 192.168.35.144
//安装Java
[root@vm3 ~]# yum -y install java-1.8.0*

//在logstash服务器上安装logstash
[root@vm3 ~]# rz -E
rz waiting to receive.
[root@vm3 ~]# ls
anaconda-ks.cfg  logstash-6.5.2.rpm
[root@vm3 ~]# rpm -ivh logstash-6.5.2.rpm 

//配置logstash主配置文件
[root@vm3 ~]# vim  /etc/logstash/logstash.yml
path.data: /var/lib/logstash
path.config: /etc/logstash/conf.d/ //打开注释,并加上配置目录路径
http.host: "192.168.35.144"  //打开注释,并改为本机IP(这是用于xpack监控用,但要收费,所以在这里不配置也可以)
path.logs: /var/log/logstash

//启动测试 
[root@vm3 ~]# cd /usr/share/logstash/bin
[root@vm3 bin]#  ./logstash -e 'input {stdin {}} output {stdout {}}'

//另一种验证方法
[root@vm3 bin]#  vim /etc/logstash/conf.d/test.conf
[root@vm3 bin]# ./logstash --path.settings /etc/logstash -f
/etc/logstash/conf.d/test.conf -t
// --path.settings 指定logstash主配置文件目录
// -f 指定片段配置文件
// -t 测试配置文件是否正确
// codec => rubydebug这句可写可不定,默认就是这种输出方式
日志采集

采集 messages 日志
这里以 /var/log/messages 为例 , 只定义 input 输入和 output 输出 , 不考虑过滤

cpp 复制代码
[root@vm3 ~]# cd /usr/share/logstash/bin/
[root@vm3 bin]# vim /etc/logstash/conf.d/test.conf
input {
file {
path => "/var/log/messages"
start_position => "beginning"
}
}
output {
elasticsearch{
hosts => ["10.1.1.12:9200"]
index => "test-%{+YYYY.MM.dd}"
}
}

[root@vm3 bin]#  ./logstash --path.settings /etc/logstash/ -r -f 
[root@vm3 bin]# ss -anlt
State  Recv-Q Send-Q           Local Address:Port   Peer Address:Port Process                                                               
LISTEN 0      128                    0.0.0.0:22          0.0.0.0:*                                                                          
LISTEN 0      128                       [::]:22             [::]:*                                                                          
LISTEN 0      50     [::ffff:192.168.35.144]:9600              *:*

通过浏览器访问 es-head 验证

cpp 复制代码
[root@vm3 ~]# echo 123 >> /var/log/messages 

采集多日志源

cpp 复制代码
[root@vm3 bin]# vim /etc/logstash/conf.d/test.conf 

                type => "dnf"
        }

}
filter {
}

output {
        if [type] == "messages" {
        elasticsearch{
                hosts => ["192.168.35.142:9200","192.168.35.143:9200"]
                index => "test-%{+YYYY.MM.dd}"
                }
        }
        if [type] == "dnf" {
        elasticsearch{
                hosts => ["192.168.35.142:9200","192.168.35.143:9200"]
                index => "dnf-%{+YYYY.MM.dd}"
                }
        }

}

刷新一下网页

kibana

kibana****介绍

Kibana 是一个开源的可视化平台 , 可以为 ElasticSearch 集群的管理提供友好的 Web 界面 , 帮助汇总 , 分析和
搜索重要的日志数据。
文档路径 : https://www.elastic.co/guide/en/kibana/current/setup.html

kibana****部署
cpp 复制代码
//第1步: 在kibana服务器(我这里是VM1)上安装kibana
[root@vm1 ~]# rz -E
rz waiting to receive.
[root@vm1 ~]# ls
anaconda-ks.cfg  elasticsearch-6.5.2.rpm  kibana-6.5.2-x86_64.rpm
[root@vm1 ~]# rpm -ivh kibana-6.5.2-x86_64.rpm 
warning: kibana-6.5.2-x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
Verifying...                          ################################# [100%]
Preparing...                          ################################# [100%]
Updating / installing...
   1:kibana-6.5.2-1                   ################################# [100%]

// 配置kibana
[root@vm1 ~]# vim /etc/kibana/kibana.yml
server.port: 5601  //端口
server.host: "0.0.0.0"  //监听所有,允许所有人能访问
elasticsearch.url: "http://10.1.1.12:9200"  //ES集群的路径
logging.dest: /var/log/kibana.log   //我这里加了kibana日志,方便排错与调试

//日志要自己建立,并修改owner和group属性
[root@vm1 ~]# cd /var/log/
[root@vm1 log]# touch kibana.log
[root@vm1 log]# chown kibana.kibana kibana.log

//重启服务,验证端口 
[root@vm1 log]# systemctl restart kibana.service 
[root@vm1 log]# systemctl enable kibana.service 
Created symlink /etc/systemd/system/multi-user.target.wants/kibana.service → /etc/systemd/system/kibana.service.
[root@vm1 log]# ss -anlt
State  Recv-Q Send-Q  Local Address:Port    Peer Address:Port Process 
LISTEN 0      128           0.0.0.0:22           0.0.0.0:*            
LISTEN 0      5             0.0.0.0:873          0.0.0.0:*            
LISTEN 0      511           0.0.0.0:5601         0.0.0.0:*            
LISTEN 0      5           127.0.0.1:25151        0.0.0.0:*            
LISTEN 0      511                 *:443                *:*            
LISTEN 0      511                 *:80                 *:*            
LISTEN 0      128              [::]:22              [::]:*            
LISTEN 0      5                [::]:873             [::]:*            
LISTEN 0      4096                *:9200               *:*            
LISTEN 0      4096     
相关推荐
Acrelhuang2 分钟前
安科瑞5G基站直流叠光监控系统-安科瑞黄安南
大数据·数据库·数据仓库·物联网
雷神乐乐2 分钟前
File.separator与File.separatorChar的区别
java·路径分隔符
小刘|6 分钟前
《Java 实现希尔排序:原理剖析与代码详解》
java·算法·排序算法
逊嘘25 分钟前
【Java语言】抽象类与接口
java·开发语言·jvm
morris13132 分钟前
【SpringBoot】Xss的常见攻击方式与防御手段
java·spring boot·xss·csp
十叶知秋1 小时前
【jmeter】jmeter的线程组功能的详细介绍
数据库·jmeter·性能测试
七星静香1 小时前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel
Jacob程序员1 小时前
java导出word文件(手绘)
java·开发语言·word
ZHOUPUYU1 小时前
IntelliJ IDEA超详细下载安装教程(附安装包)
java·ide·intellij-idea
stewie61 小时前
在IDEA中使用Git
java·git