1. 程式人生 > >ElasticSearch是如何實現分布式的?

ElasticSearch是如何實現分布式的?

pty 現在 對比 寫入 span 流行 不知道 .com -o

面試題

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 上去。

技術分享圖片

通過這個 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等高並發分布式、大數據、機器學習等技術。
傳送門:

ElasticSearch是如何實現分布式的?