引言
本文將簡單介紹Elasticsearch基本知識及相關技術點,闡述從入門到應用可能面對的知識技術難點,並將給出一些應對的方案,文末也將給出Elasticsearch和相應工具的配置教程.對於一無所知的個人開發者或想要在公司項目中引入Elastichsearch作爲搜索引擎提供即時搜索服務的人,可能需要如下準備:
- 主流開發語言
- 數據庫基本知識
- RESTful API
- Docker
- Linux運維
- API與數據安全
- 數據同步
- 2核4GB以上的服務器
介紹
Elasticsearch
Elasticsearch 是一個分佈式可擴展的實時搜索和分析引擎,一個建立在全文搜索引擎 Apache Lucene™ 基礎上的搜索引擎.Elasticsearch 不僅包括了全文搜索功能,它還具有如下特點:
- 分佈式的實時文件存儲,每個字段都被索引並可被搜索
- 分佈式的實時分析搜索引擎
- 可以擴展到上百臺服務器,處理PB級結構化或非結構化數據
集羣
由一個或多個節點組成, 並通過集羣名稱與其他集羣進行區分.
節點
單個Elasticsearch實例. 考慮機器性能較低,通常一個節點運行在一個物理機上,考慮機器性能較高,爲充分利用機器性能,多個節點運行在一個物理機上可充分發揮機器性能.
分片
基於Elasticsearch的分佈式特性, 索引通常都會分解成不同部分, 而這些分佈在不同節點的數據就是分片. Elasticsearch自動管理和組織分片, 並在必要的時候對分片數據進行再平衡分配, 用戶基本上不用擔心分片的處理細節,一個分片默認最大文檔數量是20億.
副本
Elasticsearch默認爲一個索引創建5個主分片, 並分別爲其創建一個副本分片. 也就是說每個索引都由5個主分片成本, 而每個主分片都相應的有一個副本(copy).對於多節點的集羣,分片會均衡分配.
索引
在Elasticsearch中文檔(row)屬於一種類型(table),類型保存在索引(database),但在Elasticsearch中存儲數據的行爲也做索引(indexing),默認情況下,文檔中的所有字段都會被索引(擁有一個倒排索引)
應區分索引在Elasticsearch的含義:
- 索引(名詞): 如上文所述,一個索引(index)就像是傳統關係數據庫中的數據庫,它是相關文檔存儲的地方,index的複數是indices 或indexes。
- 索引(動詞): 「索引一個文檔」表示把一個文檔存儲到索引(名詞)裏,以便它可以被檢索或者查詢。這很像SQL中的INSERT關鍵字,差別是,如果文檔已經存在,新的文檔將覆蓋舊的文檔。
- 倒排索引: 傳統數據庫爲特定列增加一個索引,例如B-Tree索引來加速檢索。Elasticsearch和Lucene使用一種叫做倒排索引(inverted index)的數據結構來達到相同目的。
同時區分Elasticsearch的從屬關係,可以對比關係型數據庫來理解,值得一提的是:在Elasticsearch 7.x中類型是被移除了的
,所以不能被這個關係所誤導:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields
相對於傳統數據庫來說,文檔數據保存在某個索引裏,並不能代表這文檔能在索引裏直接找到,即不能簡單通過物理查找的方式找到對應的數據.在Elasticsearch中,索引代表了數據所在的邏輯命名空間,具體的數據保存在節點的分片之中,因爲Elasticsearch是分佈式的搜索引擎,所以索引只能代表數據所在的邏輯命名空間.
在索引管理中,開發人員可能需要關注以下幾個點:
- 創建索引時合理分配分片數和副本數:考慮數據增長和性能
1.分片過多,影響性能和查詢相關性
2.分片過少,儲存空間不足,可能需重建索引,影響業務 - 創建索引包含的合理指定類型和映射:考慮數據類型影響到查詢的性能
- 索引生命週期管理:考慮數據增長導致磁盤空間不足的情況下需刪除過期索引
類型
每個類型都有自己的映射或者結構定義,就像傳統數據庫表中的列一樣。所有類型下的文檔被存儲在同一個索引下,但是類型的映射會告訴Elasticsearch不同的文檔如何被索引。
在7.x以前的類型管理中,開發人員可能關注:
- 合理指定映射:考慮數據類型的不確定可能影響搜索,統計相關
- 映射關係的維護:如新增映射,修改映射,刪除映射
在7.x以後,類型的關注變得不是那麼重要
文檔
ELasticsearch使用JSON,作爲文檔序列化格式,所以個人覺得對於非關係型數據庫來說可以較快速的在Elasticsearch中管理文檔.
字段
Elasticsearch支持以下簡單字段類型:
類型 | 數據類型 |
---|---|
String | string |
Whole number byte | byte, short, integer, long |
Floating point | float, double |
Boolean | boolean |
Date | date |
當索引新字段時,elasticsearch在不更新映射的情況下,自動猜測字段的類型,也就是說,開發人員應在新增字段時應首先更新映射,以免造成搜索功能的錯誤.
Kibana
在生產環境中,命令行式地,請求式地管理elastichsearch會相對困難,所以Kibana通常作爲Elasticsearch的必備套件來使用.
首先Kibana 是一個開源的分析和可視化平臺,並且 提供搜索、查看和與存儲在 Elasticsearch 索引中的數據進行交互的功能。開發者或運維人員可以輕鬆地執行高級數據分析,並在各種圖表、表格和地圖中可視化數據。
Logstash
Logstash 是開源的服務器端數據處理管道,能夠同時從多個來源採集數據,轉換數據,然後將數據發送到您最喜歡的“存儲庫”中。
作爲Elasticsearch生態套件之一,Logstash可以採集多樣數據到Elasticsearch中,如同步Mysql數據到Elasticsearch中,
不僅如此:Logstash還可以採集nginx,apache等日誌到包括Elasticsearch中等存儲庫,使用可視化工具Kibana等可視化.
應用難點
中文搜索
Elasticsearch內置許多分詞器,但大多數是針對英文的分詞器.對於國內的使用者,顯然是不滿足需求的,特別是不同行業的分詞情況可能不一樣,如電商行業分詞,媒體行業分詞,社交行業分詞等.開發人員需針對自身情況使用合適的分詞器,維護分詞,同時因爲國內的環境,還需對搜索結果作對應的屏蔽處理.
通信安全
Elasticsearch+Kibana基礎安裝並不支持Api驗權和支持角色的訪問控制,所以數據安全變得不可靠.
對此,這裏給出兩個方案
- 付費用戶:安裝X-pack併購買license,參考https://www.elastic.co/cn/subscriptions
- 非付費用戶:使用nginx認證
數據同步
在未使用搜索引擎前,通常使用MySQL,NoSQL等作爲數據庫,所以使用Elasticsearch的前提就是把線上舊數據索引到Elasticsearch中,線上新產生的數據,修改的數據或刪除的數據也必須同步到Elasticsearh中.在這一大場景下可能會產生如下需求:
- 全量同步MySQL,NoSQL等的數據到Elasticsearch
- 增量同步MySQL,NoSQL等的數據到Elasticsearch
- 支持MySQL,NoSQL庫中的增刪改數據實時同步到Elasticsearch
這裏推薦同步Mysql的幾個方案,並對比優缺點:
- 1.自行同步數據
即使用mysqldump
全量導出數據庫後使用自行編寫好後的程序導入到Elasticsearch後,在增刪改業務代碼完成後調用Elasticsearch api實現數據的同步.
優點:不需額外安裝套件與學習其他工具
缺點:難度大;代碼改造多;全量導入程序維護困難;調用Elasticsearch api造成額外消耗,影響原有業務響應速度 - 2.使用logstash-input-jdbc同步
即使用logstash的插件實現數據同步
原理:全量導入Elasticsearch後,定時執行某一sql語句,判斷是否需要更新或新增後同步到Elasticsearch中
優點:可能不需要改造原有業務代碼,不影響語言層執行速度
缺點:靈活性低;不支持刪除業務的同步,影響數據庫性能,定時執行可能使數據搜索實時性降低 - 3.使用go-mysql-elasticsearch同步
原理:全量導入後使用Mysql binlog
優點:靈活性較高;基本不需要改造原有業務代碼;
缺點:腳本運行不提供服務的模式運行,需自行加入守護進程;數據表必須包含主鍵,因爲如果數據表沒有主鍵,UPDATE和DELETE操作在Elasticsearch中找到對應的文檔;不使用任務隊列,併發情況下,Elasticsearch調用可能過於頻繁.Mysql binlog-format 爲 ROW 模式.
- 使用canal-sync-es適配器:
canal主要用途是基於 MySQL 數據庫增量日誌解析,提供增量數據訂閱和消費,canal-sync-es是canal其中的一個適配器.
原理:使用Mysql binlog
優點:支持消息隊列,減緩Elasticsearch壓力;服務更可靠;可能基本不需要改造原有業務代碼;
缺點:不支持全量更新;
以上,對於中小型業務,推薦使用go-mysql-elasticsearch作爲數據同步的方案,對於大型的業務可以使用canal作爲數據同步的方案;
配置
參考
- 文檔:https://es.xiaoleilu.com/
- canal:https://github.com/alibaba/canal
- go-mysql-elasticsearch:https://github.com/siddontang/go-mysql-elasticsearch
- logstash-input-jdbc:https://github.com/logstash-plugins/logstash-input-jdbc
- logstash-input-jdbc的缺陷:https://segmentfault.com/a/1190000011784259
- 圖文原理:http://developer.51cto.com/art/201904/594615.htm