Elasticsearch 是一個可用於分布式以及符合RESTful 風格的搜索和數據分析引擎。—— Elastic Stack 官網
關於Elasticsearch的“愛恨情仇"
- 或許提起搜索服務器,大部分人都會想起Solr 和 Elasticsearch 甚至以及國產大廠自研等。隨着人工智能和大數據時代的到來,甚至還帶動了一系列的機器引擎的出現,譬如Splunk等。其中Solr 和 Elasticsearch是基於Lucene的搜索服務器。一般Solr是面向的是全文檢索引擎,而Elasticsearch是用於全文搜索、結構化搜索、分析。而對於Splunk機器數據的引擎,可收集、索引和利用所有應用程序、服務器和設備生成的快速移動型計算機數據。可是不論技術如何發展和更替,作為一位程序員,我們要做的不就是即時地維護技術儲備知識庫和實時更新自己的技術緩存,以及實現可擴展性的技術深度樹的增長。
- 關於Elasticsearch,記得當時接觸到Elasticsearch的名詞的時候,那是2017年的夏天。當時的工作任務是實現一個關於知識庫的系統。當時小伙伴們技術選型主要還是偏向Solr+Lucene來的做,有的甚至說直接使用Mysql數據庫的自帶函數來做。我是在無意中,在網上查詢搜索引擎的技術實戰的時候,看見了一篇對於Elasticsearch應用實戰的應用報告分析,才去查詢了Elasticsearch的相關資料。不過,當時網上大部分對於搜索功能的Demo,大部分還是關於Solr 的比較多。也許在那個時候,大部分的技術概念基本都是偏向於技術長期穩定和文檔資料全,使用程度相對較重的因素。但是,我個人卻留了一個心眼,自己嘗試去實戰Elasticsearch。
- 第一次,動手實操還是在Windows本機上安裝(22G內存)的。其中,安裝過程相比利用Tomcat+Solr來說,相對較復雜,而且對於本機的內存和功耗占用較重。個開發基本只能說是能運行起來,可穩定性方面,就有點顯得望而卻步的感覺。第二次,動手實戰是在本機搭建了一個虛擬機去實戰(2核8G),可在網絡通信方面,當時選的是網絡橋接方式,也讓我對此覺得很是麻煩。第三次,是自己擁有了自己的阿里雲服務器,在上面按照傳統部署方式(相對於Docker部署來說),可無奈個人服務器內存較低(2核4G),修改配置JVM等無法啟動成功,總是拋出GC日志什么的問題,主要還是當時囊中羞澀的問題,甚至一旦運行Elasticsearch服務,其它的應用便無法啟動和 運行。后來,接觸了Docker,於是,有了第四次的Elasticsearch實戰(單節點部署)。第四次,升級了阿里雲服務器的配置(2核8G),最終實現了額自己的第一個Elasticsearch服務。甚至,為在后來工作中,動手實戰Elasticsearch分布式集群服務奠定基礎。
基本概述
- 似乎從某種意義來說Elasticsearch和MongoDB/Redis/Memcache一樣,是一種Nosql數據庫。是一個接近實時的搜索平台,從索引這個文檔到這個文檔能夠被搜索到只有一個輕微的延遲,企業應用定位:采用Restful API標准的可擴展和高可用的實時數據分析的全文搜索工具。不過在當時,Elastic Stack只有Elasticsearch、Kibana 和 Logstash用例,還沒有包含Beats等。而且在應用方面,除了來當作ELK分布式日志系統搭建外,更多的是Elasticsearch +Elasticsearch-Head插件在滿足業務場景方面的需求,能夠安全可靠地獲取任何來源、任何格式的數據,然后實時地對數據進行搜索、分析和可視化等。
- 基本特點:
- 可拓展:支持一主多從且擴容簡易,只要cluster.name一致且在同一個網絡中就能自動加入當前集群;本身就是開源軟件,也支持很多開源的第三方插件
- 高可用:在一個集群的多個節點中進行分布式存儲,索引支持shards和復制,即使部分節點down掉,也能自動進行數據恢復和主從切換
- 采用RestfulAPI標准:通過http接口使用JSON格式進行操作數據
- 數據存儲的最小單位是文檔,本質上是一個JSON 文本
Elasticsearch關鍵詞
- Node : 節點,單個裝有Elasticsearch服務並且提供故障轉移和實現可擴展的服務器
- Cluster : 集群,一個Elasticsearch-Cluster集群是有一個Node或者至少2個Node組成的服務器,共同服務和分享Node節點數據的具有負載均衡的功能,甚至基於Zookeeper集群的高可用服務等。
- Index : 索引,具有相同或者相似特征的Document文檔對象的集合
- Type : 類型,相同Filed字段的文檔定義一個Type類型,一個Type可以創建多個Index索引
- Document :文檔,一個Document文檔可以被用作Index索引的基礎信息單元
- Field : 字段列,Field是Elasticsearch的最小單元,相擋當於數據的某一列
- Term:由很多的字節組成。一般將Text類型的Field Value分詞之后的每個最小單元叫做Term。
- Shards :分片,Elasticsearch把Index索引分成若干份,每一個部分就是一個Shard分片
- Replicas : 復制,每個Inex索引里每個Shard分片的拷貝或者說是數據備份
Elasticsearch 結構與其它數據庫對比
- 數據模型上的對比
databaseType | databaseName | databaseUnit | databaseTable | databaseRow | databaseColumn |
---|---|---|---|---|---|
sql | Mysql | 數據庫-database | 表-table | 數據行-row | 數據列-column |
Nosql | Elasticsearch | 索引-index | 類型-type | 文檔-document | 字段列-field |
Nosql | Hbase | 命名空間-namespace | 域/切片-region | 數據行-row | 數據列-column |
- 使用場景上的對比
databaseType | databaseName | databaseStorage | databaseTransaction | databaseConsistency | databaseScalability | secondaryIndex | fullText |
---|---|---|---|---|---|---|---|
sql | Mysql | 行數數據存儲,適用OLTP業務 | Innodb引擎支持 | strong consistency-強一致性 | 單機可拓展粒度不高 | 支持 | 支持 |
Nosql | Elasticsearch | 索引存儲-任何檢索業務 | 不支持 | 支持可配置 | 水平拓展 | 支持 | 支持 |
Nosql | Hbase | 列式數據存儲,介於OLTP和OLAP模型之間 | 不支持 | strong consistency-強一致性 和 time consistency-時序一致性 | 水平拓展 | 不支持 | 不支持 |
ps[⚠️注意事項]:
- OLTP: OnLine Transaction Processing聯機事務處理過程(OLTP),主要對應傳統的關系型數據庫,基本操作增刪改查,強調事務一致性,比如銀行系統、電商系統。
- OLAP:Online Analytical processing 即聯機分析處理過程(OLAP),主要對應倉儲型數據庫,基本讀取數據,做復雜數據分析,側重技術決策支持,提供直觀簡單的結果。
Elasticsearch原理剖析
- Gateway[索引數據的存儲格式]: Elasticsearch用來存儲數據index索引的文件系統,支持多種類型[ Local FileSystem-本地文件系統 Shared FileSystem-分布式文件系統 Hadoop HDFS, Amazon S3 ]
- Distributed Lucene Directory[底層 API框架]:Elasticsearch底層依賴Lucene框架,每一個Elasticsearch節點服務都會有對應的Lucene框架
- Major Module[加工處理方式] : 在Lucene上層,Index Module(創建Index模塊)、Search Module(搜索模塊)、Mapping(映射)、River(運行在Elasticsearch集群內部的一個插件,主要用來從外部獲取獲取異構數據,然后在Elasticsearch里創建索引
- Discovery[Elasticsearch發現機制]:Discovery 是Elasticsearch自動發現節點的機制;Zen是用來實現節點自動發現、Master節點選舉用;Elasticsearch是基於P2P的系統,它首先通過廣播的機制尋找存在的節點,然后再通過多播協議來進行節點間的通信,同時也支持點對點的交互
- Scripting[Elasticsearch腳本執行功能]:Scripting 是腳本執行功能,有這個功能能很方便對查詢出來的數據進行加工處理
- Plugins[Elasticsearch插件機制]:Elasticsearch整合第三方的插件的主要實現拓展和整合等,譬如elasticsearch-ik分詞插件、elasticsearch-sql sql插件。
- Transport[Elasticsearch傳輸機制]: 傳輸模塊支持 Thrift, Memcached , HTTP,默認使用 HTTP 傳輸
- JMX[Elasticsearch基於Java的管理框架]:Java 的管理框架,用來管理 Elasticsearch 應用
- RSTful Style API [Elasticsearch的API支持模式]:基於Netty實現的網絡通信,通過RSTful API 和 Elasticsearch 集群進行交互
數據結構
版權聲明:本文為博主原創文章,遵循相關版權協議,如若轉載或者分享請附上原文出處鏈接和鏈接來源。