Elasticsearch是如何實現分佈式的?

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 的情況(注意mapping types 這個概念在 ElasticSearch 7.X 已被完全移除,詳細說明可以參考官方文檔),你可以認爲 index 是一個類別的表,具體的每個 type 代表了 mysql 中的一個表。每個 type 有一個 mapping,如果你認爲一個 type 是具體的一個表,index 就代表多個 type 同屬於的一個類型,而 mapping 就是這個 type 的表結構定義,你在 mysql 中創建一個表,肯定是要定義表結構的,裏面有哪些字段,每個字段是什麼類型。實際上你往 index 裏的一個 type 裏面寫的一條數據,叫做一條 document,一條 document 就代表了 mysql 中某個表裏的一行,每個 document 有多個 field,每個 field 就代表了這個 document 中的一個字段的值。

你搞一個索引,這個索引可以拆分成多個 shard,每個 shard 存儲部分數據。拆分多個 shard 是有好處的,一是支持橫向擴展,比如你數據量是 3T,3 個 shard,每個 shard 就 1T 的數據,若現在數據量增加到 4T,怎麼擴展,很簡單,重新建一個有 4 個 shard 的索引,將數據導進去;二是提高性能,數據分佈在多個 shard,即多臺服務器上,所有的操作,都會在多臺機器上並行分佈式執行,提高了吞吐量和性能。

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

 

通過這個 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 作爲分佈式搜索引擎最基本的一個架構設計。


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章