一尘不染

如何将mysql数据库同步到外部数据源

mysql

我有一个mysql数据库表search,该表需要与ElasticSearch索引保持一致。我已经将表从表导出到es索引,但是现在我需要保持数据同步,否则搜索将很快变得过时。

我能想到的唯一方法是每隔X分钟导出一次表,然后将其与上次导入的表进行比较。这是不可行的,因为该表大约有1000万行,而且我不想整天每五分钟进行一次表导出。有什么好的解决方案?请注意,我仅具有对数据库的读取权限。


阅读 268

收藏
2020-05-17

共1个答案

一尘不染

我将Logstash与jdbc输入插件和elasticsearch输出插件结合使用。有一篇博客文章显示了此解决方案的完整示例。

安装Logstash,您可以创建我上面这样提到的插件配置文件:

input {
    jdbc {
        jdbc_connection_string => "jdbc:mysql://localhost:3306/mydb"
        jdbc_user => "user"
        jdbc_password => "1234"
        jdbc_validate_connection => true
        jdbc_driver_library => "mysql-connector-java-5.1.36-bin.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        schedule => "5m"
        statement => "SELECT * FROM search WHERE timestamp > :sql_last_value"
    }
}
output {
    elasticsearch {
        protocol => http
        index => "searches"
        document_type => "search"
        document_id => "%{uid}"
        host => "ES_NODE_HOST"
    }
}

您需要确保更改一些值以匹配您的环境,但这应该可以解决您需要做的事情。

查询将每5分钟运行一次,并将提​​取所有search记录timestamp(更改名称以匹配您的数据)的时间比上次运行查询的时间最近。所选记录将沉入searches到您的Elasticsearch服务器上的索引中ES_NODE_HOST。确保更改索引并相应地键入名称,以及主键字段的名称(例如uid)以匹配您的数据。

2020-05-17