1、面試題
es的分布式架構原理能說一下么(es是如何實現分布式的啊)?
2、面試官心里分析
在搜索這塊,lucene是最流行的搜索庫。幾年前業內一般都問,你了解lucene嗎?你知道倒排索引的原理嗎?現在早已經out了,因為現在很多項目都是直接用基於lucene的分布式搜索引擎——elasticsearch,簡稱為es。
而現在分布式搜索基本已經成為大部分互聯網行業的java系統的標配,其中尤為流行的就是es,前幾年es沒火的時候,大家一般用solr。但是這兩年基本大部分企業和項目都開始轉向es了。
所以互聯網面試,肯定會跟你聊聊分布式搜索引擎,也就一定會聊聊es,如果你確實不知道,那你真的就out了。
如果面試官問你第一個問題,確實一般都會問你es的分布式架構設計能介紹一下么?就看看你對分布式搜索引擎架構的一個基本理解。
3、額外的友情提示
同學啊,如果你看到這里發現自己對es一無所知,沒事兒,保持淡定,暫停一下課程。然后上百度搜一下es是啥?本機啟動個es?然后寫個es的hello world感受一下?然后搜個帖子把es常見的幾個操作都執行一遍(聚合、常見搜索語法之類的)?ok了,1~2小時熟悉足夠了,回來吧,繼續看我們的課程。
4、面試題剖析
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中創建一個表,肯定是要定義表結構的,里面有哪些字段,每個字段是什么類型。。。
mapping就代表了這個type的表結構的定義,定義了這個type中每個字段名稱,字段是什么類型的,然后還有這個字段的各種配置
實際上你往index里的一個type里面寫的一條數據,叫做一條document,一條document就代表了mysql中某個表里的一行給,每個document有多個field,每個field就代表了這個document中的一個字段的值
接着你搞一個索引,這個索引可以拆分成多個shard,每個shard存儲部分數據。
接着就是這個shard的數據實際是有多個備份,就是說每個shard都有一個primary shard,負責寫入數據,但是還有幾個replica shard。primary shard寫入數據之后,會將數據同步到其他幾個replica shard上去。
通過這個replica的方案,每個shard的數據都有多個備份,如果某個機器宕機了,沒關系啊,還有別的數據副本在別的機器上呢。高可用了吧。
es集群多個節點,會自動選舉一個節點為master節點,這個master節點其實就是干一些管理的工作的,比如維護索引元數據拉,負責切換primary shard和replica shard身份拉,之類的。
要是master節點宕機了,那么會重新選舉一個節點為master節點。
如果是非master節點宕機了,那么會由master節點,讓那個宕機節點上的primary shard的身份轉移到其他機器上的replica shard。急着你要是修復了那個宕機機器,重啟了之后,master節點會控制將缺失的replica shard分配過去,同步后續修改的數據之類的,讓集群恢復正常。
其實上述就是elasticsearch作為一個分布式搜索引擎最基本的一個架構設計