使用logstash同步mysql数据到elasticsearch

安装

  由于本人的elasticsearch安装的是7.6.1版本,因此logstash也选择对应版本logstash-7.6.1。

  下载logstash-7.6.1.zip(windows版本,根据个人情况选择版本下载),下载地址:https://www.elastic.co/cn/downloads/logstash 。

  由于官网下载太慢,此处提供已经下载好的,见百度网盘:https://pan.baidu.com/s/1FQLR-BoDQOQxydpJqV9tXQ  提取码:m5vr

  

 

   另外还需要准备mysql-connector-java.jar,版本根据mysql服务使用情况决定,我是用的是5.1.17版本。

  

 

 配置

  在logstash的bin目录下添加mysql_info.conf

  

input {
    stdin {
    }
    jdbc {
      # mysql数据库连接
      jdbc_connection_string => "jdbc:mysql://****:3306/litemall?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC"
      # mysqly用户名和密码
      jdbc_user => "root"
      jdbc_password => "root"
      # 驱动配置
      jdbc_driver_library => "E:\utils\ElasticSearch\install\mysql-connector-java-5.1.17.jar"
      # 驱动类名
      jdbc_driver_class => "com.mysql.jdbc.Driver"
      jdbc_paging_enabled => "true"
      jdbc_page_size => "50000"
 
     #执行的sql语句,注意其中红色部分是用于转换时差的,如果不做转换时间会相差8小时,导致每次增量添加索引会重复8个小时的数据,注:为了防止数据丢失,可以把+08:00提前十分钟,+07:50
       statement => "SELECT * FROM test_blog WHERE update_time >= convert_tz(:sql_last_value,'+00:00','+08:00')"
      # 设置监听 各字段含义 分 时 天 月  年 ,默认全部为*代表含义:每分钟都更新
      schedule => "* * * * *"
    }
}
 
 
output {
 
    elasticsearch {
        #es服务器
        hosts => ["localhost:9200"]
        #ES索引名称
        index => "test_blog"
        #自增ID
        document_id => "%{id}"
    }
    
 
    stdout {
        codec => json_lines
    }
}

  

  

表结构

  

 

   说明:其中的update_time和deleted很重要,表设计中必须要有

    update_time:用于logstash的增量同步时间标识

    deleted:逻辑删除标志,由于logstash是增量同步的,无法感知物理删除动作(除非使用binlog同步,此处不推荐),通过此逻辑删除标志改变物理删除变成逻辑删除(实际就是更新操作)

 

预先创建并定义索引

  此处使用kibina的控制台进行创建,关于kibina的安装自行百度。

  

 

 启动

  进入bin目录执行以下命令:

 .\logstash -f .\mysql_info.conf

  启动后会执行同步:

  

 

 查询结果

  通过插件head查询索引的数据

  

 

   或者通过kibina等工具查询结果:

 

 

 

测试

  新增

INSERT INTO test_blog(topic,content,create_time,update_time) VALUE('中国房价','很敏感,不讨论。。。',NOW(),NOW())

  logstash会同步此数据到es:  

 

 

 

 

 

   删除(逻辑删)

  执行sql:

UPDATE test_blog SET deleted = 1,update_time = NOW() WHERE topic = '中国房价';

  logstash同步:

  

 

 

   查询结果如下,已经删除,在es的查询的时候可以通过逻辑删除字段来控制查询内容

 

posted @ 2020-12-16 16:01  菜鸟的菜_疯子  阅读(576)  评论(0)    收藏  举报