elasticsearch6 學習之數據分片

来源:https://www.cnblogs.com/jalja/archive/2018/02/23/8371869.html
-Advertisement-
Play Games

Elasticsearch 是利用分片將數據分發到集群內各處的。分片是數據的容器,文檔保存在分片內,分片又被分配到集群內的各個節點里。 當你的集群規模擴大或者縮小時, Elasticsearch 會自動的在各節點中遷移分片,使得數據仍然均勻分佈在集群里。 ...


 ES:

ElasticSearch(簡稱ES):是一個基於Lucene構建的開源、分散式、RESTful的全文本搜索引擎;它還是一個分散式實時文檔存儲,其中每個field均是被索引的數據且可被搜索;也是一個帶實時分析功能的分散式搜索引擎,並且能夠擴展至數以百計的伺服器存儲及處理PB級的數據。

 倒排索引:

1、什麼是node

ES集群中每一個節點就是一個node,或者一個Elasticsearch實例就是一個節點。

node分類:

a、主節點:主節點不接受客戶端的請求,他主要控制Elasticsearch集群,負責集群中的操作,比如創建/刪除一個索引,跟蹤哪些節點是群集的一部分,並決定哪些分片分配給相關的節點。主節點處理集群的狀態並廣播到其他節點,並接收其他節點的確認響應。 預設情況下任何一個集群中的節點都有可能被選為主節點,每個節點都可以通過設定配置文件elasticsearch.yml中的node.master屬性為true(預設),node.data屬性設置為false,成為主節點。對於大型的生產集群來說,推薦使用一個專門的主節點來控制集群,該節點將不處理任何用戶請求,穩定的主節點對集群的健康是非常重要的。

b、數據節點:該節點具有存儲數據和執行數據相關的操作,如增刪改查,搜索,和聚合操作。數據節點對cpu,記憶體,io要求較高,在優化的時候需要監控數據節點的狀態,當資源不夠的時候,需要在集群中添加新的節點。預設情況下,每個節點都可以通過設定配置文件elasticsearch.yml中的node.data屬性為true(預設)成為數據節點。如果我們要使用一個專門的主節點,應將其node.data屬性設置為false。

 c、客戶端節點:該節點主要將客戶端的請求路由到集群中的各個節點,扮演一個負載均衡的角色。將node.master屬性和node.data屬性都設置為false,那麼該節點就是一個客戶端節點。

d、部落節點:部落節點可以跨越多個集群,它可以接收每個集群的狀態,然後合併成一個全局集群的狀態,它可以讀寫所有節點上的數據,部落節點在elasticsearch.yml中的配置如下:tribe:*:

總結:

  如果將master和client獨立出來,一旦出現問題,重啟後幾乎是瞬間就恢復的,對用戶幾乎沒有任何影響。另外將這些角色獨立出來的以後,也將對應的計算資源消耗從data node剝離出來,更容易掌握data node資源消耗與寫入量和查詢量之間的聯繫,便於做容量管理和規劃。

2、什麼是shard(分片)

  一個 分片 是一個底層的 工作單元 ,它僅保存了全部數據中的一部分,一個分片是一個 Lucene 的實例,它本身就是一個完整的搜索引擎。我們的文檔被存儲和索引到分片內,但是應用程式是直接與索引而不是與分片進行交互。
      Elasticsearch 是利用分片將數據分發到集群內各處的。分片是數據的容器,文檔保存在分片內,分片又被分配到集群內的各個節點里。當你的集群規模擴大或者縮小時, Elasticsearch 會自動的在各節點中遷移分片,使得數據仍然均勻分佈在集群里。

註意:技術上來說,一個主分片最大能夠存儲 Integer.MAX_VALUE - 128 個文檔,但是實際最大值還需要參考你的使用場景:包括你使用的硬體,文檔的大小和複雜程度,索引和查詢文檔的方式以及你期望的響應時長。

主分片:在索引建立的時候就已經確定了主分片數,但是副本分片數可以隨時修改,索引內任意一個文檔都歸屬於一個主分片,所以主分片的數目決定著索引能夠保存的最大數據量。
副分片:一個副本分片只是一個主分片的拷貝。副本分片作為硬體故障時保護數據不丟失的冗餘備份,併為搜索和返迴文檔等讀操作提供服務

創建名為 my_index 的索引,索引在預設情況下會被分配5個主分片。

    PUT /my_index
    {
         "settings" : {
          "number_of_shards" : 3,
          "number_of_replicas" : 1
       }
    }

查看集群中每個index的分片情況:

GET /_cluster/health?level=indices

3、什麼是index(索引)

   index是保存相關數據的地方,索引實際上是指向一個或者多個物理 分片的邏輯命名空間 。事實上,我們的數據被存儲和索引在分片(shards)中,索引只是一個把一個或者多個分片分組在一起的邏輯空間,然而內部的一些細節不需要我們程式關心,文檔存儲在索引(index)中,剩下的需要的工作交由Elasticsearch關心即可。索引命名規範這個名稱必須全部小寫,不能以下劃線開頭,不能包含逗號。

4、什麼是type

   在Elasticsearch中,我們可以使用相同類型(type)的文檔表示相同的"事物",因為他們的數據結構是相同的,每個類型都有自己的映射(mapping)或者結構定義,就像傳統資料庫表中的列一樣,所有類型下的文檔被儲存在同一個索引下,但是類型的映射(mapping)會告訴Elasticsearch不同的文檔如何被索引。_type的命名規範,它的名字可以是大寫或者小寫,不能包含下劃線或逗號,後面我們將使用employee作為類型名。

5、什麼是document(文檔)

 一條記錄,類似資料庫中的一列。在 Elasticsearch 中,術語 文檔 有著特定的含義,它是指最頂層或者根對象, 這個根對象被序列化成 JSON 並存儲到 Elasticsearch 中,指定了唯一 ID。

文檔元數據:_index:文檔在哪存放; _type:文檔表示的對象類別; _id:文檔唯一標識(可以提供自己的 _id ,也可以讓 Elasticsearch 幫你生成)。通過_index、_type、_id 可以唯一確定 Elasticsearch 中的一個文檔。

GET /car_index/car_type/1

檢查文檔是否存在:

HEAD /car_index/car_type/1

當然,一個文檔僅僅是在檢查的時候不存在,並不意味著一毫秒之後它也不存在:也許同時正好另一個進程就創建了該文檔。

 

6、什麼是documnet routing(數據路由)

  當客戶端發起創建document的時候,es需要確定這個document放在該index哪個shard上。這個過程就是數據路由。

路由過程:

    路由演算法:shard = hash(routing) % number_of_primary_shards

    routing:每次增刪改查一個document的時候,都會帶過來一個routing number,他的預設值就是這個document的_id(可能是手動指定,也可能是自動生成)routing = _id,所以決定一個document在哪個shard上,最重要的一個值就是routing值。相同的routing值,從hash函數中,產出的hash值一定是相同的。

    number_of_primary_shards:主分片。

    例如:假設_id=1會將這個routing值,傳入一個hash函數中,產出一個routing值的hash值,hash(routing) = 21,然後將hash函數產出的值對這個index的primaryshard的數量求餘數,21 % 3 = 0 就決定了,這個document就放在P0上。

手動指定routing:PUT /index/type/id?routing=user_id

手動指定routing value,可以保證某一類document一定被路由到一個shard上去,那麼在後續進行應用級別的負載均衡以及提升批量讀取的性能的時候,是很有幫助的。

7、為什麼primary shard數量不可變

  假如我們的集群在初始化的時候有5個primary shard,我們望裡邊加入一個document    id=5,假如hash(5)=23,這時該document 將被加入 (shard=23%5=3)P3這個分片上。如果隨後我們給es集群添加一個primary shard ,此時就有6個primary shard,當我們GET id=5 ,這條數據的時候,es會計算該請求的路由信息找到存儲他的 primary shard(shard=23%6=5) ,根據計算結果定位到P5分片上。而我們的數據在P3上。所以es集群無法添加primary shard,但是可以擴展replicas shard。 

8、ES    document增刪改的處理流程

ES增刪改的處理流程:增刪該的請求一定作用在主分片上。

假如我們es集群有3node,每個node上一個主分片一個複製分片。

1、客戶端發起一個PUT請求,假如該請求被髮送到第一個node節點,那麼該節點將成為協調節點(coordinating node),如圖P1所在的節點就是協調節點。他將根據該請求的路由信息計算,該document將被存儲到哪個分片。

2、第二步 通過計算發現該document被存儲到p0分片,那麼就將請求轉發到node2節點

3、第三步 P0根據請求信息創建document,和相應的索引信息,創建完畢後將信息同步到自己的副本節點R0上。

4、第四步 P0R0將通知我們的協調節點,任務完成情況。

5、第五部 協調節點響應客戶端最終的處理結果。

 

9、ES document讀請求流程

1、第一步客戶端發送讀器請求到協調節點(coordinate node)。
2、第二步協調節點(coordinate node)根據請求信息對document進行路由計算,將請求轉發到對應的node,node2 或者node3。 此時會使用round-robin隨機輪詢演算法,在primary shard以及其所有replica(副本)中隨機選擇一個,讓讀請求負載均衡。
3、第三步相應接收到請求的節點(node2或者node3)將處理結果返回給協調節點(coordinate node)。
4、協調節點將最終的結果反饋給客戶端。

註意:document如果還在建立索引過程中,可能只有primary shard有,任何一個replica shard都沒有,此時請求如果作用到replica shard上可能會導致無法讀取到document信息。但是document完成索引建立之後,primary shard和replica shard就都有了。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • LVS介紹 LVS LVS體系架構 LVS的基本原理 LVS的四種負載均衡模式 LVS的十種調度演算法 LVS的優缺點 ...
  • 事務 1.概念 一條或者多條sql語句的集合! 事務:就是一堆操作的集合,他們同生共死。要麼都執行成功,要麼都執行失敗2.事務的特性 ACID A:原子性 完整的,不可分割的 原子性 (Atomicity):在事務中的操作,要麼都執行,要麼都不執行! C: 一致性 事務執行完畢後,數據的狀態是一致的 ...
  • 存儲常式是存儲在資料庫伺服器中的一組sql語句,通過在查詢中調用一個指定的名稱來執行這些sql語句命令. 簡介 SQL語句需要先編譯然後執行,而存儲過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,經編譯後存儲在資料庫中,用戶通過指定存儲過程的名字並給定參數(如果該存儲過 ...
  • 1.視圖: 就是一張虛擬表,本質上存儲的是一對SQL的集合 -- 視圖 是一張虛擬的表 01.表示一張表的部分數據或者是多張表的綜合數據! 02.結構和數據都是建立在對真表的查詢基礎之上的! 03.視圖中存放的數據其實就是對真實表的引用! 對視圖中的數據進行添加,更新刪除都會影響到真實的表! 04. ...
  • 1.概念 一條或者多條sql語句的集合! 事務:就是一堆操作的集合,他們同生共死。要麼都執行成功,要麼都執行失敗2.事務的特性 ACID A:原子性 完整的,不可分割的 原子性 (Atomicity):在事務中的操作,要麼都執行,要麼都不執行! C: 一致性 事務執行完畢後,數據的狀態是一致的() ...
  • 首先創建一張 students 表 SQL腳本如下: ![][1] ![][2] 不帶參數的存儲過程 執行存儲過程: ![][3] 帶參數的存儲過程 執行存儲過程: ![][4] 帶有輸出參數的存儲過程 MySQL 支持 in (傳遞給存儲過程),out (從存儲過程傳出) 和 inout (對存儲 ...
  • 強制:不允許在跳板機上/生產伺服器上手工連接,查詢或更改線上數據。 強制:所有上線腳本必須先在測試環境執行,驗證通過以後方可在生產環境執行。 強制:上線腳本的編碼格式統一為UTF-8。 強制:訪問資料庫需要使用DNS功能變數名稱,不能直接寫IP。 ...
  • 一、問題概述 問題大概是這樣的,有一個功能頁面經常查詢超時,有時候就算能查詢出來也要很長的時間,但是有時又會很快。遇到的這種問題在排除掉網路原因之後基本上可以從查詢語句上去找原因。 編譯查詢SQL語句和查詢進程等待結果如下: 1.進程等待 2.編譯查詢 問題分析: 1.等待類型為SOS_SCHEDU ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...