索引
-
索引是文檔的容器,是一類文檔的集合
- index 體現(xiàn)了邏輯空間的概念: 每個索引都有自己的Mapping定義蜘拉,用于定義包含的文檔的字段名和字段類型。
- Shard 體現(xiàn)了物理空間的概念:索引中的數(shù)據(jù)分散在Shard上谎脯。
-
索引這個詞在 ElasticSearch 會有三種意思:
-
索引(名詞)
類比傳統(tǒng)的關(guān)系型數(shù)據(jù)庫領(lǐng)域來說持寄,索引相當(dāng)于SQL中的一個數(shù)據(jù)庫(Database)娱俺。索引由其名稱(必須為全小寫字符)進行標識废麻。 -
索引(動詞)
保存一個文檔到索引(名詞)的過程脑溢。這非常類似于SQL語句中的 INSERT關(guān)鍵詞屑彻。如果該文檔已存在時那就相當(dāng)于數(shù)據(jù)庫的UPDATE顶吮。 -
倒排索引
關(guān)系型數(shù)據(jù)庫通過增加一個B+樹索引到指定的列上悴了,以便提升數(shù)據(jù)檢索速度湃交。索引ElasticSearch 使用了一個叫做倒排索引
的結(jié)構(gòu)來達到相同的目的搞莺。
-
索引(名詞)
-
與關(guān)系型數(shù)據(jù)庫的類比
Type
Type
可以理解成關(guān)系數(shù)據(jù)庫中Table。
之前的版本中迈喉,索引和文檔中間還有個類型的概念温圆,每個索引下可以建立多個類型岁歉,文檔存儲時需要指定index和type。從6.0.0開始單個索引中只能有一個類型澈圈,7.0.0以后將將不建議使用帆啃,8.0.0 以后完全不支持瞬女。
棄用該概念的原因:
- 我們雖然可以通俗的去理解Index比作 SQL 的 Database努潘,Type比作SQL的Table诽偷。但這并不準確坤学,因為如果在SQL中,Table 之前相互獨立报慕,同名的字段在兩個表中毫無關(guān)系深浮。但是在ES中眠冈,同一個Index 下不同的 Type 如果有同名的字段飞苇,他們會被 Luecence 當(dāng)作同一個字段 ,并且他們的定義必須相同蜗顽。所以我覺得Index現(xiàn)在更像一個表布卡,而Type字段并沒有多少意義雇盖。
- 目前Type已經(jīng)被Deprecated崔挖,在7.0開始贸街,一個索引只能建一個Type為
_doc
。
文檔(Document)
- Index 里面單條的記錄稱為Document(文檔)脓鹃。等同于關(guān)系型數(shù)據(jù)庫表中的行。
- Elasticsearch 是面向文檔的冷溶,文檔是所有可搜索數(shù)據(jù)的最小單位尊浓。
- 一部電影的具體信息/一張唱片的詳細信息
- 文檔會被序列化JSON格式逞频,保存在Elasticsearch中
- JSON對象由字段組成
- 每個字段都有對應(yīng)的字段類型 (字符串/數(shù)值/布爾/日期/二進制/范圍類型)
- 每個文檔都有一個Unique ID
- 你可以自己指定ID
- 或者通過Elasticsearch自動生成
-
文檔的源數(shù)據(jù)
#源數(shù)據(jù)用于標注文檔的相關(guān)信息
#_index 文檔所屬的索引名
#_type 文檔所屬的類別名
#_id 文檔的唯一id
#_source 文檔的原始Json數(shù)據(jù)
#_version 文檔的版本信息
#_seq_no 嚴格遞增的順序號,每個文檔一個栋齿,Shard級別嚴格遞增苗胀,保證后寫入的Doc的_seq_no大于先寫入的Doc的_seq_no
#primary_term primary_term也和_seq_no一樣是一個整數(shù),每當(dāng)Primary Shard發(fā)生重新分配時瓦堵,比如重啟基协,Primary選舉等,_primary_term會遞增1
#found 查詢的ID正確那么ture, 如果 Id 不正確菇用,就查不到數(shù)據(jù)澜驮,found字段就是false。
節(jié)點
- 節(jié)點是一個Elasticsearch的實例
- 本質(zhì)上就是一個JAVA進程惋鸥。
- 一臺機器可以運行多個Elasticsearch進程杂穷,但是生產(chǎn)環(huán)境一般建議還是一臺機器運行一個Elasticsearch實例悍缠。
- 每個節(jié)點都有名字,通過配置文件配置耐量,或者啟動的時候 -E node.name=node1 指定
- 每個節(jié)點在啟動之后飞蚓,會分配一個UID,保存在data目錄下
Master-eligible 節(jié)點 和 Master 節(jié)點
- 每個節(jié)點啟動后廊蜒,默認就是一個Master eligible 節(jié)點
- Master-eligible節(jié)點可以參加選主流程趴拧,成為Master節(jié)點
- 當(dāng)?shù)谝粋€節(jié)點啟動的時候,它會將自己選舉成Master節(jié)點
- 每個節(jié)點上都保存了集群的狀態(tài)山叮,但是只有Master節(jié)點才能修改集群的狀態(tài)信息
- 集群狀態(tài)(Cluster State)八堡,維護了一個集群中,必要的信息
所有的節(jié)點信息
聘芜、所有的索引和其相關(guān)的Mapping 與 Setting 信息
、分篇的路由信息
缝龄。
- 集群狀態(tài)(Cluster State)八堡,維護了一個集群中,必要的信息
Data 節(jié)點 和 Coordinating 節(jié)點
- Data 節(jié)點
- 可以保存數(shù)據(jù)的節(jié)點汰现,叫做Data Node。負責(zé)保存分片數(shù)據(jù)叔壤,在數(shù)據(jù)擴展上起到了至關(guān)重要的作用瞎饲。
- Coordinating 節(jié)點
- 負責(zé)接受Client的請求,將請求分發(fā)到合適的節(jié)點炼绘,最終把結(jié)果匯聚到一起嗅战。
- 每個節(jié)點默認都起到了Coordinating Node 的職責(zé)。
其他節(jié)點
- Hot & Warm 節(jié)點
- 不同硬件配置的Data Node俺亮,用來實現(xiàn)Hot & Warm 結(jié)構(gòu)驮捍,降低集群部署的成本。
- Machine Learning Node
- 負責(zé)跑機器學(xué)習(xí)的Job脚曾。
分片
- 主分片东且,用以解決數(shù)據(jù)水平擴展的問題,通過主分片本讥,可以將數(shù)據(jù)分布到集群的所有節(jié)點之上
- 一個分片是一個運行的Lucene的實例珊泳。
- 主分片在索引創(chuàng)建時指定,后續(xù)不允許修改拷沸,除非Reindex色查。
- 副本,用以解決數(shù)據(jù)高可用的問題撞芍,副本分片是主分片的拷貝
- 副本分片數(shù)秧了,可以動態(tài)調(diào)整。
- 增加副本數(shù)序无,還可以在一定程度上提高服務(wù)可用性(讀取的吞吐)示惊。
- 分片的設(shè)定
- 分片數(shù)設(shè)置過小
導(dǎo)致后續(xù)無法增加節(jié)點進行水平擴展好港。
導(dǎo)致分片的數(shù)據(jù)量太大,數(shù)據(jù)在重新分配時耗時米罚。 - 分片數(shù)設(shè)置過大
影響搜索結(jié)果的相關(guān)性打分钧汹,影響統(tǒng)計結(jié)果的準確性。
單個節(jié)點上過多的分片录择,會導(dǎo)致資源浪費拔莱,同時也會影響性能。