ES 集羣上,業務單點如何優化升級?

摘要: 原創出處 https://www.bysocket.com 「公衆號:泥瓦匠BYSocket 」歡迎關注和轉載,保留摘要,謝謝!
  • ES 基礎
  • ES 集羣
  • ES 集羣上業務優化

1、ES 基礎

ES 的安裝下載,網上一大片,我這邊不在重複。能夠看看我之前作的小筆記:html

Spring Boot 2.0 M7 整合 ES 5 、Kibana 和 X-pack算法

其中 ES 三大要素:spring

  • 文檔(Document)
    文檔,在面向對象觀念就是一個對象。在 ES 裏面,是一個大 JSON 對象,是指定了惟一 ID 的最底層或者根對象。文檔的位置由 _index、_type 和 _id 惟一標識。文檔元數據:

     

    • _index :文檔在哪存放
    • _type : 文檔表示的對象類別
    • _id :文檔惟一標識
  • 索引(Index)
    索引,用於區分文檔成組,即分到一組的文檔集合。索引,用於存儲文檔和使文檔可被搜索。好比項目索引命名爲 project ,交易索引命名爲 trade 等。

     

  • 類型(Type)
    類型,用於區分索引中的文檔,即在索引中對數據邏輯分區。好比設計項目分爲 ui 、 ux 這些類型。能夠放在該類目進行區分。但通常操做,不多用到這麼複雜的。springboot

可見, _index 索引的重要性。避免某個索引存儲不相關的數據。服務器

2、ES 集羣

ES 集羣搭建,文章不少。我這邊也不一一列舉了。先看 ES 集羣分佈式圖微信

file

集羣(Cluster)

跟服務器集羣相似,多個 ElasticSearch 運行實例(節點 Node)的組合體是 ElasticSearch 集羣。app

ElasticSearch 是自然分佈式的,能夠經過水平擴容爲集羣添加更多節點。socket

ElasticSearch 集羣是去中心化的,只有一個主節點(Master)。並且主節點是動態選舉,所以不會出現單點故障。elasticsearch

那節點是什麼?分佈式

節點(Node)

上面說過,一個 ElasticSearch 運行實例就是節點。任何節點均可以被選舉成爲主節點。主節點負責集羣內因此變動,好比文檔的增長、刪除等。因此集羣不會由於主節點流量的增大成爲瓶頸。由於任何節點都會成爲主節點。

如圖,P1 P2 P0 是節點內的主分片,其餘 R 是副分片。

那分片是什麼?

分片(Shard)

分片,是 ES 節點中最小的工做單元。分片僅保存所有數據的一部分。分片包括主分片和副分片,主分片是副分片的拷貝。主分片和副分片基本沒有大的區別。

若是是全文搜索,會查詢到每一個分片,而後將每一個分片的結果進行全局地收集,並處理返回。

舉個例子:好比新建了一個索引 project , 存儲項目相關的數據。那具體的某個 project A 的數據會被切分,存儲在不一樣的分片上。那麼根據 project A 的 _id 如何路由到具體的分片上呢?

分片的路由公式是這樣的:

shard = hash(routing) % number_of_primary_shards 
  • hash 函數生成數字,通過取餘算法獲得餘數。餘數就是分片的位置。
  • routing 是可變值,支持自定義。默認文檔 _id
  • number_of_primary_shards 主分片的數量

3、ES 集羣上業務優化

假若若是剛剛那個例子,一個索引 project , 存儲項目相關的數據。項目的數量級愈來愈大,億量級,萬億量級。那一個大索引的查詢啥的都會出現瓶頸。這時候該怎麼優化呢?

這時候是否是想到了,一句常說的:空間換時間。
這時候是否是也想到了,MySQL 分庫

因此大索引的拆分,也不是很難。相似分片的路由規則,根據具體業務指定便可。

這裏,咱們能夠定義 1000 個索引,分別名爲 project_一、project_二、project_3…

而後在 ES 集羣上面架一層簡單的 proxy 。裏面核心的業務路由規則能夠這樣:

index_id = project_id % 1000 
  • project_id 項目自增 ID
  • index_id 得出來的索引對應的 ID

總結一張圖:
file

  • ES proxy 層:作總索引和真正分索引的映射
  • ES 索引配置管理:作索引與業務的映射
  • ES 集羣:就是上面講的

參考資料

  • https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-index-field.html

如下專題教程也許您會有興趣

  (關注微信公衆號,領取 Java 精選乾貨學習資料)  (添加我微信:bysocket01。加入純技術交流羣,成長技術)
相關文章
相關標籤/搜索