ElasticSearch是如何實現分散式的?

李紅歐巴發表於2019-03-25

面試題

es 的分散式架構原理能說一下麼(es 是如何實現分散式的啊)?

面試官心理分析

在搜尋這塊,lucene 是最流行的搜尋庫。幾年前業內一般都問,你瞭解 lucene 嗎?你知道倒排索引的原理嗎?現在早已經 out 了,因為現在很多專案都是直接用基於 lucene 的分散式搜尋引擎—— ElasticSearch,簡稱為 es。

而現在分散式搜尋基本已經成為大部分網際網路行業的 Java 系統的標配,其中尤為流行的就是 es,前幾年 es 沒火的時候,大家一般用 solr。但是這兩年基本大部分企業和專案都開始轉向 es 了。

所以網際網路面試,肯定會跟你聊聊分散式搜尋引擎,也就一定會聊聊 es,如果你確實不知道,那你真的就 out 了。

如果面試官問你第一個問題,確實一般都會問你 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 的情況(注意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 上去。


ElasticSearch是如何實現分散式的?


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


免費Java資料需要自己領取,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo/Kafka、Hadoop、Hbase、Flink等高併發分散式、大資料、機器學習等技術。
傳送門:mp.weixin.qq.com/s/JzddfH-7y…


相關文章