利用Logstash的logstash-input-jdbc实现MySQL数据同步到Elasticsearch

633 阅读3分钟

本篇文章主要介绍的是使用Logstash的配置文件将MySQL数据同步到Elasticsearch中。

全量同步

Logstash配置文件

Logstash的配置文件内存如下:

input {
    jdbc {
        # mysql 数据库链接
        jdbc_connection_string => "jdbc:mysql://x.x.x.x:3306/database?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&allowMultiQueries=true"
        # 用户名和密码
        jdbc_user => "Wade"
        jdbc_password => "123456"
        # 驱动
        jdbc_driver_library => "/usr/local/software/logstash-7.15.1/config/mysql/mysql-connector-java-8.0.19.jar"
        # 驱动类名
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        jdbc_default_timezone => "Asia/Shanghai"
        
        tracking_column => id
        tracking_column_type => "numeric"
        # 按id导入的时候一定要开启,否则字段类型就是默认的timestamp
        use_column_value => true
        
        record_last_run => true
        last_run_metadata_path => "/usr/local/software/logstash-7.15.1/config/mysql/prod/full_update_last_value.txt"
        clean_run => false
        
        # 执行的sql 文件路径+名称
        statement_filepath => "/usr/local/software/logstash-7.15.1/config/mysql/prod/user-full-update.sql"
        
        # 分页查询
        # jdbc_paging_enabled => "true"
        # jdbc_page_size => "50000"
        
        # 设置监听间隔  各字段含义(由左至右)秒、分、时、天、月、年。以下表示每个月11日的2-4点,每10秒执行一次同步
        schedule => "*/10 * 2,3,4 8 * *"
    }
}

output {
    elasticsearch {
        hosts => "127.0.0.1:9200"
        user => "elastic"
        password => "123456"
        index => "question"
        document_id => "%{id}"
    }
}

last_run_metadata_path

full_update_last_value.txt文件内容如下,记录了本次全量同步的起始值(.conf文件配置了此值为字段id的值)

--- 0

查询MySQL数据

SQL脚本如下,每次查询时,都会从full_update_last_value.txt读取上一次执行同步记录的最大值

select id, name, create_time, update_time from user where id > :sql_last_value limit 5000

执行效果

image.png

增量同步

Logstash配置文件

Logstash的配置文件内存如下:

input {
    jdbc {
        # mysql 数据库链接
        jdbc_connection_string => "jdbc:mysql://x.x.x.x:3306/database?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&allowMultiQueries=true"
        # 用户名和密码
        jdbc_user => "Wade"
        jdbc_password => "123456"
        # 驱动
        jdbc_driver_library => "/usr/local/software/logstash-7.15.1/config/mysql/mysql-connector-java-8.0.19.jar"
        # 驱动类名
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        # 数据库连接可用校验超时时间,默认3600S
        jdbc_validation_timeout => "3600"
        # 数据库重连尝试次数
        connection_retry_attempts => "3"

        # 执行的sql 文件路径+名称
        statement_filepath => "/usr/local/software/logstash-7.15.1/config/mysql/prod/user-incr-update.sql"
        jdbc_paging_enabled => "true"
        # 单次分页查询条数(默认100000,若字段较多且更新频率较高,建议调低此值);
        jdbc_page_size => "1000"
        jdbc_default_timezone => "Asia/Shanghai"
	  
        # 需要记录查询结果某字段的值时,此字段为true,否则默认tracking_column为timestamp的值;
        use_column_value => true
        # 是否将字段名转换为小写,默认true(如果有数据序列化、反序列化需求,建议改为false);
        lowercase_column_names => false
        # 需要记录的字段,用于增量同步,需是数据库字段
        tracking_column => id
        # Value can be any of: numeric,timestamp,Default value is "numeric"
        tracking_column_type => numeric
        # record_last_run上次数据存放位置;
        record_last_run => true
        # 上一个sql_last_value值的存放文件路径, 必须要在文件中指定字段的初始值
        last_run_metadata_path => "/usr/local/software/logstash-7.15.1/config/mysql/prod/incr_update_last_value.txt"
        # 是否清除last_run_metadata_path的记录,需要增量同步时此字段必须为false;
        clean_run => false  
	  
        # 设置监听间隔  各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新,以下表示每天7点开始执行同步
        schedule => "0 7 * * *"
        # 索引类型
        type => "jdbc"
    }
}
 
output {
    elasticsearch {
        hosts => "127.0.0.1:9200"
        user => "elastic"
        password => "123456"
        index => "question"
        document_id => "%{id}"
    }
}

last_run_metadata_path

incr_update_last_value.txt文件内容如下,记录了本次增量同步的起始值(.conf文件配置了此值为字段id的值)

--- 52000

查询MySQL数据

SQL脚本如下,从incr_update_last_value.txt读取上一次执行同步记录的最大值。

select id, name, create_time, update_time from user where id > :sql_last_value

执行效果

image.png 说明:虽然做了分页查询,但由于配置文件设置了每天早晨7点执行一次增量同步,所以读取到的sql_last_value是同一个值。