EleasticSearch綜述(一)

        Elasticsearch是一個開源的分佈式、RESTful 風格的搜索和數據分析引擎,它的底層是開源庫Apache Lucene。EleasticSearch的特點如下:

  • 一個分佈式的實時文檔存儲,每個字段可以被索引與搜索
  • 一個分佈式實時分析搜索引擎
  • 能勝任上百個服務節點的擴展,並支持 PB 級別的結構化或者非結構化數據

        由於Elasticsearch的功能強大和使用簡單,維基百科、衛報、Stack Overflow、GitHub等都紛紛採用它來做搜索。現在,Elasticsearch已成爲全文搜索領域的主流軟件之一。

1. 安裝

(1) Elastic的版本升級及重要版本的新特性

  • 0.4:2010年2月第一次發佈
  • 1.0:2014年1月
  • 2.0:2015年10月
  • 5.0:2016年10月
  • 6.0:2017年10月
  • 7.0:2019年4月

新特性5.X 

  • Lucene 6.x(表示此時以來的Lucene版本)性能升級,默認打分機制從TF-IDF(計算分詞相似的一個算法)改爲BM 25
  • 支持Ingest節點/Painiess Scripting / Completion suggested支持 / 原生的Java REST客戶端
  • Type標記成deprecated(過時,以前我們在創建索引的時候是需要創建一個Type標記的,現在可以不創建它),支持了keyword類型
  • 性能優化:
  • ① 內部引擎移除了避免同一文檔併發更新的競爭鎖,帶來15% - 20%的性能提升
  • ② 支持分片上聚合的緩存
  • ③ 新增了Prefile API

新特性6.X

  • Lucene 7.x
  • 新功能:
  • ① 跨級羣複製(CCR)
  • ② 索引聲明週期管理
  • ③ SQL的支持
  • 更友好的升級及數據遷移:
  • ① 在主要版本之間的遷移更爲簡化,體檢升級
  • ② 全新的基於操作的數據複製框架,可加快恢復數據
  • 性能優化:
  • ① 有效存儲稀疏字段的新方法,降低了存儲成本
  • ② 在索引時進行排序,可加快排序的查詢性能

新特性 7.X

  • Lucene 8.0
  • 重大改進 - 正式廢除單個索引下多Type的支持
  • 7.1開始,Security功能免費使用
  • ECK - Elasticsearch Operator on Kubernetes
  • 新功能:
  • ① New Cluster coordination
  • ② Feature-Complete High Level REST Client
  • ③ Script Score Query
  • 性能優化:
  • ① 默認的Permary Shard數從5改爲1,避免Over Sharding
  • ② 性能優化,更快的Top K

        目前ES6 和 ES7使用較爲廣泛, 本博客主要介紹ES6的相關特性

(2) 準備

        長度ElasticSearch6.3.2下載地址(Linux macOS Windows通用, 下載zip包, 之後解壓即可) https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-3-2. ES的其他版本下載頁面: https://www.elastic.co/cn/downloads/past-releases#elasticsearch

(3) 安裝

        在上述下載地址下載完elasticsearch-6.3.2.tar.gz之後, 首先登錄當前用戶的home下創建一個settings目錄(可以視自己情況而定), 通過tar -zxvf elasticsearch-6.3.2.tar.gz解壓到當前目錄.

        進入elasticsearch-6.3.2目錄, 執行 ./bin/elasticsearch 命令, 等待一小段時間, 通過瀏覽器訪問: http://localhost:9200/?pretty, 出現以下響應即可:

{
    "name": "x4x7wWJ",
    "cluster_name": "elasticsearch",
    "cluster_uuid": "sJ6LTYJ1TDmtR1kzl0M2Ig",
    "version": {
        "number": "6.3.2",
        "build_hash": "8bbedf5",
        "build_date": "2017-10-31T18:55:38.105Z",
        "build_snapshot": false,
        "lucene_version": "6.6.1"
    },
    "tagline": "You Know, for Search"
}

2. 基本概念

       ES是一個搜索引擎, 同時也是一個分佈式文檔存儲數據庫. 爲了保證後續的實戰教程順利進行, 這裏通過對比傳統的關係型數據庫MySql介紹在ES的一些術語.

        在MySql中有數據庫(Database), 表(table), 行(Row), 列(Column)的概念, 同樣在ES中也有類似的概念, 索引(Index), 類型(Type), 文檔(Document), 字段(Field).

        可以做類比:

  數據庫
MySql DB Table Row Colume
ES Index Mapping Document Field

索引Index

        ES中的索引概念不是關係型數據庫中的索引, 而是指存數據的地方, 類似於關係型數據庫中數據庫的概念.

類型Type

        有的文章說ES中的類型Type對應的是關係型數據庫中的表, 在使用ES中我們會遇到另外一個概念映射(Mapping), 大部分文檔都認爲映射(Mapping)纔是真正的對應關係型數據庫中的表. 

        實際上ES中Type的概念已經名存實亡了,後期的版本中越來越被弱化, 在未被ES正式移除之前, ES後期版本已經不允許一個索引Index創建多個Type了, 在ES7中已經移除了Type, 而ES6只允許一個Index創建一個Mapping.

        如果現階段一定要理解ES中的Type, 那麼一定要和Mapping結合起來. 可以理解爲類型Type就是定義一個表而已, 而映射Mapping定義了表結構, 包括哪些列, 哪些行.

文檔Document

        在非關係型數據庫中, 有部分被稱之爲"文檔數據庫", 對應於關係型數據庫中的一行記錄.

字段Field

        對應關係型數據庫中的列.

節點

        一個ES實例稱之爲一個節點, 單機部署的ES有且只有一個節點, 集羣部署的ES有多個節點且只有一個主節點.

分片

        ES作爲分佈式集羣部署, 同樣也可以作爲單機節點部署. ES中數據被分散存儲在分片中, ES屏蔽了底層的分片實現, 我們直接與索引交互而不與分片交互. 分片數量的多少與是否是集羣部署和單機部署無關, 即使是單機部署在創建索引的時候也可以制定多個分片(默認是5個主分片, 1個備份(包含5個備分片)). 分片有主分片和備份片之分, 顧名思義, 備份片是主分片的備份, 當主分片出現故障, 備份片充當主分片.

單機部署

        單機部署的ES, 即ES只有一個節點, 在創建索引時, 如果不指定主分片和備份片的數量, 默認創建5個主分片, 5個備份片, 實際上對於單機而言多個主分片並無多大意義, 因爲主備都在一個節點機器上, 如果主分片故障, 備分片也同樣會故障.

集羣部署

        對於集羣部署的ES來講, 此時存在多個節點, 主分片的分配與備分片機制就顯得尤爲重要. 例如現在又3個節點, 此時如果在創建索引時只分配1個主分片就顯得有點浪費. 主分片的劃分更多是取決於用戶的數量和節點的數量. 通常來講, 分片數量越多越好, 因爲這樣能將數據分散到不同分片, 以便於以後在擴容新增節點時, ES能自動將分片重新均勻分佈. 但這也不是絕對的, 例如有3個節點, 100個分片, 每個節點就33個分片, 當搜索請求調度到同一節點的不同分片時, 此時就會引發硬件資源爭奪, 造成性能問題. 反過來, 如果3個節點只分配3個分片, 隨着業務增長, 數據量增大, 單個分片已不能承載它最大的數量, 此時就算新增節點, 但是分片數量就3個, 分片的數量在創建索引時便確定且不可修改, 此時只能重新創建索引.

        既要對合理的數據增長有一個判斷, 又要對期望有一度的把握. 官方給出的建議, 每個分片的數量最好在20G~40G, 這就意味着如果你有4個節點, 數量預估在200G左右甚至更大, 此時分片數量設置爲5~10個比較合適, 7或8個差不多, 每個節點2個分片.

        上面談到主分片, 副分片劃分同等重要. 如果不對主分片備份, 主分片故障則會導致數據丟失, 部分數據不可查詢. 副本分片設置過多會造成額外的存儲空間, 默認情況下, 創建索引時會創建一個分片副本.

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