|
背景 注:ElasticSearch版本為5.4。 在我們的日志系統(tǒng)里需要一些系統(tǒng)索引,這些系統(tǒng)索引在應(yīng)用初始化的時候就會被添加到ElasticSearch中去,這些在ElasticSearch中的系統(tǒng)索引在沒有索引數(shù)據(jù)的時候,只有索引名和一些配置信息,沒有mapping信息。當(dāng)用戶去根據(jù)時間區(qū)間排序搜索日志信息的時候,ElasticSearch就會產(chǎn)生all shards failed異常。具體異常信息如下: 查看了.alert的索引數(shù)據(jù)再結(jié)合ElasticSearch的異常信息判斷,我懷疑是由于.alert系統(tǒng)索引沒有timestamp mapping信息引起的,.alert索引初始化沒有任何數(shù)據(jù)時,ElasticSearch中的信息如下: http://dev:9200/.alert 看到這些信息之后,我開始了用以下方法嘗試解決。 解決方法 以下方法1和方法2都以失敗而告終,只有方法3可以成功解決該問題。但在解決問題中我查找了很多資料,讓我對ElasticSearch的mapping有了更深地理解,因此我將解決該問題的過程記錄了下來。 方法1:添加索引模板 首先,由于是沒有timestamp這個mapping信息,因此我想到創(chuàng)建索引模板,將.alert這個索引的mappings信息用模板來設(shè)置,以便在索引創(chuàng)建的時候就有相應(yīng)的mapping信息。模板信息如下: 但是,經(jīng)過測試后發(fā)現(xiàn),all shards failed的問題還是會產(chǎn)生。究其原因是由于: 索引模板只會在插入新索引數(shù)據(jù)的時候生效,如果沒有索引數(shù)據(jù),索引模板定義的mappings信息不會生效,而且對模板的改變不會影響到已存在的索引。 此時,.alert這個索引為空,還沒有新數(shù)據(jù)插入,因此,模板不會生效,也就致使該方法不會解決all shards failed的問題。 方法2:創(chuàng)建索引時添加mapping 由于ElasticSearch允許在創(chuàng)建索引時就創(chuàng)建mapping信息,于是我想到了這個方法,經(jīng)過測試后,可以解決all shards failed的問題。但是,產(chǎn)生了一個嚴(yán)重的后果,我們用.alert索引來記錄服務(wù)器報警信息,當(dāng)我往.alert這個索引里添加數(shù)據(jù)時,只有timestamp這個字段的數(shù)據(jù)添加進去了,其他數(shù)據(jù)像產(chǎn)生報警的主機、報警內(nèi)容等信息添加失敗。 查詢官方文檔發(fā)現(xiàn): mapping信息一旦被創(chuàng)建,就不允許被修改。改變已有的mapping就意味著使已經(jīng)存在的索引數(shù)據(jù)無效,解決的辦法就是使用正確的mappings信息來創(chuàng)建新的索引,然后重新把數(shù)據(jù)添加到新索引中。雖然官方提供了reindex方法來解決這個問題,但是,在大數(shù)據(jù)量的情況下,reindex代價比較高,因此,創(chuàng)建索引時添加mapping這個方法也行不通。 方法3:給排序條件加unmapped_type ElasticSearch的search api可以設(shè)置排序時忽略字段的哪些映射。默認情況下,如果沒有與排序字段關(guān)聯(lián)的映射,則搜索請求將失敗。unmapped_type選項允許設(shè)置忽略沒有映射的字段,從而不對該字段排序。由于timestamp的mapping為date類型,因此,在搜索排序條件中增加{"timestamp":{"unmapped_type":"date"}}成功解決由于排序字段沒有date映射引起的all shards failed問題。 |
|
|
來自: 小牛學(xué)堂666 > 《待分類》