Elasticsearch同步mysql数据

主要思路是通过logstash-input-jdbc,并不是实时同步,准实时(通过schedule进行捞取)

原理: 通过SQL语句(相对BIN LOG同步可以写较复杂的SQL)进行全量和增量同步

注意点:

增量同步的坑,需要有更新时间,不好做删除,可能需要做逻辑删除(即更新记录)。

更新时间需要做索引。

 

步骤

1.安装es

2.安装logstash

安装es对应的版本: 

wget https://artifacts.elastic.co/downloads/logstash/logstash-6.2.3.zip
unzip logstash-6.2.3.zip && cd logstash-6.2.3

3.安装logstash-input-jdbc

logstash-plugin install logstash-input-jdbc

4.配置logstash-input-jdbc

新建mysql配置目录

下载mysql-connector-java-5.1.46.jar

编写配置文件(全量同步)

input {
 stdin { }
    jdbc {
        jdbc_connection_string => "jdbc:mysql://xxx:port/db"
        jdbc_user => "username"
        jdbc_password => "pass"
        jdbc_driver_library => "C:\Users\XXXX\Desktop\logstash-6.5.4\bin\mysql\mysql-connector-java-5.1.46.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        jdbc_paging_enabled => "true"
        jdbc_page_size => "500"
        statement => "SELECT * FROM test"
        schedule => "* * * * *"
    }
 }  
output {
    elasticsearch {
        hosts => "localhost:9200"
        index => "test"
        document_id => "%{id}"
    }
}

5. 启动同步

bin/logstash.bat -f 上面配置文件.conf

6. 安装es head

下载源码

配置elasticsearch.yml

http.cors.enabled: true

http.cors.allow-origin: /.*/

 

7. 如何增量同步

input {

 stdin { }
  jdbc {
  type => "xxx"
  jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/xxx"
  jdbc_user => "root"
  jdbc_password => "xxxx"

  record_last_run => true
  use_column_value => true
  tracking_column => "id"
  last_run_metadata_path => "/etc/logstash/run_metadata.d/my_info"
  clean_run => "false"

  jdbc_driver_library => "/app/es/elasticsearch-5.4.0/lib/mysql-connector-java-5.1.38.jar"
  jdbc_driver_class => "com.mysql.jdbc.Driver"
  jdbc_paging_enabled => true
  jdbc_page_size => "500"
  statement => "select * from xxx where id > :sql_last_value"
  schedule => "* * * * *"
  }
}
注意标红色的部分:这些配置是为了达到增量同步的目的,每次同步结束之后会记录最后一条数据的tracking_column列,比如我们这设置的是id,就会将这个值记录在last_run_metadata_path中。
下次在执行同步的时候会将这个值,赋给sql_last_value。

看起来用更新时间比较好(更新时间一个更新时间可能会有多条记录,这个需要注意,分页获取更新数据,处理的过程中,可能有新的更新记录,建议还是canal或者通过ID)

 

 

参考

https://www.cnblogs.com/xuwenjin/p/8987546.html

 

你可能感兴趣的:(elasticsearch)