Elasticsearch入门 组件部署及体验

Posted 虎鲸不是鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch入门 组件部署及体验相关的知识,希望对你有一定的参考价值。

Elasticsearch入门(四) 组件部署及体验

ES简介

FileBeat

简介

Elastic官网最下方有链接可以跳转:

跳转到Beat后可以看到:

这是一个家族。。。可以查看Beats的文档说明

常用的是FileBeat

部署

cd ~
rz
tar -zxvf filebeat-7.6.1-linux-x86_64.tar.gz -C /export/server/es/

使用

FileBeat程序需要配置InputOutput,从官网手册(Configure里有各种配置)可以看到支持的类型。配置好后运行开发配置文件即可。

测试

先创建配置文件:

cd /export/server/es/filebeat-7.6.1-linux-x86_64/
mkdir apps
vim apps/logfile_to_es.filebeat

修改内容为:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /home/esuser/server.log.*

output.elasticsearch:
    hosts: ["node1:9200", "node2:9200", "node3:9200"]

保存后上传数据:

cd
rz

先上传2个Kafka日志:

[esuser@node1 ~]$ ll
总用量 376800
-rw-r--r-- 1 esuser esuser    427746 424 2020 server.log.2020-04-24-19
-rw-r--r-- 1 esuser esuser       942 424 2020 server.log.2020-04-24-20

切换目录:

cd /export/server/es/filebeat-7.6.1-linux-x86_64/

尝试运行(-c表示运行配置文件,-e表示执行):

[esuser@node1 filebeat-7.6.1-linux-x86_64]$ filebeat -c apps/logfile_to_es.filebeat -e
Exiting: error loading config file: config file ("apps/logfile_to_es.filebeat") can only be writable by the owner but the permissions are "-rw-rw-r--" (to fix the permissions use: 'chmod go-w /export/server/es/filebeat-7.6.1-linux-x86_64/apps/logfile_to_es.filebeat')

不出意外会提示权限太多不能运行,按照提示取消属组与其它用户的可写权限后才能运行:

chmod go-w /export/server/es/filebeat-7.6.1-linux-x86_64/apps/logfile_to_es.filebeat

当然还需要先启动ES和ES-head,3台机先启动ES:

/export/server/es/elasticsearch-7.6.1/bin/elasticsearch >>/dev/null 2>&1 &

然后node1启动ES-head:

/export/server/es/elasticsearch-head/node_modules/grunt/bin/grunt server >/dev/null 2>&1 &

发现启动失败:

1943 Jps
1741 Elasticsearch
[2]+  退出 99               /export/server/es/elasticsearch-head/node_modules/grunt/bin/grunt server > /dev/null 2>&1
[esuser@node1 ~]$ /export/server/es/elasticsearch-head/node_modules/grunt/bin/grunt server >/dev/null 2>&1 &
[2] 1955
[esuser@node1 ~]$ /export/server/es/elasticsearch-head/node_modules/grunt/bin/grunt server >/dev/null 2>&1 &
[3] 1961
[2]   退出 99               /export/server/es/elasticsearch-head/node_modules/grunt/bin/grunt server > /dev/null 2>&1
[esuser@node1 ~]$ /export/server/es/elasticsearch-head/node_modules/grunt/bin/grunt server
grunt-cli: The grunt command line interface (v1.2.0)

Fatal error: Unable to find local grunt.

If you're seeing this message, grunt hasn't been installed locally to
your project. For more information about installing and configuring grunt,
please see the Getting Started guide:

http://gruntjs.com/getting-started
[3]+  退出 99               /export/server/es/elasticsearch-head/node_modules/grunt/bin/grunt server > /dev/null 2>&1


报错:Unable to find local grunt.

各种稿子都在瞎写。。。老老实实使用相对路径启动:

cd /export/server/es/elasticsearch-head/node_modules/grunt/bin/
#后台启动
./grunt server >/dev/null 2>&1 &
#查看进程
netstat -atunlp | grep 9100

再次切换目录并重试:

cd /export/server/es/filebeat-7.6.1-linux-x86_64/
./filebeat -c apps/logfile_to_es.filebeat -e

刷新浏览器node1:9100


VS Code中:

GET /filebeat-7.6.1-2021.06.03-000001/_search

执行后:

"value": 3770,

新建会话,上传更多数据后:

[esuser@node1 ~]$ ll
总用量 376832
-rw-r--r-- 1 esuser esuser    427746 424 2020 server.log.2020-04-24-19
-rw-r--r-- 1 esuser esuser       942 424 2020 server.log.2020-04-24-20
-rw-r--r-- 1 esuser esuser      1137 424 2020 server.log.2020-04-24-21
-rw-r--r-- 1 esuser esuser     27888 424 2020 server.log.2020-04-24-22

VS Code中重新Run Query:

"value": 3937,

刷新网页,也发生了变化,FileBeat可以实现自动增量采集。
这里存着元数据:

[esuser@node1 ~]$ ll /export/server/es/filebeat-7.6.1-linux-x86_64/data/registry/filebeat/
总用量 8
-rw------- 1 esuser esuser 792 63 18:06 data.json
-rw------- 1 esuser esuser  16 63 17:58 meta.json

多行合并

先删除旧的内容:

ES-head可以很方便地删除,但是需要输入:

再上传个错误日志。。。发现:

∵报错的日志文件是这样:

会出现错行。。。VS Code看到也是错行了:

 "message": "        at kafka.server.ReplicaFetcherThread.fetchEpochEndOffsets(ReplicaFetcherThread.scala:310)",

重写个配置方案:

vim /export/server/es/filebeat-7.6.1-linux-x86_64/apps/logfile_regex_to_es.filebeat

填写:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /home/esuser/server.log.*
  multiline.pattern: '^\\['
  multiline.negate: true
  multiline.match: after

output.elasticsearch:
    hosts: ["node1:9200", "node2:9200", "node3:9200"]

并保存,其中:

multiline.pattern: '^\\['	#中括号开头的数据作为新的一行
multiline.negate: true		#不符合的行进行合并
multiline.match: after 		#合并在上一行的后面

之后去掉属主外其余用户的可写权限:

chmod go-w /export/server/es/filebeat-7.6.1-linux-x86_64/apps/logfile_regex_to_es.filebeat

使用ctrl+c结束后,再次重复上一步的删除操作,并把家目录的日志文件也删除:

rm -rf server.log.2*

删除元数据:

rm -ef /export/server/es/filebeat-7.6.1-linux-x86_64/data/registry/filebeat/*

VS Code中删除ES数据:

delete /filebeat-7.6.1-2021.06.02-000001

执行:

cd /export/server/es/filebeat-7.6.1-linux-x86_64/
./filebeat -c apps/logfile_regex_to_es.filebeat -e

如果node1:9100多次刷新不更新,就需要删除元数据:

rm -rf /export/server/es/filebeat-7.6.1-linux-x86_64/data/registry/filebeat/*

并重新采集。。。刷新后看到:

VS Code使用:

GET /filebeat-7.6.1-2021.06.03-000001/_search

    "query": 
        "match": 
            "log.file.path": "/home/esuser/server.log.error"
        
    

查询后:

(需要查看中设置右侧分栏自动换行)

Logstash

简介

这是ELK中的L组件,用于全场景下的数据采集,注重于数据的转换处理(能对FileBeat传递过来的数据进行ETL处理),功能全面,可以实现数据的预处理。

但是这货侧重于数据处理,性能较差,开发接口不友好,现在一般不用于做数据采集工具(Flume、Sqoop等使用容易)。

官网有写这货需要InputFilter(可选)、Output

部署

安装包是zip的,Linux中很少见:

cd
rz
unzip logstash-7.6.1.zip -d /export/server/es/
cd /export/server/es/logstash-7.6.1/

就完了。。。

使用

先配置,再调用配置的老套路。。。

采集stdin并输出到stdout

node1使用VIM:

cd /export/server/es/logstash-7.6.1/
mkdir apps
vim apps/stdin-stdout.json

填写:

input  
    stdin   
 

output 
    stdout  

保存后即可测试:

bin/logstash -f apps/stdin-stdout.json 

其中:

-f:指定运行某个文件
-e:在命名行执行代码
-t:测试代码的语法是否正确

这3个参数只能选1个用。。。

执行后(截取部分内容):

The stdin plugin is now waiting for input:
/export/server/es/logstash-7.6.1/vendor/bundle/jruby/2.5.0/gems/awesome_print-1.7.0/lib/awesome_print/formatters/base_formatter.rb:31: warning: constant ::Fixnum is deprecated

          "host" => "node1",
       "message" => "hehe",
      "@version" => "1",
    "@timestamp" => 2021-06-03T12:47:18.039Z


          "host" => "node1",
       "message" => "haha",
      "@version" => "1",
    "@timestamp" => 2021-06-03T12:47:18.057Z

[2021-06-03T20:47:18,572][INFO ][logstash.agent           ] Successfully started Logstash API endpoint :port=>9600

采集文件并输出到stdout

VIM编辑:

vim /export/server/es/logstash-7.6.1/apps/input-file-test.json 
input
    file
        path => "/home/esuser/tomcat.log"
        type => "log"
        start_position => "beginning"
    

output
        stdout
                        codec=>rubydebug
        

保存后先上传日志文件再测试:

bin/logstash -f apps/input-file-test.json

采集mysql并输出到stdout

MySQL中:

create database test;
use test;
CREATE TABLE `wcresult` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `word` varchar(100) NOT NULL,
  `number` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into wcresult values(null,'hadoop',8);
insert into wcresult values(null,'hive',16);

VIM编辑:

vim /export/server/es/logstash-7.6.1/apps/input-jdbc1.json
input 
  jdbc 
    jdbc_driver_library => "/home/esuser/mysql-connector-java-5.1.38.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://node3:3306/test"
    jdbc_user => "root"
    jdbc_password => "123456"
    schedule => "*/1 * * * *"
    statement => "SELECT * from wcresult where number > 10;"
  


output
        stdout
        codec=>rubydebug
        

准备好jar包后就可以测试:

bin/logstash -f apps/input-jdbc1.json 

也可以增量更新:

input 
  jdbc 
    jdbc_driver_library => "/home/esuser/mysql-connector-java-5.1.38.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://node3:3306/test"
    jdbc_user => "root"
    jdbc_password => "123456"
    use_column_value => true
    tracking_column => "id"
    schedule => "*/1 * * * *"
    statement => "SELECT * from wcresult where number > 10 and id > :sql_last_value;"
  


output
        stdout
        codec=>rubydebug
        

bin/logstash -f apps/input-jdbc2.json 

采集FileBeat到并输出到ES

先用FileBeat采集文件,写入Logstash,再用Logstash写入ES。

日志文件当然需要正则表达式划分:

cd /export/server/es/filebeat-7.6.1-linux-x86_64/
vim apps/logfile_to_logstash.filebeat

插入:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /home/esuser/access.*
  multiline.pattern: '^\\d+\\.\\d+\\.\\d+\\.\\d+ '
  multiline.negate: true
  multiline.match: after

output.logstash:
  enabled: true
  hosts: ["node1:45454"]

保存后,去掉其余用户的可写权限:

chmod go-w apps/logfile_to_logstash.filebeat

继续VIM:

cd /export/server/es/logstash-7.6.1/
vim apps/beats_to_es.json

插入:

input 
    beats 
    port => 45454



output 
    elasticsearch 
    hosts => [ "node1:9200","node2:9200","node3:9200"]
  

为了防止出错,先删除元数据:

rm -rf /export/server/es/filebeat-7.6.1-linux-x86_64/data/registry/filebeat/*

先启动Logstash:

cd /export/server/es/logstash-7.6.1/
bin/logstash -f apps/beats_to_es.json

再启动FileBeat:

cd /export/server/es/filebeat-7.6.1-linux-x86_64/
./filebeat -c apps/logfile_to_logstash.filebeat -e

上传log文件后:


每条数据作为一个message内容写入了es。

数据解析

先查看已经安装的Logstash插件:

/export/server/es/logstash-7.6.1
bin/logstash-plugin list

使用GROK插件可以正则匹配,将原始数据中的字段提取出来:

%SYNTAX:SEMANTIC

这种套路。。。

vim apps/beats_grokall_console.json

插入:

input 
    beats 
        port => 45454
    


filter 
    grok 
        match =>  
            "message" => "%IP:ip - - \\[%HTTPDATE:date\\] \\"%WORD:method %PATH:uri %DATA\\" %INT:status %INT:length \\"%DATA:reference\\" \\"%DATA:browser\\"" 
        
       


output 
    stdout 
        codec => rubydebug
  

保存后,先启动Logstash:

bin/logstash -f apps/beats_grokall_console.json

删除FileBeat的元数据并启动FileBeat:

rm -rf /export/server/es/filebeat-7.6.1-linux-x86_64/data/registry/filebeat/*
cd /export/server/es/filebeat-7.6.1-linux-x86_64/

∵必须先开启接收端后开启发送端才能确保数据不会丢失,故启动顺序不对会出现:

2021-06-03T22:00:17.634+0800    ERROR   pipeline/output.go:100  Failed to connect to backoff(async(tcp://node1:45454)): dial tcp 192.168.88.9:45454: connect: connection refused
2021-06-03T22:00:17.635+0800    INFO    pipeline/output.go:93   Attempting to reconnect to backoff(async(tcp://node1:45454)) with 4 reconnect attempt(s)

同一家的产品这点做的比较好。。。会一直等待连接成功才继续发送。。。连接成功后就会刷屏发送数据:

数据转换

mutate插件可以实现字段添加、处理、重命名等操作。
date插件可以实现日期转换处理。

cd /export/server/es/logstash-7.6.1
vim apps/beats_mutate_date_es.json

插入:

input 
    beats 
        port => 45454
    


filter 
    grok 
        match =>  
            "message" => "%IP:ip - - \\[%HTTPDATE:date\\] \\"%WORD:method %PATH:uri %DATA\\" %INT:status:int %INT:length:int \\"%DATA:reference\\" \\"%DATA:browser\\"" 
        
    
    mutate 
        enable_metric => "false"
        remove_field => ["message", "log", "tags", "@timestamp", "input", "agent", "host", "ecs", "@version"]
    
    date 
        match => ["date","dd/MMM/yyyy:HH:mm:ss Z","yyyy-MM-dd HH:mm:ss"]
        target => "date"
    


output 
    stdout 
        codec => rubydebug
    
    elasticsearch 
        hosts => ["node1:9200" ,"node2:9200" ,"node3:9200"]
        index => "apache_web_log"
    

老套路:

bin/logstash -f apps/beats_mutate_date_es.json
rm -rf /export/server/es/filebeat-7.6.1-linux-x86_64/data/registry/filebeat/*
./filebeat -c apps/logfile_to_logstash.filebeat -e

默默等待:

2021-06-03T22:09:24.863+0800    INFO    pipeline/output.go:95   Connecting to backoff(async(tcp://node1:45454))
2021-06-03T22:09:24.863+0800    INFO    pipeline/output.go:105  Connection to backoff(async(tcp://node1:45454)) established

采集标准输出到文件

input stdin
output 
    file 
        path => "/export/servers/es/logstash-6.0.0/usercase/datas/%+YYYY-MM-dd-%host.txt"
        codec => line 
            format => "%message"
        
        flush_interval => 0
    

采集标准输出到ES

input stdin
output 
    elasticsearch 
        hosts => ["node1:9200"]
        index => "logstash-%+YYYY.MM.dd"
    

采集文件到Kafka

input 
        file
        path => "/home/es/tomcat.log"
        type => "log"
        start_position => "beginning"
    

output 
    kafka 
        topic_id => "bigdata"
        bootstrap_servers => "node1:9092,node2:9092,node3:9092"
        batch_size => 5
   

采集Kafka到ES

input
    kafka 
        group_id => "testLogstash"
        auto_offset_reset => "earliest"
        topics => ["bigdata"]
        bootstrap_servers => "node1:9092,node2:9092,node3:9092"
   

output 
    elasticsearch 
        hosts => ["node1:9200"]
        index => "kakfatoes"
    

都是套路。。。

Kibana

官网

这是个可视化工具。。。毕竟ES-head并不美观。。。

部署

cd
rz
tar -zxvf kibana-7.6.1-linux-x86_64.tar.gz -C /export/server/es/
cd /export/server/es/kibana-7.6.1-linux-x86_64/
vim config/kibana.yml

修改第7行:

server.host: "node1"

修改25行:

server.name: "test-kibana"

修改28行:

elasticsearch.hosts: ["http://node1:9200"]

同样是会霸占前台shell会话的进程。。。输出重定向到黑洞:

bin/kibana >>/dev/null 2>&1 &

查看进程:

[esuser@node1 kibana-7.6.1-linux-x86_64]$ ps -ef | grep node
esuser     3628   1645 82 22:16 pts/0    00:00:52 bin/../node/bin/node bin/../src/cli
esuser     3675   1645  0 22:17 pts/0    00:00:00 grep --color=auto node

打开

浏览器node1:5601

添加数据源:

Discover→Index Patterns→Create index pattern。


输入开头字符会自动识别,就可以Next step。


自动识别出自动。。。选date后下一步。。。


Dev tool处可以开发脚本及执行。。。

筛选


可以筛选。。。


左上角也可以筛选。。。右上角点击后更新。。。也可以使用∩∪运算:

status: 200 and method: post

图表及看板


可以绘制饼图等各种图。。。


用起来和Tableau、Fine BI这些可视化工具差不多。。。

以上是关于Elasticsearch入门 组件部署及体验的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch入门 简介及部署

Elasticsearch入门 简介及部署

Elasticsearch7.8.0版本入门——单机部署(linux环境-centos7)

Jenkins实践之入门体验

企业日志分析ELK(Logstash+Elasticsearch+Kibana)介绍及搭建

如何快速部署一个Elasticsearch集群?