1. 程式人生 > >ElasticSearch權威指南學習(分散式叢集)

ElasticSearch權威指南學習(分散式叢集)

空叢集

  1. 只有一個空節點的叢集
    • 一個節點(node)就是一個Elasticsearch例項,而一個叢集(cluster)由一個或多個節點組成,它們具有相同的cluster.name,它們協同工作,分享資料和負載。當加入新的節點或者刪除一個節點時,叢集就會感知到並平衡資料
    • 叢集中一個節點會被選舉為主節點(master),它將臨時管理叢集級別的一些變更,例如新建或刪除索引、增加或移除節點等。主節點不參與文件級別的變更或搜尋,這意味著在流量增長的時候,該主節點不會成為叢集的瓶頸。任何節點都可以成為主節點。我們例子中的叢集只有一個節點,所以它會充當主節點的角色。
    • 做為使用者,我們能夠與叢集中的任何節點通訊,包括主節點。每一個節點都知道文件存在於哪個節點上
      ,它們可以轉發請求到相應的節點上。我們訪問的節點負責收集各節點返回的資料,最後一起返回給客戶端。這一切都由Elasticsearch處理。

叢集健康

  1. 叢集健康有三種狀態:green、yellow或red
GET /_cluster/health

{
   "cluster_name":          "elasticsearch",
   "status":                "green", //狀態
   "timed_out":             false,
   "number_of_nodes":       1,
   "number_of_data_nodes":  1,
   "active_primary_shards": 0,
   "active_shards":         0,
   "relocating_shards":     0,
   "initializing_shards":   0,
   "unassigned_shards":     0
}
顏色 意義
green 所有主要分片和複製分片都可用
yellow 所有主要分片可用,但不是所有複製分片都可用
red 不是所有的主要分片都可用

新增索引

  1. 為了將資料新增到Elasticsearch,我們需要索引(index)——一個儲存關聯資料的地方。實際上,索引只是一個用來指向一個或多個分片(shards)的“邏輯名稱空間(logical namespace)”。
  2. 一個分片(shard)是一個最小級別“工作單元(worker unit)”,它只是儲存了索引中所有資料的一部分。一個分片就是一個Lucene例項
  3. 您可以在叢集節點上儲存的分片數量與您可用的堆記憶體大小成正比,但這在Elasticsearch中沒有的固定限制。 一個很好的經驗法則是:確保每個節點的分片數量保持在低於每1GB堆記憶體對應叢集的分片在20-25之間。 因此,具有30GB堆記憶體的節點最多可以有600-750個分片,但是進一步低於此限制,您可以保持更好。 這通常會幫助群體保持處於健康狀態。
  4. 分片大小為50GB通常被界定為適用於各種用例的限制
  5. 為了演示的目的,我們只分配3個主分片和一個複製分片(每個主分片都有一個複製分片)
PUT /blogs
{
   "settings" : {
      "number_of_shards" : 3,
      "number_of_replicas" : 1
   }
}

{
   "cluster_name":          "elasticsearch",
   "status":                "yellow", //狀態
   "timed_out":             false,
   "number_of_nodes":       1,
   "number_of_data_nodes":  1,
   "active_primary_shards": 3,
   "active_shards":         3,
   "relocating_shards":     0,
   "initializing_shards":   0,
   "unassigned_shards":     3 <2>
}

  • 狀態為yelloww,因為只有主節點,複製節點沒有被分配

增加故障轉移

  1. 在單一節點上執行意味著有單點故障的風險——沒有資料備份。幸運的是,要防止單點故障,我們唯一需要做的就是啟動另一個節點
  2. 只要第二個節點與第一個節點有相同的cluster.name(請看./config/elasticsearch.yml檔案),它就能自動發現並加入第一個節點所在的叢集

橫向擴充套件

  1. 如果我們啟動第三個節點,我們的叢集會重新組織自己

繼續擴充套件

  1. 主分片的數量在建立索引時已經確定。實際上,這個數量定義了能儲存到索引裡資料的最大數量(實際的數量取決於你的資料、硬體和應用場景)。然而,主分片或者複製分片都可以處理讀請求——搜尋或文件檢索,所以資料的冗餘越多,我們能處理的搜尋吞吐量就越大。
  2. 複製分片的數量從原來的1增加到2
PUT /blogs/_settings
{
   "number_of_replicas" : 2
}

  1. 這樣使我們的搜尋效能相比原始的三節點叢集增加三倍
  2. 同樣數量的節點上增加更多的複製分片並不能提高效能,因為這樣做的話平均每個分片的所佔有的硬體資源就減少了
  3. 不過這些額外的複製節點使我們有更多的冗餘:通過以上對節點的設定,我們能夠承受兩個節點故障而不丟失資料

應對故障(3個主分片,6個副本節點)

  1. 殺掉第一個節點的程序
  2. 我們殺掉的節點是一個主節點。一個叢集必須要有一個主節點才能使其功能正常,所以叢集做的第一件事就是各節點選舉了一個新的主節點:Node 2。
  3. 主分片1和2在我們殺掉Node 1時已經丟失,我們的索引在丟失主分片時不能正常工作。如果此時我們檢查叢集健康,我們將看到狀態red:不是所有主分片都可用!
  4. 但丟失的兩個主分片的完整拷貝存在於其他節點上,所以新主節點做的第一件事是把這些在Node 2和Node 3上的複製分片升級為主分片,這時叢集健康回到yellow狀態。這個提升是瞬間完成的,就好像按了一下開關。
  5. 當我們殺掉Node 2,我們的程式依然可以在沒有丟失資料的情況下繼續執行,因為Node 3還有每個分片的拷貝。
  6. 如果我們重啟Node 1,叢集將能夠重新分配丟失的複製分片