Elasticsearch使用過程中問題總彙(一)
內容
彙總在專案開發過程中使用ES及logstash產生的問題及解決辦法。
1、logstash-input-jdbc安裝及使用
詳見上一篇
2、logstash-input-jdbc同步mysql過程中增量同步(相對於全量同步)
在logstash配置檔案中,如果只配置最基本的幾個引數,通常會預設為每次全量拉取資料,這顯然大部分時間下是沒有必要的。
而要做到每次只拉取新增或新改動的資料,就需要配置幾個引數:
lowercase_column_names => "false"
#處理中文亂碼問題
codec => plain { charset => "UTF-8" }
#使用其它欄位追蹤,而不是用時間,false預設是timestamp
use_column_value => true
#追蹤的欄位
tracking_column => id
#是否記錄上次執行結果, 如果為真,將會把上次執行到的 tracking_column欄位的值記錄下來,儲存到 last_run_metadata_path 指定的檔案中
record_last_run => true
#上一個sql_last_value值的存放檔案路徑, 必須要在檔案中指定欄位的初始值
last_run_metadata_path => "E:\ES\logstash-5.6.3\bin\config-mysql\station-user.txt"
#是否清除 last_run_metadata_path 的記錄,如果為真那麼每次都相當於從頭開始查詢所有的資料庫記錄
clean_run => false
而sql語句要加上 where 追蹤的欄位 > :sql_last_value(被記錄的上次執行結果,這個值可以在上面配置的檔案路徑中看到)
e.g.select userID id,username,nickname from user where userID > :sql_last_value
再執行配置檔案,可以看到logstash只會同步id滿足條件的記錄,如果想要同步改動的記錄,最好還是跟蹤時間變數,簡單易行。
3、logstash、MySQL關於時區的問題 (未解決)
1)mysql The server time zone value 異常:
解決:jdbc_connection_string => "jdbc:mysql://localhost:3306/demo?serverTimezone=UTC"
在資料庫地址後加?serverTimezone=UTC,但是這個時間是世界標準時間0時區,不過如果我們改成東八區時間,在logstash記錄mysql
資料時又會將時間都轉換成UTC時間,會造成問題logstash裡看到的時間直觀上比資料庫裡時間早8個小時,所以暫時保留就以UTC時間
同步到logstash。
2)logstash 0時區問題:
關於logstash中時間格式UTC,我在嘗試多種方法後,仍未有效將時間轉換成北京時間,只能暫時擱置。
logstash中時間格式是2017-11-03T12:12:12.000Z,檢視ISO 8601,可知這種時間格式其中包含date和time,
中間T,即Time,Z,即時區。後面加上Z表示是零時區的時間,要表示其他時區的時間,比如東八區的時間,
可以用2017-11-03T12:12:12-0800表示,也就是在時間的後面加上+/-hh:mm來表示時間差,
+表示時間早,-表示時間晚,比如官方的例子中,下面的時間是相同的:”18:30Z”, “22:30+04”, “1130−0700”, and “15:00−03:30”
e.g.2017-11-03T17:30:08+08:00或20171103T173008+08
4、elasticsearch之mapping對映
官網地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html
mapping對映:
A mapping defines the fields within a type, the datatype for each field, and how the field should be handled by Elasticsearch. A mapping is also used to configure metadata associated with the type.
Mapping定義了type中的諸多欄位的資料型別以及這些欄位如何被Elasticsearch處理,比如一個欄位是否可以查詢以及如何分詞等。
如果index 理解為資料庫例項,type理解為表,mapping可以理解為表的結構和相關設定的資訊。
對單張表即一個type對映時,在logstash output中新增對映模板如下,
若要進行多個type進行對映,則在mapping中新增多個type.
一般預設的mapping即可,不用顯示定義mapping,只有要覆蓋預設值時才必須要提供mapping定義。
output {
elasticsearch {
hosts => "127.0.0.1:9200"
index => "index"
template => "config-mysql/yc-template-notice.json"
template_name => "index"
template_overwrite => true
document_id => "%{id}"
}
stdout {
codec => json_lines
}
}
模板json就是一般的mapping寫法:
{
"template" : "index",
"settings" : {
"index.number_of_shards" : 5,
"number_of_replicas" : 1,
"index.refresh_interval" : "60s"
},
"mappings" : {
"notice" : {
"_all" : {"enabled" : true},
"properties" : {
"@version": { "type": "string", "index": "not_analyzed" },
"iflook" : {"type" : "byte"},
"usr_id" : {"type" : "integer"},
"id" : {"type" : "integer"},
"create_date" : {
"type" : "date",
"index" : "not_analyzed",
"doc_values" : true },
"notice_id" : {"type" : "integer"}
}
}
}
}
更改對映:
需要注意一下,我們已經存在的索引是不可以更改它的對映的,對於存在的索引,只有新欄位出現時,Elasticsearch才會自動進行處理。
如果確實需要修改對映,那麼就使用reindex,採用重新匯入資料的方式完成(logstash的方法)
或者通過重新建索引方法
1.如果要推到現有的對映,你得重新建立一個索引.然後重新定義對映
2.然後把之前索引裡的資料匯入到新的索引裡
-------具體方法------
1.給現有的索引定義一個別名,並且把現有的索引指向這個別名,執行步驟2
2.執行: PUT /現有索引/_alias/別名A
3.新建立一個索引,定義好最新的對映
4.將別名指向新的索引.並且取消之前索引的執行,執行步驟5
5.執行: POST /_aliases
{
"actions":[
{"remove" : { "index": "現有索引名". "alias":"別名A" }}.
{"add" : { "index": "新建索引名", "alias":"別名A" }}
]
}
注意:通過這幾個步驟就實現了索引的平滑過渡,並且是零停機
參考資料:
http://blog.csdn.net/u010994304/article/details/50454025
http://www.cnblogs.com/zhaijunming5/p/6426940.html
http://m.blog.csdn.net/lilongsheng1125/article/details/53862629
5、解決elasticsearch http://IP地址:9200 訪問的問題
修改elasticsearch下config\elasticsearch.yml檔案
放開 #network.host: 192.168.0.1 註釋 改成自己ip