Elasticsearch是一把梭,用起來再說?!

0、題記

Elastic中文社區和各種Elastic愛好者交流羣中會遇到形形色色的問題。

來自運維球友討論的真實線上吐槽問題總結:

問題1:開發不規範。

我們這邊es 都是我們在推,很多開發不會用或者用的不規範!

問題2:不管性能,用起來再說!

場景1:我們這邊開發只要work,管他wildcard,能模糊就好,管他內存,windows size死命地設,不管多少頁都讓它翻。

問題3:不評估可行性和高可用性,先搞起來。

場景1, 我們還在2.x,這些開發的大爺可以把size給你堆幾萬!

場景2, 那你叫產品看百度嘛,你搜個東西,前幾頁就有你想要的,會不會翻到10頁以後?

場景3, 對嘛,好多公司都是後臺開發用ES,也許是爲了緩解MySQL其他庫的查詢壓力就不管ES這邊的性能效率了,幾萬條數據都往回吐。

如下圖,某公司26歲的程序員王某的Elasitcsearch一把梭用法,能很形象的說出了問題產生的根因。

這裏引發大家思考:Elasticsearch到底是不是一把梭,用起來再說?!還是有更好的方式?

快速部署、快速增刪改查、快速上線就完了嗎?遇到問題怎麼辦?

我把常見問題總結爲常見的坑,希望您實戰中能避免踩坑。

1、坑1:不重視安全。

2019年12月初安全事件《Elasticsearch27億數據泄露,10億明文,波及中國大廠》。看到類似自媒體標題就很容易讓人恐慌。社區小夥伴真實中招案例如下:

根因:用起來再說,沒有考慮安全,端口直接暴露公網,機器相當於裸奔。

社區創始人Medcl大神說:不要等到出事了纔想起做基本的安全配置!

社區主席劉徵老師比喻恰如其分:

  • 1,es集羣像是一套房子,有門也有鎖,以前大家不捨得買這把鎖,結果小偷推門就進去了,用戶被盜極大的影響使用體驗,現在鎖也免費了隨房屋附送了,請大家謹記上班出門的時候一定鎖好門,es也一樣,沒升級的趕緊升級,沒加鎖,也沒用鎖門習慣的趕緊養成好習慣

  • 2,送的鎖可能需要拆盒安裝一下,這個動作用戶需要知道,房子裏的財產的估值決定了你是否做這個動作!!很形象的比喻。

安全咱們多次強調了:

乾貨 |  Elasticsearch7.X X-Pack基礎安全實操詳解

你的Elasticsearch在裸奔嗎?

官方文檔:Elasticsearch安全功能使您可以輕鬆保護集羣。您可以用密碼保護數據,並實施更高級的安全措施,例如加密通信,基於角色的訪問控制,IP過濾和審覈。

https://www.elastic.co/guide/en/elasticsearch/reference/7.5/configuring-security.html

2、坑2:不規劃集羣,出了問題再說。

實戰問題:

.....當時建的時候沒考慮好,按默認的建了5個分片,版本是6.0.0. 之前是用mysql的,剛遷過來,沒想到數據量非常大,基本每天增長1.5G左右。原來計劃數據至少要保存一年。.....

知識星球討論

    議:不要等數據量大了、磁盤滿了、性能出問題、並行寫入被拒絕了等再考慮規劃集羣。

實戰部署之前建議思考問題:

0、站在巨人的肩上,不閉門造車,查各種資料,總結思考別人如何規劃集羣的?

1、一共要存儲多少全量數據?

2、存儲週期是多長?

3、每天增量數據是多少?

4、客戶期望的QPS/TPS指標是多少?

5、需要幾個節點,如何劃分節點角色?

6、是否有冷熱數據之分?

7、業務層面分幾個索引?

8、每個索引分幾個分片?

9、單分片最大支持的數據量?

10、要不要刪除歷史數據,如何刪除等?

注意:任何別人的建議都是基於特定的場景,特定的物理環境,特定的ES版本及特定的集羣規模等實施的,如果在規劃前自己拿不準,建議通過esrally等測試工具驗證一下。

集羣規劃推薦:

探究 | Elasticsearch集羣規模和容量規劃的底層邏輯

3、坑3:不設置副本、數據不備份,導致數據丟失。

業務場景不同,自行決定數據是否需要副本和備份。

但是相對高可用的場景,建議副本數至少設置爲1。

設置副本好處:

  1. 提升檢索的高可用性;

  2. 讀操作並行,分擔集羣壓力。

副本數量要可受控。

理想最小值:1;最大值:節點數-1。

平衡點:增量基準測試是一種很好的縮小範圍的方法。逐步添加副本,並測量每個新副本的性能改進。如果改進不明顯,副本數可能不適宜調太高

參考:

https://bonsai.io/blog/ideal-elasticsearch-cluster/

  

如上截圖的極限情況會造成數據丟失的。

高可用的場景除了設置副本,建議定期做增量快照,確保數據丟失後可恢復,不影響線上業務

4、坑4:不考慮建模,導致性能問題。

數據建模的重要性,無需贅述。

1、使用模板和別名規劃索引,必要時結合Ingest。

2、儘量自己顯示定義Mapping,不採用動態生成的Mapping。

3、根據業務場景,選擇適合自己業務場景的分詞器。

4、Mysql的多表關聯,在ES中對應選擇:寬表存儲、nested存儲(子文檔更新不頻繁)、join父子文檔(子文檔更新頻繁)。

5、根據實際業務需要選定合適的字段,以最大化優化存儲。如:是否分詞、是否聚合、是否存儲等。

上面截圖也展示了keyword較數值型的性能優勢,選型時也需要斟酌提前考慮。

這些問題先寫入數據,後考慮可以不?

可以,但,不專業

如果是海量數據,reindex遷移數據都會花費您很長時間。

乾貨 | 論Elasticsearch數據建模的重要性

5、坑5:不重視官網基礎,自認爲一切在掌控之中。

坑 5.1:多集羣一臺機器部署,相同的path.data路徑,無異於自殺。

血淋淋的線上教訓:詳見如下:羣友真實案例。大家多注意!

以後多注意:

  • 1,數據目錄:path.data不要多集羣共享。

  • 2,最好一個機器一個集羣節點,如果機器配置高可以考慮分虛擬機或者docker虛擬化或者其他,但path.data切記不要一樣。

坑 5.2:參數配置不合理導致腦裂。

6.x 版本,2節點,minimum_master_nodes最小主機節點數設置1,運行很長一段時間未知原因導致腦裂。

剖析原因:沒有按照官方文檔配置。最小主力節點數=候選主機節點/2+1,應該配置2纔可能不腦裂。

6.X官方明確說明:To avoid a split brain, this setting should be set to a quorum of master-eligible nodes:(master_eligible_nodes / 2) + 1

我現在用7.X了,還要考慮嗎?

注意:在 Elasticsearch 7.0 中,重新設計並重建了集羣協調子系統:移除了 minimum_master_nodes 設置,讓 Elasticsearch 自己選擇可以形成法定數量的節點。

  • 好處1:用戶無需設置最小主節點個數了,集羣層面給解決了。

  • 好處2:避免用戶配置錯誤導致出現腦裂問題。

  • 好處3:選主更快了。

視頻demo 演示:

https://discuss.elastic.co/t/avoid-split-brain-with-new-elasticsearch-7-0-after-discovery-zen-minimum-master-nodes-removal/176877

https://www.elastic.co/cn/blog/a-new-era-for-cluster-coordination-in-elasticsearch

https://www.elastic.co/guide/en/elasticsearch/reference/6.8/discovery-settings.html

坑 5.3:堆內存不合理設置

羣友反饋:線上環境:集羣節點內存大小爲64GB,堆內存設置4g。

出現問題:es啓動前後內存比例太大,堆被打滿。

覆盤:問題很明顯了 堆設置不合理。

建議:min(機器內存/2,32GB)

https://www.elastic.co/guide/en/elasticsearch/guide/current/heap-sizing.html

坑 5.4:磁盤使用NAS 導致拒絕請求

各位好,請教一個問題:掛載nas-SSD的es(docker)集羣,1個master,2個協調,18個data節點,每個16核32g。大量查詢時會出現拒絕請求的情況,nas的數據是每秒1.2g,延遲5ms。會出現rejected的情況。

微信羣討論

   導致的原因估計是宿主機的io在異常時95+,不確定是主機瓶頸還是網絡或者nas的瓶頸。各位有什麼方案或建議嗎?

已經在業務和參數做了一些優化了。我現在想到的是:

  • 1.換物理機掛本地磁盤

  • 2.現在path.data都是掛一個nas,換成多個path.data,目前還不清楚負載是否均衡

回覆:nas官方不推薦,會有性能問題。

官方文檔提示

  • 避免使用網絡附加存儲(NAS)。人們常聲稱他們的 NAS 解決方案比本地驅動器更快更可靠。

  • 除卻這些聲稱, 我們從沒看到 NAS 能配得上它的大肆宣傳。NAS 常常很慢,顯露出更大的延時和更寬的平均延時方差,而且它是單點故障的。

Always use local storage, remote filesystems such as NFS or SMB should be avoided. Also beware of virtualized storage such as Amazon’s Elastic Block Storage.

官網地址:

https://www.elastic.co/guide/en/elasticsearch/reference/7.x/tune-for-indexing-speed.html 

https://www.elastic.co/guide/cn/elasticsearch/guide/current/hardware.html

6、 我知道了這些坑又如何,怎麼破?

以上坑都值得我們開發、運維實際方案選型、可行性分析、方案評估、業務實戰中反思。避免類似問題發生。

瞭解和掌握中間隔了十萬八千里(包括我自己也存在認知問題)。

6.1、重視官方文檔同時多調研

一定要優先覈對官方文檔。比如:wildcard前綴匹配少用或者不用。

你習得別人分享的,就是你業務中需要避免的點。

類似的坑,性能分析的文章,都會有提示。

6.2、彆着急動手,先預研實踐一把

摸着石頭先過河,主要看水多深,能不能過去。

比如:深度翻頁,from size. 要不要翻頁100頁之後,甚至1000頁之後。

業務產品經理就這麼要求怎麼辦?

給出測試時間數據,讓架構層參與一起評估。

同時:給出scroll scroll after slice等解決方案。

6.3、在前期就要考慮性能

  • 1, 準備多少臺服務器?

硬件配置 cpu 內存  磁盤,堆內存等都得考慮。

  • 2,業務層面支持多少併發?寫入速率?查詢返回時間的要求指標?

都是需要關注的點。運維考慮我需要哪些硬件資源、優化配置以提供支撐?

開發考慮:我怎麼優化查詢、優化業務細節。多考慮、多考慮、多考慮。

  • 3, 提前避免導致慢查詢、gc相關的操作。

包含不限於:優化配值、預熱緩存機制、冷熱架構集羣機制、合理控制分片、按時間規劃切分索引、模板、別名、靜態mapping、最優檢索等等。

6.4,切記Elasticsearch不是一把梭,快了就是慢了!

的確,數據量不大,部署、數據導入、增刪改查搞定的瞬間,感覺ES“不就那麼回事嗎?有什麼難的?”

這麼想的時候,就是可能危險的時候!

用就得好好用,參考第一手資料官方文檔。而不是各種網上搜到的片段。

6.5 考慮版本升級

羣友還有1.X,2.X,5.X的不少釘子戶存在,礙於各種原因(jie kou),不能升級。

不升級,體會不到性能優勢和新功能點(尤其)。

現在不升級,時間長了徒傷悲。

後面會相對更麻煩。推薦看下升級7.x的10個理由。

不盡興,歡迎留言討論您實戰中遇到的坑。也歡迎交流您的"一把梭"用法!


推薦:

重磅 | 死磕Elasticsearch方法論認知清單(2019國慶更新版)

elastic.blog.csdn.net


發佈了365 篇原創文章 · 獲贊 2846 · 訪問量 341萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章