logstash 同步mysql 到elasticsearch

1.下载logstash 要和 es的版本一致  用的是 7.17.6  

     a.  logstash下载地址:https://www.elastic.co/cn/downloads/past-releases#logstash

     b.mysql-connector-java的 下载地址:https://blog.csdn.net/kt1776133839/article/details/124539192

2.配置  LS_JAVA_HOME    系统环境变量

  logstash  7版本之后 用的是这个环境变量 6的  直接用原来的JAVA_HOME就可以 ,7版本的 java  jdk用8 或者11都可以,我用的是11

3. 在xx\logstash-7.17.6-windows-x86_64\logstash-7.17.6\  和bin的的同级目录下创建一个mysql文件夹

  a.在mysql文件夹里创建一个 jdbc.conf 文件, student.sql,student_last_value.txt,以及添加mysql连接的jar包 mysql-connector-java-5.1.47.jar

     

     jdbc.conf  里边配置 jdbc 以及输出es的相关信息

  student_last_value.txt 用来处理增量数据同步时记录最新数据值的

     student.sql 写入查询的sql语句 

   b.配置jdbc.conf 文件 (这个是多个的表的 ,如果只想一个表 那么久删除掉一个不用的input 和output) 一定要注意 文件保存的时候是 utf8,  别选utf8-bom这种的,可以用notepad++ 查看编码

   

input{
    jdbc{
        # mysql相关jdbc配置
        jdbc_connection_string => "jdbc:mysql://ip:port/test?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false"
        # 数据库连接账号
        jdbc_user => "user"
        # 数据库连接密码
        jdbc_password => "pwd"
        
        # jdbc连接mysql驱动的文件
        jdbc_driver_library => "D:\xxxxx\logstash-7.17.6\mysql\mysql-connector-java-5.1.47.jar"
        # mysql驱动程序类的名称
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        # 是否启用分页
        jdbc_paging_enabled => "true"
        # 分页大小
        jdbc_page_size => "10000"
        
        
        # mysql文件, 也可以直接写SQL语句在此处,如下:
        statement_filepath => "D:\xxxxxx\logstash-7.17.6\mysql\student.sql"
        # 同步sql语句
        #statement => "SELECT * FROM `student`"
        
        # 这里类似crontab,可以定制定时操作,比如每5分钟执行一次同步(分 时 天 月 星期)
        schedule => "*/5 * * * *"
        # 是否将字段名转换为小写,默认true(如果有数据序列化、反序列化需求,建议改为false)
        lowercase_column_names => false
        # 处理中文乱码问题
        codec => plain { charset => "UTF-8" }
        # 使用其它字段追踪,而不是用时间
        use_column_value => true
        # 追踪的字段  这个字段只有在上面的lowercase_column_names配置为false的时候才会区分大小写  因为不配置为false的话默认是true  查询结果字段默认会变成全小写;   我这里使用的是更新时间
        tracking_column => "up_time"
        # 这个就是追踪字段的类型,只有数值和时间两个类型(numeric和timestamp,默认numeric) 这个值会记录到last_run_metadata_path 配置的文件中 如果配置是numeric 那么默认值为0 如果配置为timestamp 那么默认值为1970年
        tracking_column_type => "timestamp"
        # 记录上一次运行记录
        record_last_run => true
        # 上一个sql_last_value值的存放文件路径, 必须要在文件中指定字段的初始值  这个就是增量数据同步的关键
        last_run_metadata_path => "D:\xxxxxxx\logstash-7.17.6\mysql\student_last_value.txt"
        # 是否清除 last_run_metadata_path 的记录,如果为true那么每次都相当于从头开始查询所有的数据库记录
        clean_run => false
        # 多表同步时,表类型区分,建议命名为“库名_表名”,每个jdbc模块需对应一个type
        type => "student"
    }
     jdbc{
        # mysql相关jdbc配置
        jdbc_connection_string => "jdbc:mysql://ip:port/test?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false"
        # 数据库连接账号
        jdbc_user => "user"
        # 数据库连接密码
        jdbc_password => "pwd"
        
        # jdbc连接mysql驱动的文件
        jdbc_driver_library => "D:\xxxxxxxx\logstash-7.17.6\mysql\mysql-connector-java-5.1.47.jar"
        # mysql驱动程序类的名称
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        # 是否启用分页
        jdbc_paging_enabled => "true"
        # 分页大小
        jdbc_page_size => "10000"
        
        
        # mysql文件, 也可以直接写SQL语句在此处,如下:
        statement_filepath => "D:\xxxxxxx\logstash-7.17.6\mysql\people.sql"
        # 同步sql语句
        #statement => "SELECT * FROM `people`"
        
        # 这里类似crontab,可以定制定时操作,比如每5分钟执行一次同步(分 时 天 月 星期)
        schedule => "*/5 * * * *"
        # 是否将字段名转换为小写,默认true(如果有数据序列化、反序列化需求,建议改为false)
        lowercase_column_names => false
        # 处理中文乱码问题
        codec => plain { charset => "UTF-8" }
        # 使用其它字段追踪,而不是用时间
        use_column_value => true
        # 追踪的字段  这个字段只有在上面的lowercase_column_names配置为false的时候才会区分大小写  因为不配置为false的话默认是true  查询结果字段默认会变成全小写;   我这里使用的是更新时间
        tracking_column => "up_time"
        # 这个就是追踪字段的类型,只有数值和时间两个类型(numeric和timestamp,默认numeric) 这个值会记录到last_run_metadata_path 配置的文件中 如果配置是numeric 那么默认值为0 如果配置为timestamp 那么默认值为1970年
        tracking_column_type => "timestamp"
        # 记录上一次运行记录
        record_last_run => true
        # 上一个sql_last_value值的存放文件路径, 必须要在文件中指定字段的初始值  这个就是增量数据同步的关键
        last_run_metadata_path => "D:\xxxxxxxxxxx\logstash-7.17.6\mysql\people_last_value.txt"
        # 是否清除 last_run_metadata_path 的记录,如果为true那么每次都相当于从头开始查询所有的数据库记录
        clean_run => false
        # 多表同步时,表类型区分,建议命名为“库名_表名”,每个jdbc模块需对应一个type
        type => "people"
    }
    
}

filter{

}

output{
    # 根据input中type进行不同操作,多表同步会用到,可能每一个表输出不同索引
    if[type] == "student"{
        elasticsearch{
            # es地址
            hosts => ["ip:port"]
            user => "user"
            password => "pwd"
            # 索引名称
            index => "test"
            # es的id生成策略。不写es自己分配,我这里使用和mysql一致的id
            document_id => "%{id}"
        }
    }
    
     if[type] == "people"{
        elasticsearch{
            # es地址
            hosts => ["ip:port"]
            user => "user"
            password => "pwd"
            # 索引名称
            index => "people"
            # es的id生成策略。不写es自己分配,我这里使用和mysql一致的id
            document_id => "%{id}"
        }
    }

    stdout{
        codec => json_lines
    }
}

 

  c. 在student.sql 文件中写入自己 的sql语句 up_time 字段可以用datetime 类型 也可以用timestamp类型  (:sql_last_value  这个是student_last_value.txt中的值,   student_last_value.txt中的值 logstash默认是utc 的,所以查询的时候要加8小时)

SELECT id,name,age,tel,up_time FROM `student` where up_time>date_add(:sql_last_value,INTERVAL 8 HOUR) order by up_time asc

 d.student_last_value.txt 文件里边写入时间  (他会自动改 每次查询的最后一个时间点会更新进去)

    如果设置的自动增长列  不是时间类型的 是numeric 类型 那么 就吧该文件里边设置为数字0

1970-00-00 00:00:00

 

4.在es中创建对应的索引库 ,es创建索引库的方法 百度搜索

   在kibana的dev tools  执行

  

PUT /test/
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0
  },
  "mappings": {
    
    "properties":{
      "id":{
        "type":"long"
      },
      "name":{
        "type":"keyword"
      },
      "age":{
        "type":"keyword"
      },
      "tel":{
        "type":"keyword"
      },
       "up_time" : {
            "type" : "date"
      }
    }
    
  } 
  
 }
 

5.定时任务配置 

a.jdbc schedule的配置规则,类似linux的crontab的写法,具体语法规则如下: 

   *    *   *   *  *            
   分   时  天   月 星期

         各个字段取值范围:

  • 分 - 0-59

  • 时 - 0-23

  • 天 - 1-31

  • 月 - 1-12

  • 星期 - 0-7

特殊字符含义:

  • 星号() :代表所有值,例如:第一个字段是星号(),则代表每分钟。

  • 逗号(,):指定一个数值范围,例如:1,2,3,4

  • 横杠(-):另外一种表示一个整数范围的方法,例如:1-4 表示1,2,3,4

  • 斜线(/):可以用斜线指定时间的间隔频率,例如:*/5,如果用在分钟字段,表示每5分钟执行一次。

例子:

# 每分钟执行一次
* * * * *
# 每10分钟执行一次
*/10 * * * *
# 每小时执行一次
* */1 * * *
# 每天0点执行一次
0 0 * * *
# 每天凌晨2点1分执行一次
1 2 * * *

6.执行logstash 

  a.在bin目录下 cmd

  b. 输入 logstash  -f   ../mysql/jdbc.conf 

7.将logstash 作为windows服务运行

   a.首先安装nssm  

   b. 在logstash的bin目录下  nssm install (因为将nssm配置了环境变量所以可以任何地方这样使用,如果没有配置 只能在nssm 的bin目录下执行命令)

   c.path 选择到bin目录下的logstash.bat   然后directory 会自动带出

   d.argument: 里边输入   -f  ../mysql/jdbc.conf

   e.定义service的名称

 

 f.然后启动服务就可以了

posted @ 2022-11-15 15:14  kaikaichao  阅读(272)  评论(0编辑  收藏  举报