Shard是什么?
在下面的文檔中進行了介紹
https://www.elastic.co/guide/cn/elasticsearch/guide/current/kagillion-shards.html
1.一個分片的底層即為一個 Lucene 索引,會消耗一定文件句柄、內存、以及 CPU 運轉。
2.每一個搜索請求都需要命中索引中的每一個分片,如果每一個分片都處於不同的節點還好, 但如果多個分片都需要在同一個節點上競爭使用相同的資源就有些糟糕了。
3.用於計算相關度的詞項統計信息是基於分片的。如果有許多分片,每一個都只有很少的數據會導致很低的相關度。
在官方文檔中介紹了clusters, nodes, and shards的關系
https://www.elastic.co/guide/en/elasticsearch/reference/current/scalability.html
1.一個Es的索引實際上是一個或者多個的物理shard的組合
2.Shard有兩種:一種是primaries and replicas,即主分片和副本分片。索引中的每一個文檔都屬於一個主分片,副本分片是主分片的拷貝
replica shard是primary shard的副本,負責容錯,以及承擔讀請求負載
每個document肯定只存在於某一個primary shard以及其對應的replica shard中,不可能存在於多個primary shard
primary shard不能和自己的replica shard放在同一個節點上,否則宕機會出現數據丟失
3.Es通過分散一個index中的文檔到到多個shards中,以及分散這些shards到不同的節點來實現高可用
4.主分片的數量在index創建的時候就決定好了, 副本分片的數量可以隨時改變
5.當增減節點的時候,shard會在集群中自動平衡
6.primary shard的默認數量是5,replica默認是1,默認有10個shard,5個primary shard,5個replica shard,如下
查看某個index的shard命令
http://localhost:9200/xxxx/_search_shards
查看集群的shard可以通過下面命令
http://localhost:9200/_cat/shards
參考:
Elasticsearch 的 Shard 和 Segment
高可用 Elasticsearch 集群的分片管理 (Shard)
Segment是什么?
每個shard(分片)包含多個segment(段),每一個segment都是一個倒排索引
在查詢的時,會把所有的segment查詢結果匯總歸並后最為最終的分片查詢結果返回
1.segment是不可變的,物理上你並不能從中刪除信息,所以在刪除文檔的時候,是在文檔上面打上一個刪除的標記,然后在執行段合並的時候,進行刪除
2.索引segment段的個數越多,搜索性能越低且消耗內存更多
參考: