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

时间:2015-10-23 02:34:33

标签: mysql sql elasticsearch

我有一个名为search的mysql数据库表,我需要跟上ElasticSearch索引的数据。我已经将表从表中导出到es索引,但现在我需要保持数据同步,否则搜索将很快变得陈旧。

我能想到的唯一方法是每隔x分钟导出一次表格,然后将其与上次导入的内容进行比较。这是不可行的,因为该表有大约1000万行,我不想整天每五分钟做一次表输出。对此有什么好的解决方案?请注意,我只对数据库具有读访问权。

1 个答案:

答案 0 :(得分:0)

我会使用带有jdbc input插件和elasticsearch output插件的Logstash。有一个blog article显示了此解决方案的完整示例。

installing 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)以匹配您的数据。