Logstash - Linux 实现MySQL与ES数据同步
目录
环境准备
搭建Logstash
Logstash下载
配置Logstash
同步脚本配置
sql文件配置
脚本测试
启动脚本
自定义es创建索引模板
多索引同步
后台运行
环境准备
- Elasticsearch 7.4.2
- MySQL 8.0.15
- logstash-7.4.2.tar.gz
- mysql-connector-java-8.0.15.jar
搭建Logstash
- 版本与Elasticsearch必须保持一致7.4.2,在ES官网下载
Logstash下载
配置Logstash
同步脚本配置
- 进入/usr/local/目录,将安装文件解压到这里
- /usr/local/
- tar -zxvf /home/chenyb/software/logstash-7.4.2.tar.gz
- 进入logstash,创建自定义文件夹
- cd logstash-7.4.2/
- mkdir sync
- 进入sync文件夹,创建数据同步配置文件
- cd sync/
- vi logstash-db-sync.conf
- input:元数据输入
- jdbc:连接
- jdbc_connection_string:# 设置 MySql/MariaDB 数据库url以及数据库名称
- jdbc_user:数据库连接用户名
- jdbc_password:数据库连接密码
- jdbc_driver_library:数据库驱动所在位置,可以是绝对路径或者相对路径
- 驱动包一定要放在./logstash-7.4.2/logstash-core/lib/jars文件夹下,否则插件无法加在
- jdbc_driver_class:驱动类名
- jdbc_paging_enabled:开启分页
- jdbc_page_size:分页每页数量,可以自定义,建议不要太大,影响性能,根据计算机硬件1000-5000之间为好
- statement_filepath:执行的sql文件路径
- schedule:设置定时任务间隔,时间表达式
- type:索引类型,区分input与output对应关系
- use_column_value:是否开启记录上次追踪的结果,也就是上次更新的时间,这个会记录到 last_run_metadata_path 的文件
- last_run_metadata_path:记录上一次追踪的结果值
- tracking_column:如果 use_column_value 为true, 配置本参数,追踪的 column 名,可以是自增id或者时间,tracking_column 对应数据库的类型与名称,监听该数据变化而同步
- tracking_column_type:es中的属性类型
- clean_run:是否清除 last_run_metadata_path 的记录,true则每次都从头开始查询所有的数据库记录
- lowercase_column_names:数据库字段名称大写转小写
- output:数据目的地配置
- elasticsearch:目的地为es
- hosts:es地址,注意端口是客户端端口
- index:同步到索引名下
- document_id:设置_docID和数据相同,"%{dilm_id}",id推荐为逐渐,注意字段名称对应,这里为dilm_id,查询结果必然也是dilm_id
- stdout:控制台输出日志
- codec => json_lines:以JSON形式输出
input {
jdbc {
jdbc_connection_string => "jdbc:mysql://192.168.50.160:3306/sakila?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true"
jdbc_user => "root"
jdbc_password => "root"
jdbc_driver_library => "/usr/local/logstash-7.4.2/logstash-core/lib/jars/mysql-connector-java-8.0.15.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "10000"
statement_filepath => "/usr/local/logstash-7.4.2/sync/sakila-film.sql"
schedule => "* * * * *"
type => "_doc"
use_column_value => true
last_run_metadata_path => "/usr/local/logstash-7.4.2/sync/track_time"
tracking_column => "last_update"
tracking_column_type => "timestamp"
clean_run => false
lowercase_column_names => false
}
}
output {
elasticsearch {
hosts => ["192.168.50.201:9200"]
index => "film"
document_id => "%{film_id}"
}
stdout {
codec => json_lines
}}
sql文件配置
- >= :sql_last_value:监听该字段变化
- film_id:与同步脚本中的 film_id 名称一致
- last_update:与同步脚本中的监听属性一致
SELECT
film_id,
title,
description,
release_year,
language_id,
original_language_id,
rental_duration,
rental_rate,
length,
replacement_cost,
rating,
special_features,
last_update
FROM
film
WHERE
last_update >= :sql_last_value
脚本测试
- 在ES中创建film索引,与同步脚本中配置的名称一致
- 测试脚本能否执行
/usr/local/logstash-7.4.2/bin/logstash -f /usr/local/logstash-7.4.2/sync/logstash-db-sync.conf -t
- 通过
- 表示配置不正确,有错误的关键字,或者编码格式不是单纯的UTF-8
- 如果是格式的问题,将文件重新编码即可(在win环境,利用Notepad ++是个好主意)
启动脚本
- 启动
/usr/local/logstash-7.4.2/bin/logstash -f /usr/local/logstash-7.4.2/sync/logstash-db-sync.conf
- 报错
- mysql驱动位置放的不对,无法加在到插件,将驱动放置./logstash-7.4.2/logstash-core/lib/jars文件夹下即可,注意修改同步配置脚本驱动的位置
- 驱动类名不匹配,在同步配置文件中修改即可
- 成功
- 改动及时同步
自定义es创建索引模板
- 在es中查看默认模板
GET http://192.168.50.201:9200/_template/logstash
- 可以通过手动创建索引指定分词器
- 也可以通过自定义模板,让同步的数据按模板配置生成mappings对应关系
- 创建模板
cd ./logstash-7.4.2/sync
vi logstash-ik.json
{
"order": 0,
"version": 1,
"index_patterns": ["*"],
"settings": {
"index": {
"refresh_interval": "5s"
}
},
"mappings": {
"_default_": {
"dynamic_templates": [
{
"message_field": {
"path_match": "message",
"match_mapping_type": "string",
"mapping": {
"type": "text",
"norms": false
}
}
},
{
"string_fields": {
"match": "*",
"match_mapping_type": "string",
"mapping": {
"type": "text",
"norms": false,
"analyzer": "ik_max_word",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
],
"properties": {
"@timestamp": {
"type": "date"
},
"@version": {
"type": "keyword"
},
"geoip": {
"dynamic": true,
"properties": {
"ip": {
"type": "ip"
},
"location": {
"type": "geo_point"
},
"latitude": {
"type": "half_float"
},
"longitude": {
"type": "half_float"
}
}
}
}
}
},
"aliases": {}
}
- 在同步配置文件中引入自定义模板
- template_name:自定义模板名称
- template:模板所在位置
- template_overwrite:重写模板
- manage_template:默认为true,false关闭logstash自动管理模板功能,如果自定义模板,则设置为false
output {
elasticsearch {
hosts => ["192.168.50.201:9200"]
index => "film"
document_id => "%{film_id}"
template_name => "myik"
template => "/usr/local/logstash-6.4.3/sync/logstash-ik.json"
template_overwrite => true
manage_template => false
}
stdout {
codec => json_lines
}}
多索引同步
input {
jdbc {
#省略
type => "user"
}
jdbc {
#省略
type => "kill"
}
}
filter {
json {
source => "message"
remove_field => ["message"]
}
}
output {
if[type] == "user" {
elasticsearch {
#省略,与type => "user"中的属性配置对应即可
}
}
if[type] == "kill" {
elasticsearch {
#省略,与type => "kill"中的属性配置对应即可
}
}
stdout {
codec => json_lines
}
}
后台运行
nohup /usr/local/logstash-7.4.2/bin/logstash -f /usr/local/logstash-7.4.2/sync/logstash-db-sync.conf &