ElasticSearch 學習記錄之如任何設計可擴容的索引結構


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 來重新打開它們。

歸檔舊索引數據
非常舊的索引 可以通過snapshot-restore API歸檔至長期存儲

基於用戶的數據

Elasticsearch 支持多租戶所以每個用戶可以在相同的集群中擁有自己的索引
一個用戶一個索引”對大多數場景都可以滿足

共享索引

利用別名實現一個用戶一個索引

對子文檔進行聚合操作

POST product/_search
{
 "size": 0,
 "aggs": {
   "productSource": {
     "terms": {
       "field": "productSource"
     },
     "aggs": {
       "prices": {
         "children": {
           "type": "price"
         },
         "aggs": {
           "minPrice": {
             "terms": {
               "field": "minPrice"
             }
           }
         }
       }
     }
   }
 }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM