引言

上一篇主要讲解的是:ik中文分词器的安装、ik中文分词器的实战。

本篇主要讲解的是:logstash的安装、通过logstash同步mysql的数据到Elasticsearch、logstash配置的扩展讲解。

logstash简介

Logstash是一个开源数据收集引擎,具有实时管道功能。Logstash可以动态地将来自不同数据源的数据统一起来,并将数据标准化到你所选择的目的地,目的地有很多种,但我们此处演示的是Elasticsearch。

Logstash的搭建

1、创建安装目录

[root@hadoop102 ~]# mkdir -p /usr/local/logstash

2、上传安装包到并解压

[root@hadoop102 ~]# tar zxvf /tmp/logstash-7.8.0.tar.gz -C /usr/local/logstash/

logstash基本操作

root@hadoop102 ~]# cd /usr/local/logstash/logstash-7.8.0/

[root@hadoop102 logstash-7.8.0]# bin/logstash -e 'input { stdin {} } output { stdout {} }' 

Elasticsearch掰开揉碎第8篇logstash详解_jdbc

使用-e参数,在命令行中指定配置是一种方式,不过如果需要配置更多设置,则需要很长的内容,这种情况下,我们首先创建一个配置文件,并且指定logstash使用这个配置文件。标准配置文件含有input{}、filetr{}、output{}三部分。通过下面的实战来演示单独配置文件,同步mysql数据到Elasticsearch干起来!!

mysql数据同步Elasticsearch

创建2个文件:jdbc.conf和jdbc.sql,名字随便。因为要与mysql同步数据,要把mysql的java驱动包上传到logstash-7.8.0/logstash-core/lib/jars

1、上传mysql的java驱动包

[root@hadoop102 ~]# cd /usr/local/logstash/logstash-7.8.0/logstash-core/lib/jars

[root@hadoop102 jars]# ls |grep mysql

mysql-connector-java-5.1.47.jar

2、mysql中创建测试数据

mysql> create database testes;

mysql> use testes;

mysql> CREATE TABLE DEPT(DEPTNO int,DNAME VARCHAR(50),LOC VARCHAR(13));

mysql> INSERT INTO DEPT VALUES (10, '中韩渔警冲突调查:韩警平均每天扣1艘中国渔船', 'NEW YORK');

mysql> INSERT INTO DEPT VALUES (20, '公安部:各地校车将享最高路权', 'DALLAS');

mysql> INSERT INTO DEPT VALUES (30, '美国留给伊拉克的是个烂摊子吗', 'CHICAGO');

mysql> INSERT INTO DEPT VALUES (40, '中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首', 'BOSTON ');

3、编辑配置文件

[root@hadoop102 ]# cd /usr/local/logstash/logstash-7.8.0

编辑jdbc中的主要配置文件

[root@hadoop102 logstash-7.8.0]# vim jdbc.conf

input {

 stdin {}

   jdbc {

       jdbc_connection_string => "jdbc:mysql://192.168.8.102:3306/testes?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true"

       jdbc_user => "root"

       jdbc_password => "000000"

       jdbc_driver_library => "/usr/local/logstash/logstash-7.8.0/logstash-core/lib/jars/mysql-connector-java-5.1.47.jar"

       jdbc_driver_class => "com.mysql.jdbc.Driver"

       jdbc_paging_enabled => "true"

       jdbc_page_size => "50000"

       jdbc_default_timezone => "Asia/Shanghai"

       #执行sql语句文件

       statement_filepath => "/usr/local/logstash/logstash-7.8.0/jdbc.sql"

       #重复执行导入任务的间隔,从左到右:分时日月周, 全*是1分钟执行1次

    schedule => "* * * * *"

    #读取字段时是否区分大小写

    lowercase_column_names => false

  }

}

output {

   elasticsearch {

     #ES的IP地址及端口

       hosts => ["192.168.8.102:9200"]

      #索引名称 可自定义

      index => "dept_idx"

      #从表中查询出deptno值,并将其映射到dept_idx的_id字段中

      document_id => "%{deptno}"

   }

   stdout {

       codec => json_lines

   }

}  

编辑jdbc中的sql文件

[root@hadoop102 ]# cd /usr/local/logstash/logstash-7.8.0

[root@hadoop102 logstash-7.8.0]# vim jdbc.sql

select

deptno did,

dname,

loc

from

dept

4、检查配置文件是否正确

[root@hadoop102 ~]# cd /usr/local/logstash/logstash-7.8.0

[root@hadoop102 logstash-7.8.0]# bin/logstash -f /usr/local/logstash/logstash-7.8.0/jdbc.conf -t

Elasticsearch掰开揉碎第8篇logstash详解_jdbc_02

这一检查太重要的,因为配置文件中内容太多,很容易出问题。

5、创建索引

[es@hadoop102 elasticsearch-7.8.0]$

curl -X PUT 'http://192.168.8.102:9200/dept_idx' -H "Content-Type:application/json" -d'{

"settings": {

    "number_of_shards": 5,

    "number_of_replicas": 1

  }

}'

6、创建Mapping

[es@hadoop102 elasticsearch-7.8.0]$

curl -XPOST http://192.168.8.102:9200/dept_idx/_mapping -H 'Content-Type:application/json' -d'{

"properties":{  

       "dname":{

         "type":"text",

         "analyzer":"ik_max_word",

         "search_analyzer":"ik_smart"      

       }

     }

}'

7、执行数据同步

[root@hadoop102 ~]# cd /usr/local/logstash/logstash-7.8.0

[root@hadoop102 logstash-7.8.0]# bin/logstash -f /usr/local/logstash/logstash-7.8.0/jdbc.conf

Elasticsearch掰开揉碎第8篇logstash详解_mysql_03

在生产环境配置启动成功后,就不会关闭logstash,它会实时导入数据。因为你的数据随时可能发生变量,你要实时导入数据,保证数据是最新的。  

8、验证数据

1、查询全部

访问 http://192.168.8.102:9100/

Elasticsearch掰开揉碎第8篇logstash详解_mysql_04

2、条件查询

Elasticsearch掰开揉碎第8篇logstash详解_数据同步_05

可以看到,我们在mysql中创建的数据,已经通过logstash成功的同步到Elasticsearc中了。

logstash配置的扩展讲解

logstash的同步配置内容,还是比较多的,针对这一部分扩展说明一下。

1、配置内容demo

input {

jdbc {

 jdbc_driver_library => "/usr/local/sql/mysql-connector-java-5.1.46.jar"

 jdbc_driver_class => "com.mysql.jdbc.Driver"

 jdbc_connection_string => "jdbc:mysql://192.168.1.103:3306/test_elk"

 jdbc_user => "root"

 jdbc_password => "root"

 schedule => "* * * * *"

 statement => "SELECT * FROM user WHERE update_time >= :sql_last_value"

 use_column_value => true

 tracking_column_type => "timestamp"

 tracking_column => "update_time"

 last_run_metadata_path => "syncpoint_table"

}

}

output {

 elasticsearch {

   # ES的IP地址及端口

   hosts => ["192.168.128.130:9200", "192.168.128.130:9201"]

   # 索引名称 可自定义

   index => "user"

   # 需要关联的数据库中有有一个id字段,对应类型中的id

   document_id => "%{id}"

   document_type => "user"

 }

 stdout {

   # JSON格式输出

   codec => json_lines

 }

}

2、常用配置项说明

jdbc_driver_library:jdbc mysql 驱动的路径,在上一步中已经下载

jdbc_driver_class:驱动类的名字,mysql 填 com.mysql.jdbc.Driver就好了

jdbc_connection_string:mysql 地址

jdbc_user:mysql 用户

jdbc_password:mysql 密码

schedule:执行 sql 时机,类似 crontab 的调度,周期性的执行

statement:要执行的 sql,以 “:” 开头是定义的变量,可以通过 parameters 来设置变量,这里的 sql_last_value 是内置的变量,表示上一次sql 执行中 update_time 的值,这里 update_time 条件是 >= 因为时间有可能相等,没有等号可能会漏掉一些增量

use_column_value:使用递增列的值

tracking_column_type:递增字段的类型,numeric 表示数值类型, timestamp 表示时间戳类型

tracking_column:递增字段的名称,这里使用 update_time 这一列,这列的类型是 timestamp

last_run_metadata_path:同步点文件,这个文件记录了上次的同步点,重启时会读取这个文件,这个文件可以手动修改

结束语

至此,Elasticsearch掰开揉碎系列的第8篇就结束了,本篇文章中主要要讲解的是:logstash的安装、通过logstash同步mysql的数据到Elasticsearch、logstash配置的扩展讲解。

其实关于logstash内容有很多,毕竟来看我文章的兄弟们,还是新入行的比较多,我就选着讲了一下常见的内容。有些基础的兄弟,如果觉得logstash这块讲内容少的,可以再自行扩展学习。现在这个年代,你只要想学习,免费的资料太多了,加油干吧!!

从下一篇开始我们要准备开始java编码,相信很多兄弟编程基础有点薄,我们依然掰开揉碎的方式去说,从基础环境搭建开始。后续的内容更精彩,敬请期待,感谢兄弟们的关注!!!