1、路由
如圖所示:當我們想乙個集群儲存文件時,文件該儲存到哪個節點呢? 是隨機嗎? 是輪詢嗎?
在elasticsearch中,會採用計算的方式來確定儲存到哪個節點,計算公式如下:
shard = hash(routing) % number_of_primary_shards
這就是為什麼建立了主分片後,不能修改的原因。
2、文件的寫操作
新建、索引和刪除請求都是寫(write)操作,它們必須在主分片上成功完成才能複製到相關的複製分片上。
1、客戶端給 node 1 傳送新建、索引或刪除請求。
2、節點使用文件的 _id 確定文件屬於分片 0 。它**請求到 node 3 ,分片 0 位於這個節點上。0
3、node 3 在主分片上執行請求,如果成功,它**請求到相應的位於 node 1 和 node 2 的複製節點上。當所有的複製節點報告成功, node 3 報告成功到請求的節點,請求的節點再報告給客戶端。
客戶端接收到成功響應的時候,文件的修改已經被應用於主分片和所有的複製分片。你的修改生效了
3、搜尋文件(單個文件)
文件能夠從主分片或任意乙個複製分片被檢索。
1. 客戶端給 node 1 傳送get請求。
2. 節點使用文件的 _id 確定文件屬於分片 0 。分片 0 對應的複製分片在三個節點上都有。此時,它**請求到 node 2 。
3. node 2 返回文件(document)給 node 1 然後返回給客戶端。
對於讀請求,為了平衡負載,請求節點會為每個請求選擇不同的分片——它會迴圈所有分片副本。
可能的情況是,乙個被索引的文件已經存在於主分片上卻還沒來得及同步到複製分片上。這時複製分片會報告文件未找到,主分片會成功返回文件。一旦索引請求成功返回給使用者,文件則在主分片和複製分片都是可用的
4、全文搜尋
對於全文搜尋而言,文件可能分散在各個節點上,那麼在分布式的情況下,如何搜尋文件呢?
搜尋,分為2個階段,搜尋(query)+取回(fetch)。
查詢階段包含以下三步:
1. 客戶端傳送乙個 search(搜尋) 請求給 node 3 , node 3 建立了乙個長度為 from+size 的空優先順序隊
2. node 3 **這個搜尋請求到索引中每個分片的原本或副本。每個分片在本地執行這個查詢並且結果將結果到乙個大小為 from+size 的有序本地優先佇列裡去。
3. 每個分片返回document的id和它優先佇列裡的所有document的排序值給協調節點 node 3 。 node 3 把這些值合併到自己的優先佇列裡產生全域性排序結果。
分發階段由以下步驟構成:
1. 協調節點辨別出哪個document需要取回,並且向相關分片發出 get 請求。
2. 每個分片載入document並且根據需要豐富(enrich)它們,然後再將document返回協調節點。
3. 一旦所有的document都被取回,協調節點會將結果返回給客戶端。
構建elasticsearch集群
初始化系統環境 在 etc security limits.conf 增加如下兩行 elasticsearch soft nofile 4096 elasticsearch hard nofile 65536 curl o elasticsearch 解壓軟體包 tar xvf elasticsea...
Elasticsearch集群搭建
1 主節點 儲存資料資訊 meta data 元資料 描述資料的資料,客戶端通過主節點獲取真正的資料位置,到資料節點datanode獲取資料分片 2 資料節點 只負責資料的讀和寫 3 負載均衡節點 當主節點連線的客戶端過多,可以引入負載均衡節點 分擔併發,既不是主節點,也不是資料節點 搭建另外兩台e...
Elasticsearch集群搭建
1 分發 scp 2.修改每一台機器的配置檔案 a 集群的名字 cluster.name my es b 節點名字 node.name node 1 c es儲存資料的路徑 path.data home zpark esdata data d es生成log資訊的路徑 path.logs home ...