目录
ElasticSearch可以提供强大灵活的搜索功能,这是MySQL不具备的。所以当业务需要复杂的搜索功能时,一般用ElasticSearch提供搜索功能。此时ElasticSearch如何能实时同步MySQL的数据至关重要,Logstash可以通过简单的一些配置来实现MySQL数据同步到ElasticSearch。关于一些基础的配置详细讲解可以参考 官方博客。本文总结作者项目中碰到的一些实际问题以及解决方案。
项目需求
项目需要实现对MySQL数据的快速读取以及查询功能,查询包括对所有列的全文检索,单列的下拉过滤,搜索自动补全等。ElasticSearch能够满足所有的项目搜索需求。MySQL中共有6个view需要同步到ES,每个view都是join多张表,最大的view有一千多万条数据,每天有上万条的新增。每个view中均有updated_time列,每当数据更新时,updated_time会更新。以其中的project view为例,介绍如何做到MySQL与ElasticSearch之间的实时同步。
Logstash配置详解
软件版本
Logstash: 7.9.3
ElasticSearch: 7.9.3
MySQL:AWS Aurora MySQL 5.7.12
pipeline配置文件
input {
jdbc {
jdbc_driver_library => "/opt/mysql-connector-java-8.0.16.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://${
JDBC_HOSTNAME}:${
JDBC_PORT}/${
DB_NAME}?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true&zeroDateTimeBehavior=convertToNull"
jdbc_user => "${
JDBC_USER}"
jdbc_password => "${
JDBC_PASSWORD}"
jdbc_paging_enabled => true
tracking_column => "unix_ts_in_secs"
use_column_value => true
tracking_column_type => "numeric"
schedule => "*/1 * * * *"
record_last_run => true
last_run_metadata_path => "/mnt/lastrun/.project_last_run"
statement => "SELECT *, UNIX_TIMESTAMP(updated_time) AS unix_ts_in_secs FROM view_project WHERE (UNIX_TIMESTAMP(updated_time)) > :sql_last_value AND updated_time < NOW() ORDER BY updated_time asc"
}
}
filter {
mutate