Elasticsearch從小白到應用

引言

本文將簡單介紹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驗權和支持角色的訪問控制,所以數據安全變得不可靠.
對此,這裏給出兩個方案

數據同步

在未使用搜索引擎前,通常使用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 模式.
  1. 使用canal-sync-es適配器:
    canal主要用途是基於 MySQL 數據庫增量日誌解析,提供增量數據訂閱和消費,canal-sync-es是canal其中的一個適配器.
    原理:使用Mysql binlog
    優點:支持消息隊列,減緩Elasticsearch壓力;服務更可靠;可能基本不需要改造原有業務代碼;
    缺點:不支持全量更新;

以上,對於中小型業務,推薦使用go-mysql-elasticsearch作爲數據同步的方案,對於大型的業務可以使用canal作爲數據同步的方案;

配置

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章