1. 程式人生 > >Elasticsearch使用過程中問題總彙(一)

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
這裡寫圖片描述