分片和副本的設計為 ES 提供了支持分布式和故障轉移的特性,但并不意味著分片和副本是可以無限分配的。而且索引的分片完成分配后由于索引的路由機制,我們是不能重新修改分片數的。
<br/>
一個分片并不是沒有代價的。需要了解:
* 一個分片的底層即為一個 Lucene 索引,會消耗一定文件句柄、內存、以及 CPU 運轉。
* 每一個搜索請求都需要命中索引中的每一個分片,如果每一個分片都處于不同的節點還好, 但如果多個分片都需要在同一個節點上競爭使用相同的資源就有些糟糕了。
* 用于計算相關度的詞項統計信息是基于分片的。如果有許多分片,每一個都只有很少的數據會導致很低的相關度。
一個業務索引具體需要分配多少分片可能需要架構師和技術人員對業務的增長有個預先的判斷,橫向擴展應當分階段進行。為下一階段準備好足夠的資源。 只有當你進入到下一個階段,你才有時間思考需要作出哪些改變來達到這個階段。一般來說,我們遵循一些原則:
* 控制每個分片占用的硬盤容量不超過 ES 的最大 JVM 的堆空間設置(一般設置不超過 32G,參考下文的 JVM 設置原則),因此,如果索引的總容量在 500G 左右,那分片大小在 16 個左右即可;當然,最好同時考慮原則 2。
* 考慮一下 node 數量,一般一個節點有時候就是一臺物理機,如果分片數過多,大大超過了節點數,很可能會導致一個節點上存在多個分片,一旦該節點故障,即使保持了 1 個以上的副本,同樣有可能會導致數據丟失,集群無法恢復。所以, 一般都設置分片數不超過節點數的 3 倍。
* 主分片,副本和節點最大數之間數量,我們分配的時候可以參考以下關系:
```
節點數<=主分片數*(副本數)
```
- Elasticsearch是什么
- 全文搜索引擎
- Elasticsearch與Solr
- 數據結構
- 安裝Elasticsearch
- Linux單機安裝
- Windows單機安裝
- 安裝Kibana
- Linux安裝
- Windows安裝
- es基本語句
- 索引操作
- 文檔操作
- 映射操作
- 高級查詢
- es-JavaAPI
- maven依賴
- 索引操作
- 文檔操作
- 高級查詢
- es集群搭建
- Linux集群搭建
- Windows集群搭建
- 核心概念
- 索引(Index)
- 類型(Type)
- 文檔(Document)
- 字段(Field)
- 映射(Mapping)
- 分片(Shards)
- 副本(Replicas)
- 分配(Allocation)
- 系統架構
- 分布式集群
- 單節點集群
- 故障轉移
- 水平擴容
- 應對故障
- 路由計算
- 分片控制
- 寫流程
- 讀流程
- 更新流程
- 多文檔操作流程
- 分片原理
- 倒排索引
- 文檔搜索
- 動態更新索引
- 近實時搜索
- 持久化變更
- 段合并
- 文檔分析
- 內置分析器
- 分析器使用場景
- 測試分析器
- 指定分析器
- 自定義分析器
- 文檔處理
- 文檔沖突
- 樂觀并發控制
- 外部系統版本控制
- es優化
- 硬件選擇
- 分片策略
- 合理設置分片數
- 推遲分片分配
- 路由選擇
- 寫入速度優化
- 批量數據提交
- 優化存儲設備
- 合理使用合并
- 減少Refresh的次數
- 加大Flush設置
- 減少副本的數量
- 內存設置
- 重要配置
- es常見問題
- 為什么要使用Elasticsearch
- master選舉流程
- 集群腦裂問題
- 索引文檔流程
- 更新和刪除文檔流程
- 搜索流程
- ES部署在Linux時的優化方法
- GC方面ES需要注意的點
- ES對大數據量的聚合實現
- 并發時保證讀寫一致性
- 字典樹
- ES的倒排索引
- Spring Data Elasticsearch
- 環境搭建
- 索引操作
- 文檔操作