教你如何在 elasticsearch 中重建索引

序言

Elasticsearch 是一個實時的分布式搜索分析引擎。Teambition 使用 Elastisearch 作為搜索引擎,為用戶提供搜索服務,當我們決定存儲某種數據時,我們需要使用PUT /teambition創建索引,在創建索引的時候需要將數據結構完整確定下來,于此同時索引的設定和很多固定配置將用不能改變。當需要改變數據結構時,就需要重新建立索引,為此,Elastic團隊提供了很多輔助工具幫助開發人員進行重建索引。

決定是否需要重建?

重建時相當痛苦的,如果沒有很好的基礎,服務可能中斷,當數據量非常大時,重建恢復時間可能很長,甚至在重建過程中出錯等等。所以,沒有萬不得已的情況下還是盡量避免重建索引。Teambition 重建索引的理由略,因為這并不重要。

使用正確的工具

kibana 是 Elasticsearch 的最佳拍檔,從 ES 5.0 開始,Kibana 強大的功能能夠替代幾乎所有舊時代 ES 1.x 和 ES 2.x 的插件。關鍵是人家還是免費的!

先決條件

正在運行的服務必須使用別名(alias)來訪問索引(index),原因很簡單,搜索服務最終要使用重建的索引,原始的索引將被刪除。如果你的服務正在直接使用索引名,在重建前創建別名,更新服務。

POST /_aliases
{"actions": [{"add": {"index": "teambition", // 原有索引"alias": "teambition_latest" // 服務的別名}}]
}
復制代碼

先決條件2

記得查看 Elasticsearch 的 Disk Usage,如果不夠,請先申請好足夠的空間。

創建新索引

和創建普通索引一樣創建新索引。這里值得一提的時,當數據量很大的時候,需要設置刷新時間間隔,在此期間寫入的數據不能搜到,從而提高重建速度:refresh_intervals = -1, number_of_replicas = 0。實踐告訴我,大概會提高100% ~ 400%的提升。

PUT /teambition_20180328
{"settings": {...},"mapping": {...}
}
復制代碼

記錄同步數據的偏移值(offset)

Teambition使用Kafka把MongoDB中的數據導入到Elasticsearch中,如果沒有kafka,亦可讀取oplog的數據寫入Elasticsearch。無論使用哪種同步數據的方式,都需要記錄同步數據的offset。重建索引可能非常耗時,在這段時間內,同步進程仍然在向舊索引更新數據,此時重建索引是無法更新這些新數據的。這里記錄的方法就不多說了,Teambition 使用 kafka-admin 的API記錄 offset。

開始重建索引

使用 Elasticsearch 團隊提供的 reindex api 就可以將數據 copy 到新索引中。這里幾條路可以選:

  1. 當只是改變 mapping 數據結構時,可以僅僅使用 reindex api 即可。例如:刪除字段,更新字段分詞方式等。
  2. 當需要寫入新的字段,新的字段是由老的字段計算得到時,可以使用script參數。例如,計算某條數據某字段的總和。script 有很多坑,當 script 出錯時,reindex 跑了很久之后失敗,即使將數據恢復,也需要重新跑 reindex。
  3. 當含有很復雜的邏輯時,額,還是自己寫程序吧。

調用 reindex 接口,接口將會在 reindex 結束后返回,而接口返回超時只有30秒,如果 reindex 時間過長,建議加上wait_for_completion=false的參數條件,這樣 reindex 將直接返回taskId

POST _reindex?wait_for_completion=false
{"source": {"index": "teambition"},"dest": {"index": "teambition_20180328"},"script": {...}
}
復制代碼

重建索引中

重建索引非常耗時,喝杯咖啡歇一會兒吧(順便去打個球,睡個覺,旅個游)。

在沒有設置 refresh_intervalsnumber_of_replicas 時,reindex 的速度在 500~1000 doc/sec, 如果包含 script 時可能會更低。設置之后,可以到 4000~8000 doc/sec。 Teambition 70M Documents 大概耗時4小時。

可以使用GET _tasks/{taskID}可以看到重建進程,其中包含耗時,剩余doc數量等信息。

如果發現錯誤,可以使用PUT _tasks/{taskID}/cancel接口放棄任務,從頭再來。

恢復同步數據

重建索引結束后,別忘了在setting中的將number_of_replicasrefresh_intervals設為原有值. 啟動新的同步索引的進程(從記錄 offset 開始同步)

建立新的alias

需要在同時綁定建立的新索引以及解綁舊索引,語句如下:

POST _aliases
{"actions": [{"add": {"index": "teambition_20180328","alias": "teambition_latest"}}, {"remove": {"index": "teambition","alias": "teambition_latest"}}]
}
復制代碼

刪掉index

刪除舊的 index,釋放磁盤空間;停止原有同步進程。

DELETE teambition
復制代碼

總結

修改索引真的是一件費時費力的工作,特別是如果發生了錯誤,整個人都不好了。所以還是在創建索引的時候盡量想好能否滿足需求,當然大家都知道這幾乎是不可能的,因為存在著萬惡的產品經理。

這里還有一個很重要的內容沒有詳細介紹就是同步進程,前面提到同步進程是將 MongoDB 的數據同步到 ES 中去的程序,這個程序同時還需要有能力暫停同步,重復同步的等能力。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254599.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254599.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254599.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

halcon控制算子Control,持續更新

目錄Controlassignassign_atbreakcasecatchcommentcontinueconvert_tuple_to_vector_1dconvert_vector_to_tupledefaultelseelseifendforendifendswitchendtryendwhileexecutable_expressionexitexport_defforglobalififelseimportinsertpar_joinrepeatreturnstopswitchthrowtr…

《CLR via C#》之線程處理——線程基礎

《CLR via C#》之線程處理——線程基礎 《CLR via C#》之線程處理——線程基礎windows為什么要支持線程線程開銷CPU發展趨勢CLR線程和Windows線程使用專用線程執行異步的計算限制操作線程調度和優先級windows為什么要支持線程 早期的操作系統只有一個執行線程,但同時…

《高效程序員的45個習慣》-之二

請您在閱讀本文之前,先了解《高效程序員的45個習慣》-之一。 每一期都會涉及15個話題,用3期來列出這45個習慣,每次不貪多,貪精,大家如果有空,一定要細細品味這15個習慣。 注意:每一個好的習…

MIME Type的介紹

轉載自: http://www.cnblogs.com/jsean/articles/1610265.html 一、 首先,我們要了解瀏覽器是如何處理內容的。在瀏覽器中顯示的內容有 HTML、有 XML、有 GIF、還有 Flash ……那么,瀏覽器是如何區分它們,決定什么內容用什么形式來…

spring boot之從零開始開發自己的網站

概述 首先要感謝兩位大神,該項目的想法來源自tale和MyBlog。 做了一些改造,增加了一些功能和一些代碼的重構,并且更換了博客主題。 關于項目,對于開發的練手項目,能夠工程化,嚴謹一些。 關于文檔&#x…

halcon深度學習算子,持續更新

目錄Deep Learning 深度學習Classification:分類apply_dl_classifierclear_dl_classifierclear_dl_classifier_resultclear_dl_classifier_train_resultdeserialize_dl_classifierget_dl_classifier_paramget_dl_classifier_resultget_dl_classifier_train_resultre…

python day5--正則表達式

#----正則表達式 import re elink <a href"(.*)">(.*)</a> info <a href"http://www.baidu.com">baidu</a> cinfo re.findall(elink,info) print (cinfo) import re print(re.search (r^a,abc\neee)) #預期結果 ^匹配字符開…

WCF系列教程之WCF客戶端調用服務

1、創建WCF客戶端應用程序需要執行下列步驟 (1)、獲取服務終結點的服務協定、綁定以及地址信息 (2)、使用該信息創建WCF客戶端 (3)、調用操作 (4)、關閉WCF客戶端對象 二、操作實例 1、WCF服務層搭建:新建契約層、服務層、和WCF宿主,添加必須的引用(這里不會的參考本人前面的隨…

《高效程序員的45個習慣》-之三

請您在閱讀本文之前&#xff0c;先了解《高效程序員的45個習慣》-之二。 每一期都會涉及15個話題&#xff0c;用3期來列出這45個習慣&#xff0c;每次不貪多&#xff0c;貪精&#xff0c;大家如果有空&#xff0c;一定要細細品味這15個習慣。 注意&#xff1a;每一個好的習…

負載均衡的那些事?

什么是負載均衡&#xff1f;1、負載&#xff1a;就是后端系統的承載能力。比如同等條件下&#xff0c;一個1核cpu-1G內存的機器的承載能力一般會比8核cpu-8G內存的機器要差&#xff1b;相同配置下&#xff0c;一個cpu利用率為80%的機器比30%的承載能力一般要差等等。2、均衡&am…

Develop內部函數,持續更新

Develop內部函數 目錄Develop內部函數dev_clear_objdev_clear_windowdev_close_inspect_ctrldev_close_tooldev_close_windowdev_disp_textdev_displaydev_error_vardev_get_exception_datadev_get_preferencesdev_get_systemdev_get_windowdev_inspect_ctrldev_map_pardev_map…

短信認證方案,用手機短信進行上網認證如何實現?

WFilter NGF的“Web認證”模塊&#xff0c;提供了一系列的上網認證解決方案。包括如下認證方式&#xff1a;本地用戶名密碼認證AD域用戶名密碼認證企業郵箱用戶名密碼認證Radius用戶名密碼認證微信WiFi認證Facebook Wifi認證除此&#xff0c;WFilter NGF還有一個“其他”的選項…

《高效程序員的45個習慣》-末篇

請您在閱讀本文之前&#xff0c;先了解《高效程序員的45個習慣》-之三。 每一期都會涉及15個話題&#xff0c;用3期來列出這45個習慣&#xff0c;每次不貪多&#xff0c;貪精&#xff0c;大家如果有空&#xff0c;一定要細細品味這15個習慣。 注意&#xff1a;每一個好的習…

【Qt開發】V4L2 API詳解 Buffer的準備和數據讀取

前面主要介紹的是&#xff1a;V4L2 的一些設置接口&#xff0c;如亮度&#xff0c;飽和度&#xff0c;曝光時間&#xff0c;幀數&#xff0c;增益&#xff0c;白平衡等。今天看看V4L2 得到數據的幾個關鍵ioctl&#xff0c;Buffer的申請和數據的抓取。1. 初始化 Memory Mapping …

halcon File文件算子,持續更新

目錄File文件Images圖像read_imageread_sequencewrite_imagedeserialize_imageserialize_imagelist_image_fileparse_filenameMisc混合體copy_filedelete_filefile_existsget_current_dirlist_filesmake_dirread_world_fileremove_dirset_current_dirObject對象deserialize_obj…

Nginx 之一:編譯安裝nginx 1.8.1 及配置

轉http://www.cnblogs.com/zhang-shijie/p/5294162.html 一&#xff1a;基介紹 官網地址www.nginx.org&#xff0c;nginx是由1994年畢業于俄羅斯國立莫斯科鮑曼科技大學的同學為俄羅斯rambler.ru公司開發的&#xff0c;開發工作最早從2002年開始&#xff0c;第一次公開發布時間…

PI校正環節的程序實現推導過程

PI校正環節在經典控制論中非常有用&#xff0c;特別是對負反饋控制系統&#xff0c;基本上都有PI校正環節。1.下面分別說明比例環節和積分環節的作用&#xff0c;以階躍信號為例。①比例環節單獨作用以上分析說明&#xff0c;若只有比例環節的控制系統&#xff0c;階躍響應也是…

XML文檔注釋(C#)

目錄XML文檔編譯器識別的標記添加XLM注釋的方法添加XLM注釋的例子XML文檔 C#可以根據特定的注釋自動創建XML格式的文檔說明。 這些注釋都是單行注釋&#xff0c;但都以三條斜杠開頭 編譯器識別的標記 標記說明<C>把行中的文本標記為代碼&#xff0c;例如<c>int …

vs里根據json快速創建對應類的方法

有時候,我們在調用別人接口的時候,服務端返回了一個json格式的字符串,我們要獲取json里面的數據的話一般有兩種方式: 1.通過正則 2.反序列化成一個對象 第一種方式這里不再多說,主要說一下第二種,(為什么呢&#xff0c;你看到后面 你也會喜歡上第二種) 有人肯定會說, json字符串…

德魯克的《卓有成效的管理者》

是一本很好的書&#xff0c;對我有諸多的啟發&#xff0c;這本書我在短期內連看兩遍呢。 現將一些我覺得有啟發性的句子發給大家分享。 1. 一個人的有效性&#xff0c;與他的智力、想象力或知識之間&#xff0c;幾乎沒有太大的關聯。有才能的人往往最為無效&#xff0c;因為他們…