本文目錄
一趁窃、Elasticsearch 基本術(shù)語
1.1 文檔(Document)、索引(Index)绿鸣、類型(Type)文檔三要素
1.2 集群(Cluster)肥橙、節(jié)點(diǎn)(Node)、分片(Shard)分布式三要素
二鹃骂、Elasticsearch 工作原理
2.1 文檔存儲(chǔ)的路由
2.2 如何健康檢查
2.3 如何水平擴(kuò)容
三台盯、小結(jié)
一、Elasticsearch 基本術(shù)語
1.1 文檔(Document)偎漫、索引(Index)爷恳、類型(Type)文檔三要素
文檔(Document)
文檔,在面向?qū)ο笥^念就是一個(gè)對(duì)象象踊。在 ES 里面温亲,是一個(gè)大 JSON 對(duì)象,是指定了唯一 ID 的最底層或者根對(duì)象杯矩。文檔的位置由 _index栈虚、_type 和 _id 唯一標(biāo)識(shí)。
索引(Index)
索引史隆,用于區(qū)分文檔成組魂务,即分到一組的文檔集合。索引泌射,用于存儲(chǔ)文檔和使文檔可被搜索粘姜。比如項(xiàng)目存索引 project 里面,交易存索引?sales 等熔酷。
類型(Type)
類型孤紧,用于區(qū)分索引中的文檔,即在索引中對(duì)數(shù)據(jù)邏輯分區(qū)拒秘。比如索引?project 的項(xiàng)目數(shù)據(jù)号显,根據(jù)項(xiàng)目類型 ui 項(xiàng)目臭猜、插畫項(xiàng)目等進(jìn)行區(qū)分。
和關(guān)系型數(shù)據(jù)庫 MySQL 做個(gè)類比:
Document 類似于 Record
Type?類似于 Table
Index?類似于 Database
1.2 集群(Cluster)押蚤、節(jié)點(diǎn)(Node)蔑歌、分片(Shard)分布式三要素
集群(Cluster)
服務(wù)器集群大家都知道,這里 ES 也是類似的揽碘。多個(gè) ElasticSearch 運(yùn)行實(shí)例(節(jié)點(diǎn))組合的組合體是 ElasticSearch 集群次屠。
ElasticSearch 是天然的分布式,通過水平擴(kuò)容為集群添加更多節(jié)點(diǎn)钾菊。
集群是去中心化的帅矗,有一個(gè)主節(jié)點(diǎn)(Master)。主節(jié)點(diǎn)是動(dòng)態(tài)選舉煞烫,因此不會(huì)出現(xiàn)單點(diǎn)故障浑此。
那分片和節(jié)點(diǎn)的配置呢?
節(jié)點(diǎn)(Node)
一個(gè)?ElasticSearch 運(yùn)行實(shí)例就是節(jié)點(diǎn)滞详。順著集群來凛俱,任何節(jié)點(diǎn)都可以被選舉成為主節(jié)點(diǎn)。主節(jié)點(diǎn)負(fù)責(zé)集群內(nèi)所以變更料饥,比如索引的增加蒲犬、刪除等。所以集群不會(huì)因?yàn)橹鞴?jié)點(diǎn)流量的增大成為瓶頸岸啡。因?yàn)槿魏喂?jié)點(diǎn)都會(huì)成為主節(jié)點(diǎn)原叮。
下面有 3 個(gè)節(jié)點(diǎn),第 1 個(gè)節(jié)點(diǎn)有:2 個(gè)主分片和 1 個(gè)副分片巡蘸。如圖:
那么奋隶,只有一個(gè)節(jié)點(diǎn)的 ElasticSearch 服務(wù)會(huì)存在瓶頸。如圖:
分片(Shard)
分片悦荒,是 ES 節(jié)點(diǎn)中最小的工作單元唯欣。分片僅僅保存全部數(shù)據(jù)的一部分,分片的集合是 ES 的索引搬味。分片包括主分片和副分片境氢,主分片是副分片的拷貝。主分片和副分片地工作基本沒有大的區(qū)別碰纬。
在索引中全文搜索萍聊,然后會(huì)查詢到每個(gè)分片,將每個(gè)分配的結(jié)果進(jìn)行全局地收集處理悦析,并返回寿桨。
二、Elasticsearch 工作原理
2.1 文檔存儲(chǔ)的路由
當(dāng)索引到一個(gè)文檔(如:報(bào)價(jià)系統(tǒng))她按,具體的文檔數(shù)據(jù)(如:報(bào)價(jià)數(shù)據(jù))會(huì)存儲(chǔ)到一個(gè)分片牛隅。具體文檔數(shù)據(jù)會(huì)被切分,并分別存儲(chǔ)在分片 1 或者 分片 2 …
那么如何確定存在哪個(gè)分片呢?
存儲(chǔ)路由過程由下面地公式?jīng)Q定:
shard= hash(routing) % number_of_primary_shards
routing 是可變值酌泰,支持自定義媒佣,默認(rèn)文檔 _id。
hash 函數(shù)生成數(shù)字陵刹,經(jīng)過取余算法得到余數(shù)默伍,那么這個(gè)余數(shù)就是分片的位置。
這是不是有點(diǎn)負(fù)載均衡的類似衰琐。
2.2 如何健康檢查
集群名也糊,集群的健康狀態(tài)
GEThttp://127.0.0.1:9200/_cluster/stats{"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}
status 字段是需要我們關(guān)心的。狀態(tài)可能是下列三個(gè)值之一:
green所有的主分片和副本分片都已分配羡宙。你的集群是100% 可用的狸剃。yellow所有的主分片已經(jīng)分片了,但至少還有一個(gè)副本是缺失的狗热。不會(huì)有數(shù)據(jù)丟失钞馁,所以搜索結(jié)果依然是完整的。高可用會(huì)弱化把 yellow 想象成一個(gè)需要及時(shí)調(diào)查的警告匿刮。red至少一個(gè)主分片(以及它的全部副本)都在缺失中僧凰。這意味著你在缺少數(shù)據(jù):搜索只能返回部分?jǐn)?shù)據(jù),而分配到這個(gè)分片上的寫入請(qǐng)求會(huì)返回一個(gè)異常熟丸。
active_primary_shards 集群中的主分片數(shù)量
active_shards 所有分片的匯總值
relocating_shards 顯示當(dāng)前正在從一個(gè)節(jié)點(diǎn)遷往其他節(jié)點(diǎn)的分片的數(shù)量训措。通常來說應(yīng)該是 0,不過在 Elasticsearch 發(fā)現(xiàn)集群不太均衡時(shí)光羞,該值會(huì)上漲绩鸣。比如說:添加了一個(gè)新節(jié)點(diǎn),或者下線了一個(gè)節(jié)點(diǎn)狞山。
initializing_shards 剛剛創(chuàng)建的分片的個(gè)數(shù)全闷。
unassigned_shards 已經(jīng)在集群狀態(tài)中存在的分片。
2.3 如何水平擴(kuò)容
主分片在索引創(chuàng)建已經(jīng)確定萍启。讀操作可以同時(shí)被主分片和副分片處理总珠。因此,更多的分片勘纯,會(huì)擁有更高的吞吐量局服。自然,需要增加更多的硬件資源支持吞吐量驳遵。
說明淫奔,這里無法提高性能,因?yàn)槊總€(gè)分片獲得的資源會(huì)變少堤结。
動(dòng)態(tài)調(diào)整副本分片數(shù)唆迁,按需伸縮集群鸭丛,比如把副本數(shù)默認(rèn)值為 1 增加到 2:
PUT /blogs/_settings{"number_of_replicas":2}
三、小結(jié)
簡單初探了下?ElasticSearch 的相關(guān)內(nèi)容唐责。后面會(huì)主要落地到實(shí)戰(zhàn)鳞溉,關(guān)于? spring-data-elasticsearch 這塊的實(shí)戰(zhàn)。
最后鼠哥,《 深入淺出 spring-data-elasticsearch 》小連載目錄如下:
深入淺出 spring-data-elasticsearch - ElasticSearch 架構(gòu)初探(一)
深入淺出 spring-data-elasticsearch - 概述(二)
深入淺出?spring-data-elasticsearch - 基本案例詳解(三)
深入淺出?spring-data-elasticsearch - 復(fù)雜案例詳解(四)
深入淺出?spring-data-elasticsearch - 架構(gòu)原理以及源碼淺析(五)
資料:
官方《Elasticsearch: 權(quán)威指南》
https://www.elastic.co/guide/c ... .html
本文作者: 泥瓦匠
版權(quán)歸作者所有熟菲,轉(zhuǎn)載請(qǐng)注明出處