ELK日志分析平台-(2)elasticsearch节点角色以及logstash采集数据、伪装rsyslog、多行过滤、grok切片

1. elasticsearch节点角色

节点角色功能
Master主要负责集群中索引的创建、删除以及数据的Rebalance等操作。Master不负责数据的索引和检索,所以负载较轻。当Master节点失联或者挂掉的时候,ES集群会自动从其他Master节点选举出一个Leader
Ingest Node专门对索引的文档做预处理
Data Node主要负责集群中数据的索引和检索,一般压力比较大
Coordinating Node原来的Client node的,主要功能是来分发请求和合并结果的。所有节点默认就是Coordinating node,且不能关闭该属性

在生产环境下,如果不修改elasticsearch节点的角色信息,在高数据量,高并发的场景下集群容易出现脑裂等问题。
默认情况下,elasticsearch集群中每个节点都有成为主节点的资格,也都存储数据,还可以提供查询服务。

节点角色是由以下属性控制:

node.master:这个属性表示节点是否具有成为主节点的资格注意:此属性的值为true,并不意味着这个节点就是主节点。因为真正的主节点,是由多个具有主节点资格的节点进行选举产生的。

node.data:这个属性表示节点是否存储数据。

node.ingest: 是否对文档进行预处理。

search.remote.connect:是否禁用跨集群查询

默认情况下这些属性的值都是true。
生产集群中可以对这些节点的职责进行划分:

建议集群中设置3台以上的节点作为master节点,这些节点只负责成为主节点,维护整个集群的状态。
再根据数据量设置一批data节点,这些节点只负责存储数据,后期提供建立索引和查询索引的服务,这样的话如果用户请求比较频繁,这些节点
的压力也会比较大。
所以在集群中建议再设置一批协调节点,这些节点只负责处理用户请求,实现请求转发,负载均衡等功能。

节点需求:

master节点:普通服务器即可(CPU、内存 消耗一般)
data节点:主要消耗磁盘、内存。
path.data: data1,data2,data3
这样的配置可能会导致数据写入不均匀,建议只指定一个数据路径,磁盘可以使用raid0阵列,而不需要成本高的ssd。
Coordinating节点:对cpu、memory要求较高。

进行简单的测试:在vm2上编辑文件
在这里插入图片描述
在节点名称下面添加语句,表示该主机不存放数据

在这里插入图片描述
重启服务

在这里插入图片描述
可以看到vm2已经没有了data角色

在这里插入图片描述
而其他节点是有data角色的,可以存储数据
在这里插入图片描述
有五种组合:

第一种组合:(默认)
node.master: true
node.data: true
node.ingest:  true
search.remote.connect: true
这种组合表示这个节点即有成为主节点的资格,又存储数据。
如果某个节点被选举成为了真正的主节点,那么他还要存储数据,这样对于这个节点的压力就比较大了。
测试环境下这样做没问题,但实际工作中不建议这样设置。
第二种组合:(Data node)
node.master: false
node.data: true
node.ingest: false
search.remote.connect: false
这种组合表示这个节点没有成为主节点的资格,也就不参与选举,只会存储数据。
这个节点称为data(数据)节点。在集群中需要单独设置几个这样的节点负责存储数据。后期提供存储和查询服务。
第三种组合:(master node)
node.master: true
node.data: false
node.ingest: false
search.remote.connect: false
这种组合表示这个节点不会存储数据,有成为主节点的资格,可以参与选举,有可能成为真正的主节点。
这个节点我们称为master节点。
第四种组合:(Coordinating Node)
node.master: false
node.data: false
node.ingest: false
search.remote.connect: false
这种组合表示这个节点即不会成为主节点,也不会存储数据,
这个节点的意义是作为一个协调节点,主要是针对海量请求的时候可以进行负载均衡。
第五种组合:(Ingest Node)
node.master: false
node.data: false
node.ingest: true
search.remote.connect: false
这种组合表示这个节点即不会成为主节点,也不会存储数据,
这个节点的意义是ingest节点,对索引的文档做预处理。

2. logstash简介

Logstash是一个开源的服务器端数据处理管道。
logstash拥有200多个插件,能够同时从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的 “存储库” 中。(大多都是 Elasticsearch。)
Logstash管道有两个必需的元素,输入和输出,以及一个可选元素过滤器。

在这里插入图片描述

(1):输入:采集各种样式、大小和来源的数据

Logstash 支持各种输入选择 ,同时从众多常用来源捕捉事件。
能够以连续的流式传输方式,轻松地从您的日志、指标、Web 应用、数据存储以及各种 AWS 服务采集数据。

在这里插入图片描述

(2) 过滤器:实时解析和转换数据

数据从源传输到存储库的过程中,Logstash 过滤器能够解析各个事件,识别已命名的字段以构建结构,并将它们转换成通用格式,以便更轻松、更快速地分析和实现商业价值。
利用 Grok 从非结构化数据中派生出结构
从 IP 地址破译出地理坐标
将 PII 数据匿名化,完全排除敏感字段
简化整体处理,不受数据源、格式或架构的影响

(3) 输出:选择您的存储库,导出您的数据

尽管 Elasticsearch 是我们的首选输出方向,能够为我们的搜索和分析带来无限可能,但它并非唯一选择。
Logstash 提供众多输出选择,您可以将数据发送到您要指定的地方,并且能够灵活地解锁众多下游用例。

在这里插入图片描述

3. logstash安装

再开一个新虚拟机vm4,IP:172.25.10.14 ,分配1G内存

官网https://elasticsearch.cn/download/
准备java的jdk包

安装

在这里插入图片描述

4 . logstash简单命令行测试

找到logstash命令的路径执行,标准输入到标准输出,即命令行输入,命令行输出

在这里插入图片描述
输入hello world,标准输出hello world

在这里插入图片描述

5 . 进行文件测试

(1)标准输入到文件

进入/etc/logstash/conf.d/目录,编辑文件,.conf结尾的文件都可以读到

在这里插入图片描述

[root@vm4 conf.d]# cat test.conf 
input {
	stdin {}          命令行标准输入
}

output {
 file {			
   path => "/tmp/testfile"          输出到这个目录
   codec => line { format => "custom format: %{message}"}    格式为custom format: {输入内容}
 }
}

在这里插入图片描述
执行文件,执行完毕后输入hello linux

在这里插入图片描述输出成功

在这里插入图片描述
继续修改修改test.conf文件,我们想直接看到输出结果

[root@vm4 conf.d]# cat test.conf 
input {
	stdin {} 
}

output {                       命令行输出
    stdout {}
 
 file {			               文件输出
   path => "/tmp/testfile"
   codec => line { format => "custom format: %{message}"}
 }
}

执行文件,输入westos,可以看到不仅在命令行显示出来,也输出到了testfile

在这里插入图片描述

(2)命令行输入,输出到elasticsearch

编辑es.conf 文件

[root@vm4 conf.d]# cat es.conf 
input {
       stdin {}

}

output {
       stdout {}           标准输出一份

       elasticsearch{    给elasticsearch输出一份
              hosts => ["172.25.10.11:9200"]    目标elasticsearch的主机 IP
              index => "logstash-%{+yyyy.MM.dd}"  索引格式为logstash-年月日
       }
}

执行 westos linux
标准输出一份

在这里插入图片描述
数据浏览中可以看到elasticsearch也输出一份
在这里插入图片描述

(3)文件输入,输出到elasticsearch

我们要把日志文件作为输入,首先要把权限改为644,因为logstash读取时是logstash身份,所以必须开放读的权力。
在这里插入图片描述
继续编辑es.conf文件

[root@vm4 conf.d]# cat es.conf 
input {
      file {	
		path => "/var/log/messages"/var/log/messages输入
		start_position => "beginning"    从头开始输入
	}
}

output {
       stdout {}

       elasticsearch{
              hosts => ["172.25.10.11:9200"]
              index => "logstash-%{+yyyy.MM.dd}"
       }
}

执行文件,可以看到输出了很多了 /var/log/messages

在这里插入图片描述
在elasticsearch也可以看到很多数据

在这里插入图片描述

如果将刚才创建的索引删除了,再次创建可以恢复吗?
在这里插入图片描述
删除

在这里插入图片描述
再次执行es.conf文件,没有数据产生

在这里插入图片描述
终端被占用了,再开启一个窗口,输入一条日志

在这里插入图片描述
在刚才运行es.conf的窗口查看,有输出了,但是并没有从头开始,这是刚才远程登录和写的日志

在这里插入图片描述
那么之前的日志去哪里了?是去elasticsearch上了

再次删除索引

在这里插入图片描述

在如图所示的目录里有一个.sincedb的文件,它负责记录数据偏移量,因为之前已经输入了那个内容,不会重复输入,删除之后就可以重新输入了

在这里插入图片描述
再次执行文件,刚才输入的内容又回来了

在这里插入图片描述
在这里插入图片描述

sincedb文件一共6个字段,分别表示inode编号、文件系统的主要设备号、文件系统的次要设备号、文件中的当前字节偏移量、最后一个活动时间戳(浮点数)、与此记录匹配的最后一个已知路径
在这里插入图片描述

6. logstash可以伪装成日志服务器,直接接受远程日志

如果按照前面的方法收集日志信息,需要每台服务器上都部署logstash,这样太累了,那能不能让logstash伪装成日志服务器,每个节点服务器远程发送日志给logstash呢?

继续编辑文件

[root@vm4 conf.d]# vim es.conf 
[root@vm4 conf.d]# cat es.conf 
input {
#      file {	
#		path => "/var/log/messages"
#		start_position => "beginning"
#
#	}
        syslog {            伪装syslog,开放端口514
		port => 514
	}
}


output {
       stdout {}

       elasticsearch{
              hosts => ["172.25.10.11:9200"]
              index => "syslog-%{+yyyy.MM.dd}"
       }
}

执行文件

在这里插入图片描述
在另一个窗口查看514端口

在这里插入图片描述
在vm1上编辑 /etc/rsyslog.conf文件,打开514端口

在这里插入图片描述

所有日志给vm4 172.25.10.14:514发一份
在这里插入图片描述
重启rsyslog服务

在这里插入图片描述
这个时候,vm4的窗口已经产生了输入,可以看到vm1的日志

在这里插入图片描述
同理,修改vm2上的/etc/rsyslog.conf文件

在这里插入图片描述
在这里插入图片描述

重启服务后,在vm4上也可以看到vm2的日志输入了
在这里插入图片描述
这个时候重新开一个窗口查看vm4的514端口有三个,一个是自己的接受端口,一个是vm1的发送端口,一个是vm2的发送端口

在这里插入图片描述

7 . 多行过滤插件

错误日志一般都有很多行,按照前面的做法会分成很多条,一行一行看很难懂。
多行过滤可以把多行日志记录合并为一行输出。

(1)命令行多行输入,文件输出

编辑文件

[root@vm4 conf.d]# vim test.conf 
[root@vm4 conf.d]# cat test.conf 
input {
	stdin {
            codec => multiline 	{        多行输入
            pattern => "EOF"             结束标志词为EOF
            negate => "true"
            what => "previous"                        
     	      } 
      }
}

output {
    stdout {}
 
 file {			
   path => "/tmp/testfile"             输出文件到这个
   codec => line { format => "custom format: %{message}"}   格式为custom format:{数据}
 }
}

执行文件

在这里插入图片描述

多行输入,结束时输入EOF,可以看到标准输出是一行

在这里插入图片描述

在testfile中查看也是一条

在这里插入图片描述

(2)文件多行输入,输出到elasticsearch

接下来用文件输入来测试,使用es集群的vm1的日志(之前有一些报错日志),把my-es.log发给vm4的/var/log

在这里插入图片描述正确的日志都是以时间开头的,并且被中括号[ ]括起来的一行,而错误日志有很多行,比如下图的at org开头的这些,他们合起来应该是一条错误日志。
在这里插入图片描述修改文件,先不加入多行输入模块,看看效果

[root@vm4 conf.d]# vim test.conf 
[root@vm4 conf.d]# cat test.conf 
input {
      file {		
        path => "/var/log/my-es.log"	 文件/var/log/my-es.log作为输入
        start_position => "beginning"    从头开始输入
      }
}

output {
	stdout {}

	elasticsearch {			    输出到es模块
		hosts => ["172.25.10.11:9200"]
		index => "eslog-%{+yyyy.MM.dd}"
	}
}

执行文件看看效果

输出了很多数据

在这里插入图片描述
在vm1的es上查看eslog索引,搜索at org,看到分为了一条条的数据

在这里插入图片描述
现在删除该索引

在这里插入图片描述
删除对应的.sincedb文件

在这里插入图片描述
编辑文件

[root@vm4 conf.d]# cat test.conf 
input {
      file {		
        path => "/var/log/my-es.log"	
        start_position => "beginning"	  从头开始
          codec => multiline {
            pattern => "^\["[开头的结束
            negate => "true"
            what => "previous"
          }
      }
}

output {
	stdout {}
 
	elasticsearch {			          输出到es
		hosts => ["172.25.10.11:9200"]
		index => "eslog-%{+yyyy.MM.dd}"
	}
}

执行文件,看到的是一条数据

在这里插入图片描述
在es中查看,错误日志也被合并为一条

在这里插入图片描述

8. grok切片过滤插件

当查看apache的日志,发现有规律,如下图,先是访问的ip,时间等等,那么能不能只看其中一组数据,比如只想要ip这一列。现在就需要logstash的切片这个功能了

在这里插入图片描述
根据日志的特征自定义grok的书写,得到想要的切片

(1)命令行输入,过滤,命令行输出

[root@vm4 conf.d]# cat grok.conf 
input {                           输入
	stdin {}
}

filter {
	grok {			   切片		分别对应下面
	match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
	}
}

output {            命令行输出
	stdout {}
}

执行文件,可以看到输出的数据是按照切片一一对应输出

在这里插入图片描述

(2)apache日志输入,切片,es输出

vm4安装apache

在这里插入图片描述
开启httpd,进入默认发布界面

在这里插入图片描述
真机访问vm4

在这里插入图片描述
vm4查看日志

在这里插入图片描述
/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns目录下,有很多软件的日志的输出形式,我们进入httpd的日志输出形式查看

在这里插入图片描述httpd写日志的输出形式已经用变量定义好了,我们可以直接利用来进行切片
在这里插入图片描述
我们要使用apache的日志输出设定来用作grok切片,就要给日志文件读的权限,给日志文件目录读和执行的权限,读的时候是logstash的身份
在这里插入图片描述
编辑grok.conf文件

[root@vm4 conf.d]# cat grok.conf 
input {
	file {
		path => "/var/log/httpd/access_log"    以apache日志作为输入
		start_position => "beginning"		   从头开始
	}
}

filter {
	grok {					
	match => { "message" => "%{HTTPD_COMBINEDLOG}" } 使用默认的HTTPD_COMBINEDLOG方式切片
	}
}

output {
	stdout {}

         elasticsearch {                           输出到es
		hosts => ["172.25.10.11:9200"]
		index => "apachelog-%{+yyyy.MM.dd}"
	}
}

执行文件,可以看到是按照定义好的规则去切片的

在这里插入图片描述
在es上查看,也是一样的输出

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值