logstash把mysql數據導入elasticsearch中並設置分詞器

1.ElasticSearch安裝:

ElasticSearch 的下載地址:https://www.elastic.co/downloads/elasticsearch;

下載好之後將其解壓到你想要安裝的目錄:比如我的 D:\chengxu\ElasticSearch\elasticsearch-6.3.0

以上,就算安裝好了,運行一下。

進入到D:\chengxu\ElasticSearch\elasticsearch-6.3.0 \bin中,雙擊執行 elasticsearch.bat 。等待打印信息輸出完之後打開瀏覽器,輸入:localhost:9200 。安裝成功後頁面顯示如下。

 

2. ElasticSearch-head的安裝

這裏我通過一個可視化的工具來查看ES的運行狀態和數據,es-head 。

ElasticSearch-head 依賴於node.js

安裝node.js

node.js下載地址。

http://nodejs.cn/download/;

下載後,直接打開後除了安裝路徑自己按需設置外,其他的一路next,直到最後它自動安裝完。最後打開cmd 。輸入:node --version 看能否打印出版本信息來檢驗安裝是否正確就好了。

node.js安裝好後,切換目錄到node.js的安裝目錄中。比如我的是D:\chengxu\tools\node-js

npm install -g grunt-cli

head 依賴的都安裝完之後,安裝head 。

head的下載地址:

https://github.com/mobz/elasticsearch-head

進入github後選擇下載zip,下載完之後將其解壓到你想要安裝的目錄,E:\ruanjiangongju\windowsban-es\chajian\

 

在E:\ruanjiangongju\windowsban-es\chajian\elasticsearch-head-master 中打開cmd,執行

npm install ,將該目錄下的相關文件解壓並安裝,之後啓動執行:npm run start

打開瀏覽器輸入:http://localhost:9100/

發現連接狀態還是未連接,因爲es默認是不允許跨域連接需要開啓。進入到es的安裝目錄下,

我這裏是E:\ruanjiangongju\windowsban-es\elasticsearch-6.7.0 ,進入config 文件夾,打開elasticsearch.yml 在末尾添加

http.cors.enabled: true

http.cors.allow-origin: "*"

保存,然後重啓es ,再刷新一下 elasticsearch-head

http.cors.enabled 開啓跨域訪問支持,默認爲false

http.cors.allow-origin 跨域訪問允許的域名地址,支持用正則,*表示全部

3. mysql數據增量同步到es

mysql數據同步到es有多種方法,這裏我使用logstash做增量同步;

下載logstash: https://www.elastic.co/fr/downloads/logstash

解壓到自定義目錄,我的是:E:\ruanjiangongju\logstash\logstash-6.7.0

爲便於測試先在mysql中創建一張用於測試的表;

然後再logstash的config目錄下創建一個test.conf文件

 

test.conf內容有:

input {
  stdin {
  }
  jdbc {
	  type => "testimport"
	  jdbc_connection_string => "jdbc:mysql://192.168.147.128:3306/leader_slave_test"
	  jdbc_user => "root"
	  jdbc_password => "****自己的密碼"
          #開啓記錄最後一次運行的結果
	  record_last_run => true
          #設置可以字段追蹤
	  use_column_value => true
          #指定數據庫中用於追蹤的字段
	  tracking_column => "id"
          #追蹤字段的類型,目前只有數字(numeric)和時間類型(timestamp),默認是數字類型
	  tracking_column_type => "numeric"
          #自定義的文件路徑,用於存放追蹤字段的最後導入的值
	  last_run_metadata_path => "/ruanjiangongju/logstash/logstash-6.7.0/data/jdbc-position.txt"
	  clean_run => "false"
          #前提是在這個目錄下放入mysql-connector-java-5.1.32.jar
	  jdbc_driver_library => "/ruanjiangongju/logstash/logstash-6.7.0/mysql/mysql-connector-java-5.1.32.jar"
	  jdbc_driver_class => "com.mysql.jdbc.Driver"
	  jdbc_paging_enabled => true
	  jdbc_page_size => "500"
	  statement => "select * from test where id > :sql_last_value"
	  schedule => "* * * * *"
  }
}
filter {
	json {
		source => "message"
		remove_field => ["message"]
	}
	date {
		match => ["timestamp","dd/MM/yyyy:HH:mm:ss Z"]
	}
}
output { 
	elasticsearch { 
               #自己的es地址
		hosts => ["http://localhost:9200"] 
		index => "testimport" 
		document_type => "testimport"
	} 
	stdout {
		codec => json_lines 
	} 
}

進入logstash的bin目錄打開cmd執行命令:

logstash.bat -f /ruanjiangongju/logstash/logstash-6.7.0/config/test.conf

看到此成功;

刷新es-head:

在test表中新增數據,等一會再次刷新es_head可見可以增量同步成功;但是這個工具有弊端要是想實現修改和刪除同步需要代碼中實現;

4. 在導入時配置默認使用ik分詞器:

ik分詞器下載地址:https://github.com/medcl/elasticsearch-analysis-ik/releases

下載完成後解壓到es的plugins中:我的是在E:\ruanjiangongju\windowsban-es\elasticsearch-6.7.0\plugins中;

然後在E:\ruanjiangongju\logstash\logstash-6.7.0目錄下創建文件夾templete,接着再創建一個json文件如下:

{
    "template": "*",
    "version": 00001,
    "settings": {
        "index.refresh_interval": "5s"
    },
    "mappings": {
        "_default_": {
            "_all": {
                "enabled": true,
                "norms": false
            },
            "dynamic_templates": [
                {
                    "message_field": {
                        "path_match": "message",
                        "match_mapping_type": "string",
                        "mapping": {
                            "type": "text",
                            "norms": false
                        }
                    }
                },
                {
                    "string_fields": {
                        "match": "*",
                        "match_mapping_type": "string",
                        "mapping": {
                            "type": "text",
                            "norms": false,
                            "analyzer": "ik_max_word",#只需要添加這一行即可設置分詞器爲ik_max_word
                            "fields": {
                                "keyword": {
                                    "type": "keyword"
                                }
                            }
                        }
                    }
                }
            ],
            "properties": {
                "@timestamp": {
                    "type": "date",
                    "include_in_all": false
                },
                "@version": {
                    "type": "keyword",
                    "include_in_all": false
                }
            }
        }
    }
}

然後更改test.conf文件如下:

input {
  stdin {
  }
  jdbc {
	  type => "testimport"
	  jdbc_connection_string => "jdbc:mysql://192.168.147.128:3306/leader_slave_test"
	  jdbc_user => "root"
	  jdbc_password => "****自己的密碼"
	  #開啓記錄最後一次運行的結果
	  record_last_run => true
	  #設置可以字段追蹤
	  use_column_value => true
	  #指定數據庫中用於追蹤的字段
	  tracking_column => "id"
	  #追蹤字段的類型,目前只有數字(numeric)和時間類型(timestamp),默認是數字類型
	  tracking_column_type => "numeric"
	  #自定義的文件路徑,用於存放追蹤字段的最後導入的值
	  last_run_metadata_path => "/ruanjiangongju/logstash/logstash-6.7.0/data/jdbc-position.txt"
	  clean_run => "false"
	  #前提是在這個目錄下放入mysql-connector-java-5.1.32.jar
	  jdbc_driver_library => "/ruanjiangongju/logstash/logstash-6.7.0/mysql/mysql-connector-java-5.1.32.jar"
	  jdbc_driver_class => "com.mysql.jdbc.Driver"
	  jdbc_paging_enabled => true
	  jdbc_page_size => "500"
	  statement => "select * from test where id > :sql_last_value"
	  schedule => "* * * * *"
  }
}
filter {
	json {
		source => "message"
		remove_field => ["message"]
	}
	date {
		match => ["timestamp","dd/MM/yyyy:HH:mm:ss Z"]
	}
}
output { 
	elasticsearch { 
		hosts => ["http://localhost:9200"] 
		index => "testimport" 
		document_type => "testimport"
		#配置模板文件
		template_overwrite => true
                template => "/ruanjiangongju/logstash/logstash-6.7.0/templete/logstash.json"
	} 
	stdout {
		codec => json_lines 
	} 
}

啓動logstash後再test表中新增數據:

然後在es-head中查詢ik是否生效:

成功!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章