ElasticSearch入門系列(四)分布式初探


序言:ElasticSearch致力於隱藏分布式系統的復雜性,以下的操作都是在底層自動完成的:

    將你的文檔分區到不同的容器或者分片(shards),他們可以存在於一個或多個節點中

    將分片均勻的分配到各個節點,對索引的搜索做負載均衡

    冗余每一個分片,防止硬件故障造成的數據丟失

    將集群中任意一個節點上的請求路由到相應數據所在的節點

    無論是增加節點,還是移除節點,分片都可以做到無縫的擴展和遷移

一、集群內部工作方式

Elasticsearch用於構建高可用結可擴展的系統。擴展的方式可以是購買更好的服務器擴展(縱向擴展vertical scale or scaling up)或者購買更多的服務器(橫向擴展horizontal scale or scaling out)

Elasticsearch雖然能從更強大的硬件中獲得更好的額性能,但是縱向擴展有他的局限性,真正的擴展應該是橫向的,它通過增加節點來均攤負載和增加可靠性。

對於大多數數據庫來說,橫向擴展意味着你的程序將做很大的改動才能利用這些新添加的設備,對比來說,Elasticsearch天生就是分布式的,它知道如何管理節點來提供高擴展和高可用。

二、空集群

如果我們啟動一個單獨的節點,他還沒有數據和索引,這個集群看起來像:

一個節點(node)就是一個Elasticsearch實例,而一個集群(cluster)由一個或多個節點組成,他們具有相同的cluster.name,他們協同工作,分享數據和負載,當加入新的節點或刪除一個節點時,集群就會感知到並平衡數據。

集群中一個節點會被選舉為主節點(master)他將臨時管理集群級別的一些變更,例如新建或刪除索引、增加或移除節點等。主節點不參與文檔級別的變更或搜索,這意味着在流量增長的時候該主節點不會成為集群的瓶頸,任何節點都可以成為主節點,當只有一個節點時,它就是主節點。

作為用戶,我們能夠與集群中的任何節點通信,包括主節點。每一個節點都知道文檔存在於哪個節點上,他們可以轉發請求到相應的節點上,我們訪問的節點負責收集數據各節點返回的數據,最后一期返回給客戶端,這一切都由Elasticsearch處理、

二、集群健康

在Elasticsearch集群中可以監控統計很多信息,但是只有一個是最重要的:集群健康(cluster  health)。集群健康有三種狀態:green    yellow   red

   請求:GET /_cluster/health

如果是一個沒有索引的空集群中查詢,將返回:

{
   "cluster_name": "elasticsearch", "status": "green", <1> "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 } 

 

<1>status字段提供一個綜合的指標來表示集群的服務狀況

green:所有主要分片和復制分片都可用

yellow:所有主要分片可用,但不是所有復制分片都可用

red:不是所有的主要分片都可用

三、添加索引

為了將數據添加到Elasticsearch,我們需要索引(index)一個存儲關聯數據的地方,實際上,索引知識一個用來指向一個或多個分片(shards)的邏輯命名空間(logical namespace)

一個分片(shard)是一個最小級別“工作單元(worker unit)”它只是保存了索引中所有數據的一部分。,一個分片就是一個Lucene實例,並且他本身就是一個完整的搜索引擎。

分片是Elasticsearch在集群中分發數據分關鍵,把分片想向成數據的容器,文檔存儲在分片中,然后分片分配到你集群中的節點上,當集群擴容或縮小elsticsearch將會自動在你的節點上遷移分片,使集群平衡。

分片 可以是主分片或者復制分片,你索引中的每個文檔屬於一個單獨的主分片,所以主分片的數量決定了索引最多能存儲多少數據

復制分片知識主分片的一個副本,他可以防止硬件故障導致的數據丟失,同時可以提供讀請求,比如搜索或者從別的shard取回文檔

當索引創建完成的時候,主分片的數量就固定了,但是復制分片的數量可以隨時調整。

我們在集群中唯一一個空節點上創建一個叫做blogs的索引,默認一個索引被分配5個主分片,目前我們只分片3個主分片和一個復制分片

PUT /blogs
{
   "settings" : { "number_of_shards" : 3, "number_of_replicas" : 1 } }

附帶索引的單一節點集群:

這時我們檢查集群健康:

{
   "cluster_name": "elasticsearch", "status": "yellow", <1> "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> }

<1>集群的狀態現在是yellow

<2>我們的三個輔助分片還沒有被分配到節點上

集群的健康狀態yellow表示所有的主分片啟動並且正常運行了--集群已經可以正常處理任何請求--但是復制分片還沒有全部可用,事實上素有的三個復制分片現在都是unassigned狀態,他們還沒有被分配節點,在同一個節點上保存相同的數據副本是沒有必要的,如果這個節點故障了,那所有的數據副本也會丟失、

四、增加故障轉移

單一節點運行意味着單點故障的分析-沒有數據備份。要防止故障,我們需要啟動另一個節點

只要第二個節點與第一個節點有相同的cluster.name,他就能自動發現並加入第一個節點所在的集群,如果沒有,可能是網絡廣播禁用,或防火牆阻止了節點通信。

雙節點集群--所有的主分片和復制分片都已分配。

第二個節點已經加入集群,三個復制分配也已經被分配了--分別對應單個主分片,這表示丟失任意一個節點的時候依然可以保證數據的完整性、

文檔的索引將首先被存儲在主分片中,然后並發復制到對應的復制節點上,這可以確保我們的數據在主節點和復制節點上都可以被檢索。

集群健康狀態:

{
   "cluster_name": "elasticsearch", "status": "green", <1> "timed_out": false, "number_of_nodes": 2, "number_of_data_nodes": 2, "active_primary_shards": 3, "active_shards": 6, "relocating_shards": 0, "initializing_shards": 0, "unassigned_shards": 0 } 

 

表明我們的集群不僅是功能完備的,而且是高可用的。

五、橫向擴展

我們啟動第三個節點。我們的集群將會重新組織自己

Node3包含了來自Node1和Node2的一個分片,這樣每個節點就有兩個分片,和之前相比少了一個,這意味着每個節點上的分片將獲得更多的硬件資源。分片本身就是一個完整的搜索引擎,他可以使用單一節點的所有資源,我們擁有6個分片3主3副最多可以擴展到6個節點,每個節點有一個分片,每個分片可以100%使用這個節點的資源。

六。繼續擴展

PUT /blogs/_settings
{
   "number_of_replicas" : 2 }

如果我們要擴展到6個以上的節點,我們可以將復制分片的數量增加以增加節點。

七、應對故障

如果我們殺掉一個節點的進程

我們殺掉的是一個主節點,一個集群必須有一個主節點才能使其功能正常,所以集群做的第一件事就是各節點選舉了一個新的主節點。

主分片1和2在我們殺掉node1時已經丟失,我們的索引在丟失主分片時不能正常工作,如果我們檢查集群健康,將看到狀態red,不是所有主節點都可用。

新主節點會將node2和node3上的復制分片升級為主分片,這是集群回到yellow狀態。

為什么是yellow而不是green?

我們有三個主分片,但是我們指定每個主分片對應兩個復制分片,當前卻只有一個復制分片被分配,因此無法達到green。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM