2013-12-16 40 views
7

很抱歉這麼說,但ES的文檔(http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/index.html)讓我感到困惑。瞭解彈性搜索

由於詞彙我明白了數據庫,表和行的條件,但我已閱讀文檔的實質部分,我無法找到答案:

僅供參考我第一次讀到這些鏈接:

如果文檔中存在的信息。然後我會很感激,如果你能指出我朝它。

編輯:

我也不能確定自動發現如何工作的分佈式網絡上。如果對每個公共網絡進行ping測試,那麼它如何連接到可能位於世界另一端的正確網絡?

+3

這個答案去一個公平的方式:http://stackoverflow.com/questions/15694724/shards-and-replicas-in-elasticsearch – Sammaye

回答

13

請在下方查看您的觀點答案。

你沒有「有」,但你可能應該特別是將要在生產中。默認值是五個分片和一個複製。

定義的複製次數只是整個索引在整個elasticsearch集羣中的所有節點上覆制的次數。把它看作是RDBMS數據庫的多個讀取副本(但在這種情況下,我們讀取和寫入所有副本)。

分片是我拆分或碎片索引的次數。所以,我可以使用單個分片索引,或者我可以使用多個分片索引。這在概念上與通過主鍵對RDBMS數據庫進行分片相似,但不完全相同。

因此,索引中您將擁有的碎片總數是number_of_shards和number_of_replicas的乘積。

當您執行搜索時,elasticsearch會將您的搜索分佈到索引中包含碎片的所有可能節點,併爲您彙總結果。您可以將此視爲地圖/縮小,其中地圖將搜索發送到每個分片,並且縮小正在收集結果。

此外,您可以隨時更改複製number_of_replicas,但永遠不能更改number_of_shards。這必須在創建索引時設置。

  • 我怎樣才能擁有2個副本的3個碎片?考慮到shard是「是一個單獨的Lucene實例」,如果術語表是不可能的,那麼這不應該是不可能的?

我覺得上面大多回答這一點,但要記住,elasticsearch主要是一種分佈式計算解決方案來搜索是很重要的。我們將工作分解爲多個碎片和可能的機器。

  • 如果我增加更多的節點後,我怎樣才能改變這些值跨越新的節點?

集羣一旦意識到集羣中的其他節點,是由你需要任何其他操作。這些設置會自行傳播到整個集羣中。在上面的三個分片和兩個副本的例子中,如果您最初有兩個節點並添加了第三個節點,則每個節點平均每個節點將有兩個分片,這個分片移動不需要您的干預(同樣,假設羣集知道新節點)

  • 分割在ES中如何工作?

見上面

  • 如何副本集在ES工作?

見上面

您不必「主動」「管理」它。如前所述,分片和您在創建索引時定義的所有內容都會傳播到羣集中的新節點。

您定義副本和碎片像這樣:

{ 
    "settings": { 
     "index": { 
      "number_of_shards": 20, 
      "number_of_replicas": 1 
     } 
    }, 
    "mappings": { 
     "some_type": { 
      "properties": { 
       "some_field": { 
        "type": "long" 
       } 
      } 
     } 
    } 
} 
  • 如何管理副本集?即如何添加複製品,宣傳初選等?

你做到這一點通過更新索引API,在這種特定情況下,文檔上有網站在這裏找到:

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-update-settings.html

我只注意到你的編輯,請參閱以下內容:

  • 我也不確定自動發現如何在分佈式網絡上工作。

在YML配置文件設置單播這樣的:

discovery.zen.ping.multicast.enabled: false 
#discovery.zen.minimum_master_nodes: 3 
discovery.zen.ping.unicast.hosts: ["ip.add.r.ess", "ip.add.r.ess"] 

中間設置是一個重要的設置,但我評論它在這裏。該數字應始終爲(主節點/ 2)+1的數量。這是爲了避免腦裂情況。通常,我將所有節點設置爲符合條件。

這些設置用於單播,這是我認爲你要爲你的問題而不是多播。

+1

所以,如果我理解你是正確的一個分片不是一個副本它是數據,一個id的範圍(在這方面類似於SQL和MongoDB),但主分片不能再次分裂,這意味着如果我想分發我的進一步閱讀我必須重新創建。你會得到所有設置的詳細答案投票,謝謝:) – Sammaye

6

總之,一個索引被分解成碎片。可以複製碎片,這意味着同一碎片的多個副本可以存在於同一個集羣中。所以如果一個索引有3個碎片和2個副本,這意味着你總共有9個碎片,其中6個是三個主碎片的副本。

ES將嘗試在整個羣集中平衡碎片及其副本,以便如果某個節點停機,它可以從該節點上的主碎片故障切換到副本。這可能會讓一些人感到困惑:彈性搜索中的主人指的是碎片,而不是實際的節點。因此,單個節點可以混合使用副本和主分片。

如果你來自lucene世界,lucene索引與彈性搜索索引不同。彈性搜索索引是具有類型,映射和文檔的索引文檔的邏輯組。或多或少與數據庫模式相同。另一方面,lucene索引是一組包含索引數據的文件。當彈性搜索創建索引時,它所做的是創建多個lucene索引(每個字段和分片一個索引),並且在複製時,它基本上是複製這些lucene索引的文件。

您不能更改索引的碎片數量,但可以更改副本數量。通常,當你需要更多的分片時,你需要創建一個新的索引並重新索引數據。

在分片管理方面,除了決定分片的數量之外,默認情況下沒有太多要管理的東西,而且ES本身就很好地協調了事情。一旦你獲得了更好的一點,你可以擺弄很多選項瞭解它是如何工作的。大多數情況下,默認值都可以。就集羣管理而言,您可以通過API以受控方式關閉節點,使用索引別名,更改副本數量等方式進行很多操作。

對於自動搜索,ES使用本地網絡多播默認。您可以切換到單播,並且您可能想要更改默認羣集名稱以防止發生意外(在形成意外羣集的情況下,在咖啡座中有一些樂趣)。你可能不想全局集羣。我看不到結局。

+0

是的,你的第二段是讓我困惑的一點,我想到像MongoDB這樣的物理機器,有點無賴,如果我得到一個嚴重的高峯,我必須改革索引進一步分配我的閱讀。是的,集羣名稱和廣播的問題也是我的想法。 +1 – Sammaye

+0

您可以使用別名來減輕固定數量的碎片/索引問題。這允許您在查詢時查詢一組索引作爲一個索引。例如,logstash使用它來每天/每週/每月創建新的索引(和分片)。這爲您提供了橫向可伸縮性,並且有一些人在數百個節點上以PB級來使用它。聚類不是一個問題,而是更豐富的選擇。默認情況下,僅在專用網絡中提供方便的行爲,但如果您不喜歡,則可以對其進行不同的配置。 –

1

這是一個非常事件,您的問題約80%由吉文的Banon(ElastiSearch的創世)給出的視頻演示的回答。雖然這個演示文稿比其他任何地方都多。希望這可以幫助。

http://www.infoq.com/presentations/ElasticSearch 

此視頻是有點低的分辨率,所以如果你想在演示文稿中所示的代碼遵循這一

https://github.com/kimchy/talks/tree/master/2011/wsnparis