Elasticsearch介绍
目錄:
- Elasticsearch介紹
- es功能
- es特點
- elasticsearch基本概念
- 概念說明
- 索引(Index)[數據庫]
- 類型(Type)[表]
- 文檔(Document)
- 節點(Node)
- 分片(Shard)
- 主分片 與 副分片
- elasticsearch增刪改查原理
- 增加原理
- 刪除(Delete)文檔
- 更新(Update)
- 讀操作(Read):查詢過程
Elasticsearch介紹
什么是 Elasticsearch ?
- 使用 java 語言開發的一套開源的全文搜索引擎,建立在全文搜索引擎 Apache Lucene(TM)基礎上的搜索引擎
- 用于搜索、日志管理、安全分析、指標分析、業務分析、應用性能監控等多個領域
- 底層基于 Lucene 開源庫開發,提供 restAPI,可以被任何語言調用
- 支持分布式部署,可水平擴展
- 更新迭代快、社區活躍、文檔豐富
es功能
es特點
elasticsearch基本概念
概念說明
索引(Index)[數據庫]
1. ES將數據存儲于一個或多個索引中,索引是具有類似特性的文檔的集合。
2. 類比傳統的關系型數據庫領域來說,索引相當于SQL中的一個數據庫,或者一個數據存儲方案(schema)。
3. 索引由其名稱(必須為全小寫字符)進行標識,并通過引用此名稱完成文檔的創建、搜索、更新及刪除操作。
4. 一個ES集群中可以按需創建任意數目的索引。
類型(Type)[表]
1. 類型是索引內部的邏輯分區(category/partition),然而其意義完全取決于用戶需求。
2. 因此,一個索引內部可定義一個或多個類型(type)。
3. 一般來說,類型就是為那些擁有相同的域的文檔做的預定義。
4. 例如,在索引中,可以定義一個用于存儲用戶數據的類型,一個存儲日志數據的類型,以及一個存儲評論數據的類型。
5. 類比傳統的關系型數據庫領域來說,類型相當于“表”。
文檔(Document)
1. 文檔是索引和搜索的原子單位,它是包含了一個或多個域(Field)的容器,基于JSON格式進行表示。
2. 文檔由一個或多個域組成,每個域擁有一個名字及一個或多個值,有多個值的域通常稱為“多值域”。
3. 每個文檔可以存儲不同的域集,但同一類型下的文檔至應該有某種程度上的相似之處。
節點(Node)
1. 一個運行中的 Elasticsearch 實例稱為一個節點
2. 而集群是由一個或者多個擁有相同cluster.name配置的節點組成, 它們共同承擔數據和負載的壓力。
3. ES集群中的節點有三種不同的類型:
1)主節點:負責管理集群范圍內的所有變更,例如增加、刪除索引,或者增加、刪除節點等。 主節點并不需要涉及到文檔級別的變更和搜索等操作。可以通過屬性node.master進行設置
2)數據節點:存儲數據和其對應的倒排索引,默認每一個節點都是數據節點(包括主節點),可以通過node.data屬性進行設置
3)協調節點:如果node.master和node.data屬性均為false,則此節點稱為協調節點,用來響應客戶請求,均衡每個節點的負載
分片(Shard)
1. 一個索引中的數據保存在多個分片中,相當于水平分表。
2. 一個分片便是一個Lucene 的實例,它本身就是一個完整的搜索引擎。
3. 我們的文檔被存儲和索引到分片內,但是應用程序是直接與索引而不是與分片進行交互。
4. ES實際上就是利用分片來實現分布式。
5. 分片是數據的容器,文檔保存在分片內,分片又被分配到集群內的各個節點里。
6. 當你的集群規模擴大或者縮小時, ES會自動的在各節點中遷移分片,使得數據仍然均勻分布在集群里。
主分片 與 副分片
1)索引內任意一個文檔都歸屬于一個主分片,所以主分片的數目決定著索引能夠保存的最大數據量。
2)一個副本分片只是一個主分片的拷貝。
3)副本分片作為硬件故障時保護數據不丟失的冗余備份,并為搜索和返回文檔等讀操作提供服務。
elasticsearch增刪改查原理
增加原理
1. 當用戶向一個節點提交了一個索引新文檔的請求,節點會計算新文檔應該加入到哪個分片(shard)中。
2. 每個節點都存儲有每個分片存儲在哪個節點的信息,因此協調節點會將請求發送給對應的節點。
3. 注意這個請求會發送給主分片,等主分片完成索引,會并行將請求發送到其所有副本分片,保證每個分片都持有最新數據。
4. 每次寫入新文檔時,都會先寫入內存中,并將這一操作寫入一個translog文件(transaction log)中,此時如果執行搜索操作,這個新文檔還不能被索引到。
5. ES會每隔1秒時間(這個時間可以修改)進行一次刷新操作(refresh)
6. 此時在這1秒時間內寫入內存的新文檔都會被寫入一個文件系統緩存(filesystem cache)中,并構成一個分段(segment)。
7. 此時這個segment里的文檔可以被搜索到,但是尚未寫入硬盤,即如果此時發生斷電,則這些文檔可能會丟失。
8.不斷有新的文檔寫入,則這一過程將不斷重復執行。每隔一秒將生成一個新的segment,而translog文件將越來越大。
9.不斷有新的文檔寫入,則這一過程將不斷重復執行。每隔一秒將生成一個新的segment,而translog文件將越來越大。
說明:
1)由上面的流程可以看出,在兩次fsync操作之間,存儲在內存和文件系統緩存中的文檔是不安全的,一旦出現斷電這些文檔就會丟失。
2)所以ES引入了translog來記錄兩次fsync之間所有的操作,這樣機器從故障中恢復或者重新啟動,ES便可以根據translog進行還原。
刪除(Delete)文檔
1. ES的索引是不能修改的,因此更新和刪除操作并不是直接在原索引上直接執行。
2. 每一個磁盤上的segment都會維護一個del文件,用來記錄被刪除的文件。
3. 每當用戶提出一個刪除請求,文檔并沒有被真正刪除,索引也沒有發生改變,而是在del文件中標記該文檔已被刪除。
4. 因此,被刪除的文檔依然可以被檢索到,只是在返回檢索結果時被過濾掉了。
5. 每次在啟動segment合并工作時,那些被標記為刪除的文檔才會被真正刪除。
更新(Update)
1. 更新文檔會首先查找原文檔,得到該文檔的版本號。
2. 然后將修改后的文檔寫入內存,此過程與寫入一個新文檔相同。
3. 同時,舊版本文檔被標記為刪除,同理,該文檔可以被搜索到,只是最終被過濾掉。
讀操作(Read):查詢過程
1. 查詢的過程大體上分為查詢(query)和取回(fetch)兩個階段。
2. 這個節點的任務是廣播查詢請求到所有相關分片,并將它們的響應整合成全局排序后的結果集合,這個結果集合會返回給客戶端。
3. 查詢階段
1)當一個節點接收到一個搜索請求,則這個節點就變成了協調節點。
2)第一步是廣播請求到索引中每一個節點的分片拷貝。
3)協調節點會將所有分片的結果匯總,并進行全局排序,得到最終的查詢排序結果。
4. 取回階段
1)查詢過程得到的是一個排序結果,標記出哪些文檔是符合搜索要求的,此時仍然需要獲取這些文檔返回客戶端。
2)協調節點會確定實際需要返回的文檔,并向含有該文檔的分片發送get請求;
3)分片獲取文檔返回給協調節點;協調節點將結果返回給客戶端。
總結
以上是生活随笔為你收集整理的Elasticsearch介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django生命周期与中间件
- 下一篇: Tornado介绍