探索ElasticSearch-ElasticSearch叢集的工作原理(七)
前言
ElasticSearch
為我們提供了開箱即用的特性。我們不用去關心底層的細節也能夠正常使用ElasticSearch
來為我們服務。但是,如果要深入理解ElasticSearch
僅僅在淺層次的使用層面肯定是遠遠不夠的。如果,你不僅僅滿足於簡單使用ElasticSearch
,那麼推薦你繼續往下面閱讀。
通過本文,你將會解答下面這幾個問題。
- 新的
ElasticSearch
是如何加入叢集的? -
ElasticSearch
叢集是如何判斷節點是否存活的? - 檔案是如何分發到某一個分片上面的?
ElasticSearch叢集工作原理
節點的發現
當網路中已經存在了一個ElaticSearch
的叢集時,啟動了一個新的ElasticSearch
ElasticSearch
的叢集中。那麼,到底這個節點是怎麼加入到叢集的呢?
舉個例子。現在網路中存在一個master
節點和一個data
節點的叢集,那麼當網路中再次啟動一個ElasticSearch
的節點時,會發生什麼呢?如下圖所示。
新啟動的ElasticSearch
會進行一個多播的操作。該節點會向所有在網路中的機器都傳送一個ping
的請求。可能大部分情況下,該機器都不是ElasticSearch
的機器,此時沒有相應返回。但是,當傳送請求到ElasticSearch
的master
節點上面時,會返回相關的響應。一但判斷新的ElasticSearch
的叢集名稱是相同的時候,master
ElasticSearch
叢集的一個新的節點。
節點的探活
上面探討的是新的ElasticSearch
節點加入時,叢集工作的原理。那麼如果正常工作的叢集中,有節點出現宕機行為呢?ElasticSearch
的叢集是怎麼感知到有節點宕機,剔除損壞的節點,而且進行資料的轉移的呢?
還是上面這個例子,這個時候已經有三個ElasticSearch
的節點了。如下圖所示。
因為要保證叢集的正常工作,所以master
節點會定期進行探活
工作。具體為每隔一段時間就去ping
其他已知的ElaticSearch
的節點。
如果這個時候,有一個節點宕機了,那麼master
master
節點將會將原來的副本分片提升為主分片。將整個叢集設定為Yellow
狀態。表示已經有部分資料丟失,但是當前叢集還是存在全部的資料,繼續提供搜尋服務,但是不保證叢集的效能等指標。
檔案的分發
那麼當索引一個新的檔案時,ElasticSearch
是怎麼將該檔案分發的呢?
還是上面那個例子。叢集中有三個節點,而且一個索引的三個分片均勻分佈在三個節點上面。此時要索引一個id
為2的新檔案,那麼會被路由分發到那個節點上面呢?
其實檔案的分佈遵循這下面這個公式。
shard_num = hash(_routing) % num_primary_shards
複製程式碼
那我們假設上面新檔案進行hash
之後,仍然是2,那麼最後會落到shard為2的分片上面,如下圖所示。
小結
節點的發現上面討論是預設的情況下,其實ElasticSearch
中可以配置很多其他的發現策略。檔案的分發也可以通過_routing
欄位來制定使用哪一個值來作為hash
函式的入參。這些,下次講解下。
關於寫作
以後這裡每天都會寫一篇文章,題材不限,內容不限,字數不限。儘量把自己每天的思考都放入其中。
如果這篇文章給你帶來了一些幫助,可以動動手指點個贊,順便關注一波就更好了。
如果上面都沒有,那麼寫下讀完之後最想說的話?有效的反饋和你的鼓勵是對我最大的幫助。
另外打算把部落格給重新撿起來了。歡迎大家來訪問吃西瓜。
我是shane。今天是2019年9月8日。百天寫作計劃的第四十六天,46/100。