1. 程式人生 > 實用技巧 >從零學Elasticsea從零學Elasticsearch系列——基礎概念rch系列——(1)基礎概念

從零學Elasticsea從零學Elasticsearch系列——基礎概念rch系列——(1)基礎概念

系列文章:

一、概述

官網地址:https://www.elastic.co/cn/products/elasticsearch

Elasticsearch是什麼

ElasticSearch是一個基於Lucene的搜尋伺服器。它提供了一個分散式多使用者能力的全文搜尋引擎,基於RESTful web介面。Elasticsearch是用Java開發的,並作為Apache許可條款下的開放原始碼釋出,是當前流行的企業級搜尋引擎。設計用於雲端計算中,能夠達到實時搜尋,穩定,可靠,快速,安裝使用方便。

Elasticsearch不僅僅是Lucene和全文搜尋引擎,它還提供:

  • 分散式的搜尋引擎和資料分析引擎
  • 全文檢索
  • 對海量資料進行近實時的處理

ElasticSearch的應用場景

  • 全文檢索:主要和 Solr 競爭,屬於後起之秀。

  • NoSQL JSON文件資料庫:主要搶佔 Mongo 的市場,它在讀寫效能上優於 Mongo ,同時也支援地理位置查詢,還方便地理位置和文字混合查詢。

  • 監控:統計、日誌類時間序的資料儲存和分析、視覺化,這方面是引領者。

  • 國外:Wikipedia(維基百科)使用ES提供全文搜尋並高亮關鍵字、StackOverflow(IT問答網站)結合全文搜尋與地理位置查詢、Github使用Elasticsearch檢索1300億行的程式碼。

  • 國內:百度(在雲分析、網盟、預測、文庫、錢包、風控等業務上都應用了ES,單叢集每天匯入30TB+資料,總共每天60TB+)、新浪 、阿里巴巴、騰訊等公司均有對ES的使用。

  • 使用比較廣泛的平臺ELK(ElasticSearch, Logstash, Kibana)。

二、基本概念

RESTful介紹

參考資料:

  1. http://www.ruanyifeng.com/blog/2011/09/restful.html

  2. http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practices.html

REST: 表現層狀態轉化(Representational State Transfer),如果一個架構符合REST原則,就稱它為RESTful架構風格。

  • 資源: 所謂"資源",就是網路上的一個實體,或者說是網路上的一個具體資訊
  • 表現層:我們把"資源"具體呈現出來的形式,叫做它的"表現層"(Representation)。
  • 狀態轉化(State Transfer):如果客戶端想要操作伺服器,必須通過某種手段,讓伺服器端發生"狀態轉化"(State Transfer)。而這種轉化是建立在表現層之上的,所以就是"表現層狀態轉化"。就是HTTP協議裡面,四個表示操作方式的動詞:GET、POST、PUT、DELETE。它們分別對應四種基本操作:GET用來獲取資源,POST用來新建資源(也可以用於更新資源),PUT用來更新資源,DELETE用來刪除資源。

Elasticsearch中涉及到的重要概念

接近實時(NRT)

Elasticsearch是一個接近實時的搜尋平臺。這意味著,從索引一個文件直到這個文件能夠被搜尋到有一個輕微的延遲(通常是1秒)

叢集(cluster)

一個叢集就是由一個或多個節點組織在一起,它們共同持有你整個的資料,並一起提供索引和搜尋功能。一個叢集由一個唯一的名字標識,這個名字預設就是“elasticsearch”。這個名字是重要的,因為一個節點只能通過指定某個叢集的名字,來加入這個叢集。在產品環境中顯式地設定這個名字是一個好習慣,但是使用預設值來進行測試/開發也是不錯的。

節點(node)

一個節點是你叢集中的一個伺服器,作為叢集的一部分,它儲存你的資料,參與叢集的索引和搜尋功能。和叢集類似,一個節點也是由一個名字來標識的,預設情況下,這個名字是一個隨機的漫威漫畫角色的名字,這個名字會在啟動的時候賦予節點。這個名字對於管理工作來說挺重要的,因為在這個管理過程中,你會去確定網路中的哪些伺服器對應於Elasticsearch叢集中的哪些節點。

一個節點可以通過配置叢集名稱的方式來加入一個指定的叢集。預設情況下,每個節點都會被安排加入到一個叫做“elasticsearch”的叢集中,這意味著,如果你在你的網路中啟動了若干個節點,並假定它們能夠相互發現彼此,它們將會自動地形成並加入到一個叫做“elasticsearch”的叢集中。

在一個叢集裡,只要你想,可以擁有任意多個節點。而且,如果當前你的網路中沒有執行任何Elasticsearch節點,這時啟動一個節點,會預設建立並加入一個叫做“elasticsearch”的叢集。

索引(index)

一個索引就是一個擁有幾分相似特徵的文件的集合。比如說,你可以有一個客戶資料的索引,另一個產品目錄的索引,還有一個訂單資料的索引。一個索引由一個名字來標識(必須全部是小寫字母的),並且當我們要對對應於這個索引中的文件進行索引、搜尋、更新和刪除的時候,都要使用到這個名字。索引類似於關係型資料庫中Database的概念。在一個叢集中,如果你想,可以定義任意多的索引。

型別(type)

在一個索引中,你可以定義一種或多種型別。一個型別是你的索引的一個邏輯上的分類/分割槽,其語義完全由你來定。通常,會為具有一組共同欄位的文件定義一個型別。比如說,我們假設你運營一個部落格平臺並且將你所有的資料儲存到一個索引中。在這個索引中,你可以為使用者資料定義一個型別,為部落格資料定義另一個型別,當然,也可以為評論資料定義另一個型別。型別類似於關係型資料庫中Table的概念。

文件(document)

一個文件是一個可被索引的基礎資訊單元。比如,你可以擁有某一個客戶的文件,某一個產品的一個文件,當然,也可以擁有某個訂單的一個文件。文件以JSON(Javascript Object Notation)格式來表示,而JSON是一個到處存在的網際網路資料互動格式。

在一個index/type裡面,只要你想,你可以儲存任意多的文件。注意,儘管一個文件,物理上存在於一個索引之中,文件必須被索引/賦予一個索引的type。文件類似於關係型資料庫中Record的概念。實際上一個文件除了使用者定義的資料外,還包括_index、_type和_id欄位

分片和複製(shards & replicas)

一個索引可以儲存超出單個結點硬體限制的大量資料。比如,一個具有10億文件的索引佔據1TB的磁碟空間,而任一節點都沒有這樣大的磁碟空間;或者單個節點處理搜尋請求,響應太慢。

為了解決這個問題,Elasticsearch提供了將索引劃分成多份的能力,這些份就叫做分片。當你建立一個索引的時候,你可以指定你想要的分片的數量。每個分片本身也是一個功能完善並且獨立的“索引”,這個“索引”可以被放置到叢集中的任何節點上。
分片之所以重要,主要有兩方面的原因:

  • 允許你水平分割/擴充套件你的內容容量
  • 允許你在分片(潛在地,位於多個節點上)之上進行分散式的、並行的操作,進而提高效能/吞吐量
    至於一個分片怎樣分佈,它的文件怎樣聚合回搜尋請求,是完全由Elasticsearch管理的,對於作為使用者的你來說,這些都是透明的。

在一個網路/雲的環境裡,失敗隨時都可能發生,在某個分片/節點不知怎麼的就處於離線狀態,或者由於任何原因消失了。這種情況下,有一個故障轉移機制是非常有用並且是強烈推薦的。為此目的,Elasticsearch允許你建立分片的一份或多份拷貝,這些拷貝叫做複製分片,或者直接叫複製。複製之所以重要,主要有兩方面的原因:

  • 在分片/節點失敗的情況下,提供了高可用性。因為這個原因,注意到複製分片從不與原/主要(original/primary)分片置於同一節點上是非常重要的。
  • 擴充套件你的搜尋量/吞吐量,因為搜尋可以在所有的複製上並行執行

總之,每個索引可以被分成多個分片。一個索引也可以被複制0次(意思是沒有複製)或多次。一旦複製了,每個索引就有了主分片(作為複製源的原來的分片)和複製分片(主分片的拷貝)之別。分片和複製的數量可以在索引建立的時候指定。在索引建立之後,你可以在任何時候動態地改變複製數量,但是不能改變分片的數量。

預設情況下,Elasticsearch中的每個索引被分片5個主分片和1個複製,這意味著,如果你的叢集中至少有兩個節點,你的索引將會有5個主分片和另外5個複製分片(1個完全拷貝),這樣的話每個索引總共就有10個分片。一個索引的多個分片可以存放在叢集中的一臺主機上,也可以存放在多臺主機上,這取決於你的叢集機器數量。主分片和複製分片的具體位置是由ES內在的策略所決定的。

對映(Mapping)

Mapping是ES中的一個很重要的內容,它類似於傳統關係型資料中table的schema,用於定義一個索引(index)的某個型別(type)的資料的結構。

在ES中,我們無需手動建立type(相當於table)和mapping(相關與schema)。在預設配置下,ES可以根據插入的資料自動地建立type及其mapping。

mapping中主要包括欄位名、欄位資料型別和欄位索引型別。