首頁>技術>

1、Elasticsearch支援schema_less模式,但是強烈建議index mappings和settings提前透過template進行設定,避免出現數據混亂和一些應用程式邏輯不相容的問題。

2、叢集數量較大時,建議單獨規劃master節點和ingest節點,避免與資料節點混合部署的情況。這是因為當叢集規模比較大以後,master節點與其他節點間的通訊、元資料和狀態的管理壓力都會比較大,部署獨立的節點可以提升效能保障主節點的穩定性。另外,可以避免當master節點離線時,由於master節點和data節點部署在一起,會產生未分配的分片的情況。

3、Elasticsearch底層是lucene,會涉及大量的檔案的讀寫,在資料量比較大的情況下,要保證效能則對底層硬體有比較大的要求,特別是IO,建議物理機SSD部署,如果資源有限可以考慮冷熱資料分離。

4、shard的大小對於效能有一定影響,建議shard的大小保持50G以內,另外shard總數量建議不超過50萬。

5、應用程式設定呼叫的超時時間不能過於短,因為Elasticsearch寫入的過程是預設先寫入主分片,主分片寫成功以後轉發到副本分片,只有副本分片也寫成功了才能返回響應,這是一個同步的過程,如果某個副本分片寫入比較慢會影響整體響應的時間。早期版本可以配置async允許非同步過程,但2.0.0版本以後取消了這個功能。

6、JVM最大堆記憶體(-Xmx)和最小堆記憶體(-Xms)配置成一樣的值,避免執行過程中動態調整堆記憶體大小,這是一個損耗效能的操作。

7、最佳配置:64G物理機,分配50%的記憶體給elasticsearch,剩下的50%用於作業系統快取。

Elasticsearch的記憶體避免高於32G,建議最大31G,這是因為JVM在堆記憶體小於32G時會採用記憶體物件指標壓縮技術,一旦堆記憶體超過32G,指標就會退化回普通物件指標,即便記憶體增加了實際效果可能更差。

8、禁用swapping。swapping會導致效能變慢,一般建議降低swapping發生頻率或者直接禁止elasticsearch的swapping。禁用swapping在elasticsearch.yml配置檔案配置bootstrap.memory_lock:true開啟mlockall開關,鎖住JVM記憶體,禁止被作業系統交換。注意: 配置了這個選項以後需要在/etc/security/limits.conf配置elasticsearch soft memlock unlimited和elasticsearch hard memlock unlimited降低swapping發生頻率使用sysctl -q vm.swappiness檢視swappiness的值,建議將值修改為1,代表記憶體不足時才會出現記憶體交換。

9、配置檔案最大描述符使用ulimit -a檢視最大檔案描述符數量,可以透過修改/etc/security/limits.conf配置檔案進行修改,如下所示,注意,修改完配置以後需要重啟系統。

* soft nofile 65536* hard nofile 65536* soft nproc 131072* hard nproc 131072

10、Elasticsearch單個節點能儲存的分片數量沒有限制,但是每個分片都是一個完成的lucene例項,對於記憶體和CPU的消耗都是比較大的,所以一個節點上不適宜有太多的分片。可以透過cluster.routing.allocation.total_shards_per_node配置單個節點能儲存的分片數量,透過index.routing.allocation.total_shards_per_node配置單個節點能儲存的單個索引的分片數量。

11、可以動態開啟寫入和查詢慢日誌。

/*/_settings {"index.indexing.slowlog.threshold.index.info":"100ms"}/*/_settings {"index.search.slowlog.threshold.query.warn:"100ms"}

12、合理利用routing欄位,提升查詢效率。一個document最終被放到那個哪個分片上是有一定的計算規則的,在Elasticsearch上根據公式計算shard_num = hash(_routing) % num_primary_shards,預設情況下_routing使用的是id這個隨機的字串,如果查詢的時候有明確的查詢欄位條件,例如根據證件號等,可以用證件號作為routing,相同的資料hash到同一個分片,這樣子查詢的時候就可以直接查詢對應的分片,而不需要掃描index的所有分片,效率會大大提升。

13、根據業務情況提前規劃好索引的大小,比較大的索引建議按照一定的維度進行拆分,例如每個月一個index,查詢時利用別名的機制。

14、儘量避免wildcard查詢,效能較差。

15、查詢時欄位按需返回,避免一次性返回整個索引中所有的定義欄位。

16、使用Rest API,不要使用Java API等特定客戶端語言API,Rest API是趨勢,Java API可能未來會被廢棄。

17、禁用透明大頁Transparent Huge Page。透明大頁可能對程式產生一些負面影響,甚至是記憶體洩漏。

echo server > /sys/kernel/mm/redhat/redhat_transparent_hugepages/defrag

18、大資料量的寫入建議採用Bulk批次寫入的形式,不建議單條多次寫入,效率太低。批次寫入可能會有部分失敗,可以在收到響應後針對失敗的記錄進行重試。

19、對於在sort、aggregation場景開啟doc_values,提升查詢效能,反之,建議將doc_values設定為false,節省磁碟空間,提升索引效能。

20、避免手動提升分片為主分片,而是依賴於叢集自身的選舉能力,避免操作不當丟失資料。例如被提升為主分片的副本分片資料嚴重落後其他節點。

21、JVM新生代大小建議為heap大小的1/3,例如-Xmn10g, -XX:NewMaxSize=10g。這個值建議顯式指定,因為預設情況下使用CMS演算法,理論上新生代和老年代預設比例為1:2,但是實際分配的的新生代和老年代的比例可能不是1:2,可能會導致分配的新生代記憶體很小,在大批次寫入的情況下新生代GC頻繁或者oom。

22、在索引或者查詢比較慢且佔用大量系統CPU的情況下,可以使用/_nodes/hot_threads分析各節點的熱點執行緒CPU消耗情況。

23、Elasticsearch6.8版本以前安全認證和使用者許可權管理功能是收費的,6.8以後開放了部分功能,能滿足一般的應用需要,建議儘量選擇6.8以上,如果線上部署了6.8以下的,許可權控制可以使用searchguard外掛。

24、fielddata記憶體大小預設沒有限制,可能導致頻繁的OOM。建議修改配置項indices.fielddata.cache.size: 10%控制大小,避免堆記憶體不夠GC壓力過大。

25、如果欄位不需要被搜尋,則建議在設定mappings時將index引數設定為false,這樣子就不會建立倒排索引,可以節省儲存空間。

26、倒排索引記錄的內容是可定製化的,透過index_options可以控制索引記錄內容,可以為以下這些值,預設情況下被分析器分析的字串欄位使用 positions 作為預設值,其他的欄位使用 docs 作為預設值。可以根據需求指定不同的值。

docs: 記錄doc id,能確定某個term是否存在於某個欄位,支援搜尋。freqs: 記錄doc id和term frequencies,包含詞頻,支援評分。positions: 記錄doc id、term frequencies、term position,支援鄰近查詢和短語查詢offsets: 記錄doc id、term frequencies、term position、character offsets

27、建議預設將norms設定為false,節省磁碟空間,提升索引效能,只有在需要評分的場景才設定為true。 Norms是一個用來計算文件/欄位得分(Score)的"調節因子",TF-IDF、BM25演算法計算文件得分時都用到了norms引數,在elasticsearch一般應用於評分。對於 text 型別的欄位而言,預設開啟了norms,而 keyword 型別的欄位則預設關閉了norms。

28、String型別的欄位可以設定為keyword和text兩種,keyword型別的欄位會被當作一個term進行搜尋,而text欄位會被分詞器進行分詞,分成多個term提供搜尋,如果不希望被分詞處理,則設定為keyword。列舉型別的欄位,一般都是不分詞處理的,設定為keyword。

29、Elasticsearch中null值會被處理為NULL,這個值不會被索引無法進行搜尋,可以透過null_value為其設定一個預設的值,以提供索引搜尋能力。

30、當需要對節點做下線處理時,先透過排除節點的機制,讓叢集自動將節點上的分片進行遷移,可以透過以下命令表示移除node-1節點,命令執行以後分片開始遷移,透過_cat/shard API可以檢視遷移進度。

curl --location --request PUT 'http://127.0.0.1:9200/_cluster/settings' \--header 'Content-Type: application/json' \--data-raw '{    "transient":{        "cluster.routing.allocation.exclude._name":"node-1"    }}'

如果遷移完畢,節點重新上線,只需要重新將cluster.routing.allocation.exclude._name設定為""即可。

7
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • ES581通訊之python實現