系列目錄
內存吞金獸(Elasticsearch)的那些事兒 -- 認識一下
內存吞金獸(Elasticsearch)的那些事兒 -- 數據結構及巧妙算法
內存吞金獸(Elasticsearch)的那些事兒 -- 架構&三高保證
內存吞金獸(Elasticsearch)的那些事兒 -- 寫入&檢索原理
內存吞金獸(Elasticsearch)的那些事兒 -- 常見問題痛點及解決方案
架構圖
Gateway
代表ElasticSearch索引的持久化存儲方式。
在Gateway中,ElasticSearch默認先把索引存儲在內存中,然后當內存滿的時候,再持久化到Gateway里。當ES集群關閉或重啟的時候,它就會從Gateway里去讀取索引數據。比如LocalFileSystem和HDFS、AS3等。
DistributedLucene Directory
是Lucene里的一些列索引文件組成的目錄。它負責管理這些索引文件。包括數據的讀取、寫入,以及索引的添加和合並等。
River
代表是數據源。是以插件的形式存在於ElasticSearch中。
Mapping
映射的意思,非常類似於靜態語言中的數據類型。比如我們聲明一個int類型的變量,那以后這個變量只能存儲int類型的數據。
eg:比如我們聲明一個double類型的mapping字段,則只能存儲double類型的數據。
Mapping不僅是告訴ElasticSearch,哪個字段是哪種類型。還能告訴ElasticSearch如何來索引數據,以及數據是否被索引到等。
Search Moudle
搜索模塊
Index Moudle
索引模塊
Disvcovery
主要是負責集群的master節點發現。比如某個節點突然離開或進來的情況,進行一個分片重新分片等。
(Zen)發現機制默認的實現方式是單播和多播的形式,同時也支持點對點的實現。以插件的形式存在EC2。
一個基於p2p的系統,它先通過廣播尋找存在的節點,再通過多播協議來進行節點之間的通信,同時也支持點對點的交互。
Scripting
腳本語言。包括很多。如mvel、js、python等。
定制化功能非常便捷,但有性能問題
Transport
代表ElasticSearch內部節點,代表跟集群的客戶端交互。包括 Thrift、Memcached、Http等協議
RESTful Style API
通過RESTful方式來實現API編程。
3rd plugins
第三方插件,(想象一下idea或vscode的插件
Java(Netty)
開發框架。其內部使用netty實現
JMX
監控
部署節點
- master
- index node(也是coordinating node
- coordinating node
三高保證
- 一個es集群會有多個es節點
- 在眾多的節點中,其中會有一個
Master Node
,主要負責維護索引元數據、負責切換主分片和副本分片身份等工作,如果主節點掛了,會選舉出一個新的主節點
- 如果某個節點掛了,
Master Node
就會把對應的副本分片提拔為主分片,這樣即便節點掛了,數據就不會丟。
- 如果某個節點掛了,
- es最外層的是Index(相當於數據庫 表的概念);一個Index的數據我們可以分發到不同的Node上進行存儲,這個操作就叫做分片。
- 比如現在我集群里邊有4個節點,我現在有一個Index,想將這個Index在4個節點上存儲,那我們可以設置為4個分片。這4個分片的數據合起來就是Index的數據
- 分片會有主分片和副本分片之分(防止某個節點宕機,保證高可用)
-
Index需要分為多少個分片和副本分片都是可以通過配置設置的
為什么需要分片?
- 如果一個Index的數據量太大,只有一個分片,那只會在一個節點上存儲,隨着數據量的增長,一個節點未必能把一個Index存儲下來。
- 多個分片,在寫入或查詢的時候就可以並行操作(從各個節點中讀寫數據,提高吞吐量)
分詞器:
在分詞前我們要先明確字段是否需要分詞,不需要分詞的字段將type設置為keyword,可以節省空間和提高寫性能。
1)es的內置分詞器
常用的三種分詞:Standard Analyzer
、Simple Analyzer
、whitespace Analyzer
standard 是默認的分析器,英文會按照空格切分,同時大寫轉小寫,中文會按照每個詞切分
simple 先按照空格分詞,英文大寫轉小寫,不是英文不再分詞
Whitespace Analyzer 先按照空格分詞,不是英文不再分詞,英文不再轉小寫
2)第三方分詞器
es內置很多分詞器,但是對中文分詞並不友好,例如使用standard分詞器對一句中文話進行分詞,會分成一個字一個字的。這時可以使用第三方的Analyzer插件,分別是HanLP,IK,Pinyin分詞器三種;
- HanLP-面向生產環境的自然語言處理工具包,支持有多重分詞配置
兩個官網分詞例子測試效果,分詞效果較內置的分詞有很大明顯,可以支持中文的詞語分詞;
- IK分詞器:
可以根據粒度拆分
ik_smart
: 會做最粗粒度的拆分
ik_max_word
: 會將文本做最細粒度的拆分
如果是最細粒度,我是中國人,會被分詞為我,是,中國人,中國,國人,相對於Hanlp的分詞更加准確和多樣;
- PinYin
會對特定的信息進行分詞,對用戶搜索有更好的體驗,該分詞會對漢字的首字母進行分詞,例如劉德華,會被分詞為ldh,張學友,會被分詞為zxy,用戶根據拼音首字母就可以搜索出對應的特定信息。