1.說一下es的分布式架構原理 / es是如何實現分布式的
核心思想就是在多台機器上啟動多個 es 進程實例,組成了一個 es 集群。
創建一個index,index包含多個shard,每個shard都是一個最小工作單元,每個 shard 存儲部分數據。
一個shard 的數據實際是有多個備份,就是說每個 shard 都有一個 primary shard ,接受寫和讀請求,但是還有幾個 replica shard ,負責容錯,以及承擔讀請求負載。 primary shard 寫入數據之後,會將數據同步到其他幾個 replica shard 上去。這樣,每個 shard 的數據都有多個備份,如果某個機器宕機了,還有別的數據副本在別的機器上呢,這樣就實現了高可用。
es 集群多個節點,會自動選舉一個節點為 master 節點,這個 master 節點其實就是干一些管理的工作的,比如維護索引元數據、負責切換 primary shard 和 replica shard 身份等。要是 master 節點宕機了,那麼會重新選舉一個節點為 master 節點。
如果某個非 master 節點宕機了。那麼此節點上的 primary shard 就沒了。那好,master 會讓 primary shard 對應的 replica shard(在其他機器上)切換為 primary shard。如果宕機的機器修復了,修復後的節點上的shard也不再是 primary shard,而是 replica shard。同步後續修改的數據之類的,讓集群恢復正常。
上述就是 ElasticSearch 作為一個分布式搜尋引擎最基本的一個架構設計。
2.說一下es的寫入數據流程以及底層原理
1)客戶端選擇一個node (es節點)發送請求過去,這個node (es節點)就是coordinating node (協調節點),對document (文檔)進行路由,將請求轉發給對應的node 2)實際的node上的primary shard處理請求,然後將數據同步到replica node 3)coordinating node,如果發現primary node和所有replica node都搞定之後,就返迴響應結果給客戶端
es寫入數據的原理
3.說一下es的讀數據流程
讀數據分為GET和Search,即查詢一條 和 搜索操作。
查詢:
查詢操作,即GET某一條數據,寫入了某個document,該document會自動給你分配一個全局唯一id-doc id,同時也是根據doc id進行hash路由到對應的primary shard上面去。當然也可以手動指定doc id,比如用訂單id,用戶id。
可以通過doc id來查詢,會根據doc id進行hash,判斷出當時把doc id分配到了哪個shard,從那個shard去查詢
搜索:
4.為什麼es集群至少需要三個節點
首先需要知道一點:es的配置文件中有一個配置:discovery.zen.minimum master nodes:2 ,默認是2,即選舉Master時需要的節點數。
假設es有兩個節點,master node 和 data node,即選舉Master時鎖需要的節點為 1,此時出現網絡波動,導致 master node 和 data node出現短暫的斷開連接,根據選舉規則,data node將自己選舉為master,當網絡波動結束後,就會出現兩個master,即我們所說的腦裂。
當es有三個節點,master node、data data(A)、data node(B),即選舉Master時鎖需要的節點為 2,此時出現網絡波動,master node 和 A 、B斷開連接,則 master node降級,A、B進行選舉,假設選舉為A為master,當網絡恢復後,之前的 master node --> data node,之前的 data node(A)--> master node。
所以,通過配置 minimum master nodes 來防止出現腦裂,在生產過程中, 為了儘量保持集群高可用, 至少需要三台機器搭建集群。
end:如果你覺得本文對你有幫助的話,記得關注點贊轉發,你的支持就是我更新動力。