同步mysql數據到ElasticSearch的最佳實踐


Elasticsearch是一個基於Lucene的准實時的分布式搜索和分析引擎。它可以幫助你用前所未有的速度去處理大規模數據。它提供了一套易用的基於RESTful web接口的分布式多用戶搜索入口。Elasticsearch是用Java開發的,並作為Apache許可條款下的開放源碼發布,是當前流行的企業級搜索引擎。設計用於雲計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。

安裝es以及head插件,略。

為了使海量數據能夠提供實時快速的查詢,mysql很顯然力不從心,於是我們需要利用es提供大數據搜索服務,典型的場景就是:產品或者商品搜索。

首先是數據同步,將mysql數據同步到es的方式很多,經過測試,穩定且易用的是 logstash-input-jdbc

如何安裝logstash-input-jdbc插件?

參考:http://blog.csdn.net/yeyuma/article/details/50240595#quote 

全量同步與增量同步

全量同步是指全部將數據同步到es,通常是剛建立es,第一次同步時使用。增量同步是指將后續的更新、插入記錄同步到es。(刪除記錄沒有辦法同步,只能兩邊執行自己的刪除命令)
根據公司內部實踐,logstash-input-jdbc增量同步的原理很簡單。我們做增量同步是需要知道插入和更新記錄的,因此,進入ES提供搜索服務的表(需要同步的表),都要加上update_time,每次插入和更新的時候更新這個字段,讓logstash-input-jdbc知道即可。
詳見:https://www.elastic.co/guide/en/logstash/current/plugins-inputs-jdbc.html#_predefined_parameters

關鍵點:
where t.update_time > :sql_last_value

測試結果:

先更新一條數據看看

然后在es中查詢看看有沒有更新到

成功,自動同步了!

如果需要同時同步多個表,那么需要以下配置

input {
  jdbc {
    jdbc_driver_library => "/Users/logstash/mysql-connector-java-5.1.39-bin.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://localhost:3306/database_name"
    jdbc_user => "root"
    jdbc_password => "password"
    schedule => "* * * * *"
    statement => "select * from table1"
    type => "table1"
  }
  jdbc {
    jdbc_driver_library => "/Users/logstash/mysql-connector-java-5.1.39-bin.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://localhost:3306/database_name"
    jdbc_user => "root"
    jdbc_password => "password"
    schedule => "* * * * *"
    statement => "select * from table2"
    type => "table2"
  }
  # add more jdbc inputs to suit your needs 
}
output {
    elasticsearch {
        index => "testdb"
        document_type => "%{type}"   # <- use the type from each input
        hosts => "localhost:9200"
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM