项目中,主流的数据存储方案还是MYSQL,虽然MYSQL中也提供了类似ES的关键词全局搜索的方法(),但是在有资源且环境已经搭建对接方便的情况下,使用ES的强大搜索能力还是比较主流的一个方案,因此需要解决如何把Mysql中的数据导入到ES中,下面介绍通过logstash异步的将mysql同步到ES中。
一、logstash对接mysql Demo
对接前的准备:jdbc驱动下载
下载地址mvnrepository.com/artifact/my…
logstash配置
ES和Logstash的搭建教程可以点这边
在Logstash中,主要有三个核心模块:input、filter、output。它们分别负责以下作用:
-
Input(输入) :
- Input模块负责从不同来源收集数据。这些来源可以是文件、网络服务、数据库、消息队列等。Input模块的作用是将这些数据获取并传送给Logstash处理流水线。
-
Filter(过滤) :
- Filter模块用于处理从input模块获取的数据。它允许对数据进行各种转换、处理和增强操作,例如解析数据、移除或重命名字段、过滤或增加数据、应用条件逻辑等。Filter模块的存在允许Logstash灵活地对数据进行预处理,使得输出数据更符合要求或更易于分析。
-
Output(输出) :
- Output模块负责将经过输入和过滤处理后的数据发送到目标位置。这些目标可以是Elasticsearch索引、文件、消息队列、数据库、远程服务等。Output模块的主要作用是将处理后的数据传送到最终的存储或使用位置,以供后续查询、分析或其他操作使用。
我们在pipeline下创建一个新的mysql包用来存放conf以及驱动、sql脚本文件
input {
jdbc {
jdbc_connection_string => "jdbc:mysql://mysql_ip:3306/db_name?characterEncoding=UTF-8&autoReconnect=true"
# 数据库连接账号密码:
jdbc_user => "root"
jdbc_password => "pw"
# MySQL 驱动路径:
jdbc_driver_library => "/usr/share/logstash/pipeline/mysql/mysql-connector-java-8.0.20.jar"
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
connection_retry_attempts => "3"
jdbc_validate_connection => "true"
jdbc_validation_timeout => "6000"
#开启分页查询 默认不开启
jdbc_paging_enabled => "true"
jdbc_page_size => "500"
#statement为查询数据SQL
#sql_last_value为内置的变量,存放上次查询结果中最后一条数据tracking_column的值,此处即为modifyTime;
#statement_filepath => "/data/logstash/pipeline/mysql/jdbc.sql"
statement => "SELECT id,type,fullName,position,createdTime,modifyTime FROM shop WHERE modifyTime >= :sql_last_value order by modifyTime asc"
# 是否将字段名转化为小写,默认为true
lowercase_column_names => false
sql_log_level => warn
# 是否记录上次执行结果,true表示会将上次执行结果的tracking_column字段的值保存到last_run_metadata_path指定的文件中;
record_last_run => true
# 需要记录查询结果某字段的值时,此字段为true,否则默认tracking_column为timestamp的值;
use_column_value => true
#需要记录的字段,用于增量同步,需要是数据库的字段
tracking_column => "modifyTime"
tracking_column_type => timestamp
#record_last_run 上次数据存放位置
last_run_metadata_path => "/usr/share/logstash/pipeline/mysql/last_id.txt"
# 是否清除last_run_metadata_path的记录,需要增量同步时此字段必须为false
clean_run => false
# 同步频率 默认每分钟同步一次 分 时 天 月 年
schedule => "* * * * *"
}
}
filter {}
output {
elasticsearch {
# 配置ES地址
hosts => ["elasticsearch:9200"]
# 索引名字
index => "shop"
# 数据唯一索引
document_id => "%{id}"
}
stdout {
codec => json_lines
}
}
注意上面的驱动以及日志路径都需要是容器内对应的位置,在logstash启动的时候需要把你要分享的位置给挂载出来。
然后我们来到usr/share/logstash/config目录下(挂载的到主机对应位置下),找到conf下的pipeline.yml配置文件,添加扫描的路径。
# 默认的
- pipeline.id: main
path.config: "/usr/share/logstash/pipeline"
# 我们新创建的 id需要唯一 config指定到.conf为止,如果只指定到mysql下启动时会发生Not utf-8的错误
- pipeline.id: read-mysql-crm
path.config: "/usr/share/logstash/pipeline/mysql/mysql.conf"
~
到这里其实重新启动elk之后就会开始同步了。
二、针对多表、多数据库的配置
。。。。。待填坑