ElasticSearch 系列文章
1 ES 入門之一 安裝ElasticSearcha
2 ES 記錄之如何創建一個索引映射
3 ElasticSearch 學習記錄之Text keyword 兩種基本類型區別
4 ES 入門記錄之 match和term查詢的區別
5 ElasticSearch 學習記錄之ES幾種常見的聚合操作
6 ElasticSearch 學習記錄之父子結構的查詢
7 ElasticSearch 學習記錄之ES查詢添加排序字段和使用missing或existing字段查詢
8 ElasticSearch 學習記錄之ES高亮搜索
9 ElasticSearch 學習記錄之ES短語匹配基本用法
10 ElasticSearch 學習記錄之 分布式文檔存儲往ES中存數據和取數據的原理
11 ElasticSearch 學習記錄之集群分片內部原理
12 ElasticSearch 學習記錄之ES如何操作Lucene段
13 ElasticSearch 學習記錄之如任何設計可擴容的索引結構
14 ElasticSearch之 控制相關度原理講解
擴容設計
擴容的單元
-
一個分片即一個 Lucene 索引 ,一個 Elasticsearch 索引即一系列分片的集合
-
一個分片即為 擴容的單元 。 一個最小的索引擁有一個分片。
-
一個只有一個分片的索引無擴容因子
- -
如何判斷一個請求過來,我的信息在哪個分片上面
- shard = hash(routing) % number_of_primary_shards
- routing 大致是指文檔的id
分片預分配
-
一個分片存在於單個節點, 但一個節點可以持有多個分片
-
一個擁有兩個分片的索引可以利用第二個節點來存儲數據
- -
Elasticsearch 中新添加的索引默認被指定了五個主分片
-
為何不使用分片的分裂而是分片復制轉移
- 分裂分片是重新索引數據,比復制更重
- 分裂是指數級的
- 分裂需要足夠大的空間
海量分片
- 如何控制分片的數量
- 分片的數據模型是什么
- 一個分片的底層是Lucene索引,會消耗文件的句柄 內存 CPU 等
- 每個搜索請求都會命中索引的每個分片,多個分片咋同一個節點上會競爭資源
- 基於相關度的詞頻信息計算是基於分片的
容量規划
- 如何根據自己的自身情況,來判斷分片的多少
- 可以根據下面的步驟,在特定環境中測定分片的多少
- 基於生產的單個節點集群
- 和生產相同的索引,知識他只有一個主分片無副本分片
- 索引實際文檔
- 查詢或聚合實際文檔
- 在真實的環境上運行,直到它掛掉。
- 然后根據上面的信息,來進行分片的數量的計算
副本分片
-
副本分片的主要目的就是為了故障轉移
-
如果持有主分片的節點掛掉了,一個副本分片就會晉升為主分片
-
新文檔首先被索引進主分片然后再同步到其它所有的副本分片
-
副本分片可以服務於讀請求
-
可以通過增加副本的數目來提升查詢性能
-
一個擁有兩個主分片一份副本的索引可以在四個節點中橫向擴展
-
-
過調整副本數來均衡節點負載
- 原則上一個主分片不會它索引的副本分片在一起
多索引
- 如何不停服務來增加容量
- 創建一個新的索引存儲數據
- 同時搜索兩個索引來獲取新數據和舊數據
- 使用索引別名來同時查詢兩個索引的數據
索引模板‘
-
使用模板可以創建有用的索引
創建索引模板PUT /_template/my_logs 創建一個名為 my_logs 的模板
{
"template": "logstash-*",
將這個模板應用於所有以 logstash- 為起始的索引
"order": 1, 這個模板將會覆蓋默認的 logstash 模板,因為默認模板的 order 更低。
"settings": {
"number_of_shards": 1 限制主分片數量為 1
},
"mappings": {
"default": { 為所有類型禁用 _all 域
"_all": {
"enabled": false
}
}
},
"aliases": {
"last_3_months": {}
添加這個索引至 last_3_months 別名中。
}
}
數據過期
-
一次刪除多個索引
- DELETE /logs_2013* //使用通配符
關閉舊的索引
POST /logs_2014-01-/_flush 刷寫(Flush)所有一月的索引來清空事務日志
POST /logs_2014-01-/_close
關閉所有一月的索引.
POST /logs_2014-01-*/_open當你需要再次訪問它們時,使用 open API 來重新打開它們。 - DELETE /logs_2013* //使用通配符
歸檔舊索引數據
非常舊的索引 可以通過snapshot-restore API歸檔至長期存儲
基於用戶的數據
Elasticsearch 支持多租戶所以每個用戶可以在相同的集群中擁有自己的索引
一個用戶一個索引”對大多數場景都可以滿足
共享索引
利用別名實現一個用戶一個索引
對子文檔進行聚合操作
POST product/_search
{
"size": 0,
"aggs": {
"productSource": {
"terms": {
"field": "productSource"
},
"aggs": {
"prices": {
"children": {
"type": "price"
},
"aggs": {
"minPrice": {
"terms": {
"field": "minPrice"
}
}
}
}
}
}
}
}