文章目錄
- 合理設定分片數
- 推遲分片配置設定
合理設定分片數
分片和副本的設計為 ES 提供了支援分布式和故障轉移的特性,但并不意味着分片和副本是可以無限配置設定的。而且索引的分片完成配置設定後由于索引的路由機制,我們是不能重新修改分片數的。
可能有人會說,我不知道這個索引将來會變得多大,并且過後我也不能更改索引的大小,是以為了保險起見,還是給它設為 1000 個分片吧。但是需要知道的是,一個分片并不是沒有代價的。需要了解:
- 一個分片的底層即為一個 Lucene 索引,會消耗一定檔案句柄、記憶體、以及 CPU 運轉。
- 每一個搜尋請求都需要命中索引中的每一個分片,如果每一個分片都處于不同的節點還好, 但如果多個分片都需要在同一個節點上競争使用相同的資源就有些糟糕了。
- 用于計算相關度的詞項統計資訊是基于分片的。如果有許多分片,每一個都隻有很少的資料會導緻很低的相關度。
一個業務索引具體需要配置設定多少分片可能需要架構師和技術人員對業務的增長有個預先的判斷,橫向擴充應當分階段進行。為下一階段準備好足夠的資源。 隻有當你進入到下一個階段,你才有時間思考需要作出哪些改變來達到這個階段。一般來說,我們遵循一些原則:
- 控制每個分片占用的硬碟容量不超過ES的最大JVM的堆空間設定(一般設定不超過32G,參考下文的JVM設定原則),是以,如果索引的總容量在500G左右,那分片大小在16個左右即可;當然,最好同時考慮原則2。
- 考慮一下node數量,一般一個節點有時候就是一台實體機,如果分片數過多,大大超過了節點數,很可能會導緻一個節點上存在多個分片,一旦該節點故障,即使保持了1個以上的副本,同樣有可能會導緻資料丢失,叢集無法恢複。是以, 一般都設定分片數不超過節點數的3倍。
- 主分片,副本和節點最大數之間數量,我們配置設定的時候可以參考以下關系:
節點數<=主分片數*(副本數+1)
推遲分片配置設定
對于節點瞬時中斷的問題,預設情況,叢集會等待一分鐘來檢視節點是否會重新加入,如果這個節點在此期間重新加入,重新加入的節點會保持其現有的分片資料,不會觸發新的分片配置設定。這樣就可以減少 ES 在自動再平衡可用分片時所帶來的極大開銷。
通過修改參數 delayed_timeout ,可以延長再均衡的時間,可以全局設定也可以在索引級别進行修改:
PUT /_all/_settings
{
"settings": {
"index.unassigned.node_left.delayed_timeout": "5m"
}
}