本篇文章主要介绍的是使用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
执行效果
增量同步
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
执行效果
说明:虽然做了分页查询,但由于配置文件设置了每天早晨7点执行一次增量同步,所以读取到的sql_last_value是同一个值。