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上查看,也是一样的输出