ES的分布式架構原理(ES如何實現分布式)


  ElasticSearch 設計的理念就是分布式搜索引擎,底層其實還是基於 lucene 的。核心思想就是在多台機器上啟動多個 es 進程實例,組成了一個 es 集群。

  es 中存儲數據的基本單位是索引,比如說你現在要在 es 中存儲一些訂單數據,你就應該在 es 中創建一個索引 order_idx,所有的訂單數據就都寫到這個索引里面去,一個索引差不多就是相當於是 mysql 里的一張表。

index -> type -> mapping -> document -> field

 

  這樣吧,為了做個更直白的介紹,我在這里做個類比。

  index 相當於 mysql 里的一張表。而 type 沒法跟 mysql 里去對比,一個 index 里可以有多個 type,每個 type 的字段都是差不多的,但是有一些略微的差別。假設有一個 index,是訂單 index,里面專門是放訂單數據的。就好比說你在 mysql 中建表,有些訂單是實物商品的訂單,比如一件衣服、一雙鞋子;有些訂單是虛擬商品的訂單,比如游戲點卡,話費充值。就兩種訂單大部分字段是一樣的,但是少部分字段可能有略微的一些差別。

  所以就會在訂單 index 里,建兩個 type,一個是實物商品訂單 type,一個是虛擬商品訂單 type,這兩個 type 大部分字段是一樣的,少部分字段是不一樣的。

  很多情況下,一個 index 里可能就一個 type,但是確實如果說是一個 index 里有多個 type 的情況,你可以認為 index 是一個類別的表,具體的每個 type 代表了具體的一個 mysql 中的表。每個 type 有一個 mapping,如果你認為一個 type 是一個具體的一個表,index 代表多個 type 的同屬於的一個類型,mapping 就是這個 type 的表結構定義,你在 mysql 中創建一個表,肯定是要定義表結構的,里面有哪些字段,每個字段是什么類型。實際上你往 index 里的一個 type 里面寫的一條數據,叫做一條 document,一條 document 就代表了 mysql 中某個表里的一行,每個 document 有多個 field,每個 field 就代表了這個 document 中的一個字段的值。

 
  你搞一個索引,這個索引可以拆分成多個 shard(分片),每個 shard 存儲部分數據。

  接着就是這個 shard 的數據實際是有多個備份,就是說每個 shard 都有一個 primary shard,負責寫入數據,但是還有幾個 replica shardprimary shard 寫入數據之后,會將數據同步到其他幾個 replica shard 上去。(類似Kafka)

  通過這個 replica 的方案,每個 shard 的數據都有多個備份,如果某個機器宕機了,沒關系啊,還有別的數據副本在別的機器上呢。高可用了吧。

  es 集群多個節點,會自動選舉一個節點為 master 節點,這個 master 節點其實就是干一些管理的工作的,比如維護索引元數據、負責切換 primary shard 和 replica shard 身份等。要是 master 節點宕機了,那么會重新選舉一個節點為 master 節點。

  如果是非 master節點宕機了,那么會由 master 節點,讓那個宕機節點上的 primary shard 的身份轉移到其他機器上的 replica shard。接着你要是修復了那個宕機機器,重啟了之后,master 節點會控制將缺失的 replica shard 分配過去,同步后續修改的數據之類的,讓集群恢復正常。

  說得更簡單一點,就是說如果某個非 master 節點宕機了。那么此節點上的 primary shard 不就沒了。那好,master 會讓 primary shard 對應的 replica shard(在其他機器上)切換為 primary shard。如果宕機的機器修復了,修復后的節點也不再是 primary shard,而是 replica shard。

  其實上述就是 ElasticSearch 作為一個分布式搜索引擎最基本的一個架構設計。


免責聲明!

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



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