1. 程式人生 > 其它 >Elasticsearch概念及基本操作

Elasticsearch概念及基本操作

概述:

  • 節點- 它指的是Elasticsearch的單個正在執行的例項。單個物理和虛擬伺服器容納多個節點,這取決於其物理資源的能力,如RAM,儲存和處理能力。

  • 叢集- 它是一個或多個節點的集合。 叢集為整個資料提供跨所有節點的集合索引和搜尋功能。

  • 索引- 它是不同型別的文件和文件屬性的集合。索引還使用分片的概念來提高效能。 例如,一組文件包含社交網路應用的資料。

  • 型別/對映- 它是共享同一索引中存在的一組公共欄位的文件的集合。 例如,索引包含社交網路應用的資料,然後它可以存在用於使用者簡檔資料的特定型別,另一型別可用於訊息的資料,以及另一型別可用於評論的資料。

  • 文件- 它是以JSON格式定義的特定方式的欄位集合。每個文件都屬於一個型別並駐留在索引中。每個文件都與唯一識別符號(稱為UID)相關聯。

  • 碎片- 索引被水平細分為碎片。這意味著每個碎片包含文件的所有屬性,但包含的數量比索引少。水平分隔使碎片成為一個獨立的節點,可以儲存在任何節點中。主碎片是索引的原始水平部分,然後這些主碎片被複制到副本碎片中。

  • 副本- Elasticsearch允許使用者建立其索引和分片的副本。 複製不僅有助於在故障情況下增加資料的可用性,而且還通過在這些副本中執行並行搜尋操作來提高搜尋的效能。

安裝參考文件:

ELK官網:https://www.elastic.co/

ELK官網文件:https://www.elastic.co/guide/index.html

ELK中文手冊:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html

ELK中文社群:https://elasticsearch.cn/

ELK-API :https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/transport-client.html

ES安裝

將下載的安裝包上傳到centos,或者直接在centos使用wget命令下載。

1、解壓:unzip elasticsearch-5.1.1.zip

  進入config資料夾:cd config

  編輯elasticserach.yml配置檔案:vim elasticserach.yml

  

#配置es的叢集名稱,預設是elasticsearch,es會自動發現在同一網段下的es,如果在同一網段下有多個叢集,就可以用這個屬性來區分不同的叢集。
cluster.name: my-es #節點名稱 node.name: node-1

 discovery.zen.minimum_master_nodes: 2
#指定叢集中的節點中有幾個有master資格的節點。
#對於大叢集可以寫3個以上。

discovery.zen.ping.timeout: 40s

#預設是3s,這是設定叢集中自動發現其它節點時ping連線超時時間,
#為避免因為網路差而導致啟動報錯,我設成了40s。

discovery.zen.ping.multicast.enabled: false
#設定是否開啟多播發現節點,預設是true。

network.bind_host: 192.168.137.100
#設定繫結的ip地址,這是我的master虛擬機器的IP。

network.publish_host: 192.168.137.100
#設定其它節點和該節點互動的ip地址

#設定索引資料的儲存路徑
path.data: /usr/local/elasticsearch/data
#設定日誌的儲存路徑
path.logs: /usr/local/elasticsearch/logs
#設定當前的ip地址,通過指定相同網段的其他節點會加入該叢集中
network.host: 0.0.0.0
#設定對外服務的http埠
http.port: 9200
#設定叢集中master節點的初始列表,可以通過這些節點來自動發現新加入叢集的節點
discovery.zen.ping.unicast.hosts: ["127.0.0.1","10.10.10.34:9200"]

  將檔案中的network.host註釋放開 然後將ip修改為0.0.0.0
  下邊的http.port註釋放開 儲存並退出.

注意:

  補齊必要的目錄

  mkdir -p /usr/local/elasticsearch/data

  mkdir -p /usr/local/elasticsearch/logs (目錄可能已經存在,需先確定清楚)

2、安裝jdk1.8

  要安裝elasticsearch官方建議使用jdk1.8的版本,所以先安裝並部署好jdk,關於jdk的部署參考網上其他資料。

3、執行

  cd bin

  ./elasticsearch

  可能會出現錯誤,下面列出常見的錯誤:

(1)elasticsearch不能以root許可權來執行,會出現這種錯誤:Exception in thread "main"
    java.lang.RuntimeException: don't run elasticsearch as root

解決辦法:

  因為安全問題elasticsearch 不讓用root使用者直接執行,所以要建立新使用者

  第一步:liunx建立新使用者 adduser XXX 然後給建立的使用者加密碼 passwd XXX 輸入兩次密碼。

  第二步:切換剛才建立的使用者 su XXX 然後執行elasticsearch 會顯示Permission denied 許可權不足。

  第三步:給新建的XXX賦許可權,chmod 777 * 這個不行,因為這個使用者本身就沒有許可權,肯定自己不能給自己付許可權。所以要用root使用者登入付許可權。

  第四步:root給XXX賦許可權,chown -R XXX /你的elasticsearch安裝目錄。

(2)提示:Max number of threads for elasticsearch too low

解決辦法:

  修改/etc/security/limits.conf

  vim /etc/security/limits.conf

  新增一行:xxx - nproc 2048

  其中"xxx"為啟動elasticsearch的使用者

(3)提示:max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

解決辦法:

  修改/etc/sysctl.conf

  vim /etc/sysctl.conf

  新增一行:vm.max_map_count=262144,新增完了執行:sysctl -p,看結果是不是vm.max_map_count = 262144

  成功執行的結果是會出現started即可。

  可能出現localhost:9200 或者127.0.0.1:9200都能訪問的情況,但是根據IP:9200就是訪問不了。 此時修改:elasticsearch.yaml檔案

  network.host: 192.168.1.100 即可根據IP訪問

(4)無法安裝外掛license

  bin/elasticsearch-plugin install license

  ERROR: Unknown plugin license

  原因:ElasticSearch5.0.0以後外掛命令已經改變

  解決方案:使用最新命令安裝所有外掛

    bin/elasticsearch-plugin install x-pack

5、測試執行

  在瀏覽器輸入:
    http://192.168.1.100:9200/,如果出現:

說明部署成功,其中cluster_name:my-demo,是我修改了預設的cluster_name。

1.執行elasticsearch :
  編輯 /home/zkpk/elasticsearch-1.7.3/bin/elasticsearch.in.sh, 設定 ES_MIN_MEM和ES_MAX_MEM,確保二者數值一致,或者可以在啟動es時指定,

    [zkpk@master ~]$ cd ~/elasticsearch-node1/bin
    [zkpk@master bin]$ ./elasticsearch -Xms512m -Xmx512m
  若想讓es後臺執行,則

    [zkpk@master bin]$ ./elasticsearch -d -Xms512m -Xmx512m
2.關閉elasticsearch:
  前臺執行:可以通過”CTRL+C”組合鍵來停止執行
  後臺執行,可以通過”kill -9 程序號”停止.也可以通過REST API介面:

    curl -XPOST http://主機IP:9200/_cluster/nodes/_shutdown
  來關閉整個叢集,通過:

    curl -XPOST http://主機IP:9200/_cluster/nodes/節點標示符(如es-node1)/_shutdown
  來關閉單個節點.

ES外掛安裝

1、安裝head

elasticsearch-head是一個介面化的叢集操作和管理工具,可以對叢集進行傻瓜式操作。你可以通過外掛把它整合到es(首選方式),也可以安裝成一個獨立webapp。
es-head主要有三個方面的操作:
  a、顯示叢集的拓撲,並且能夠執行索引和節點級別操作
  b、搜尋介面能夠查詢叢集中原始json或表格格式的檢索資料
  c、能夠快速訪問並顯示叢集的狀態
有一個輸入視窗,允許任意呼叫RESTful API。這個介面包含幾個選項,可以組合在一起以產生有趣的結果; 
請求方法(get、put、post、delete),查詢json資料,節點和路徑
      支援JSON驗證器
      支援重複請求計時器
      支援使用javascript表示式變換結果
收集結果的能力隨著時間的推移(使用定時器),或比較的結果,能力圖表轉換後的結果在一個簡單的條形圖(包括時間序列)

1), 直接安裝

./bin/plugin install mobz/elasticsearch-head

2) ,zip包安裝

https://github.com/mobz/elasticsearch-head下載zip 解壓
建立elasticsearch-2.4.0\plugins\head檔案
將解壓後的elasticsearch-head-master資料夾下的檔案copy到head
執行es

安裝驗證:

2, 安裝其他外掛

$ ${ES_HOME}/bin/plugin --install lukas-vlcek/bigdesk
# 安裝完成訪問:http://localhost:9200/_plugin/bigdesk/#nodes

$ ${ES_HOME}/bin/plugin -install royrusso/elasticsearch-HQ
# 安裝完成訪問:http://localhost:9200/_plugin/HQ/

$ ${ES_HOME}/bin/plugin -install lmenezes/elasticsearch-kopf
# 安裝完成訪問:http://localhost:9200/_plugin/kopf/#!/cluster

基礎操作:

大家一定是使用過關係型資料庫的,那麼我們現在從關係型資料庫的概念擴充套件講解一下ES對應關係型資料庫的內容

對應關係表
  Elasticsearch => MySQL

  索引庫(indices) => Database 資料庫
  型別(type) => Table 資料表
  文件(Document) => Row 行
  域欄位(Field) => Columns 列
  對映配置(mappings) => 每個列的約束(型別、長度)

建立索引

在ElasticSearch索引中,對應於CRUD中的“建立”和“更新” - 如果對具有給定型別的文件進行索引,並且要插入原先不存在的ID。 如果具有相同型別和ID的文件已存在,則會被覆蓋。

要索引第一個JSON物件,我們對REST API建立一個PUT請求到一個由索引名稱,型別名稱和ID組成的URL。也就是:http://localhost:9200/<index>/<type>/[<id>]

索引和型別是必需的,而id部分是可選的。如果不指定ID,ElasticSearch會為我們生成一個ID。 但是,如果不指定id,應該使用HTTP的POST而不是PUT請求。

索引名稱是任意的。如果伺服器上沒有此名稱的索引,則將使用預設配置來建立一個索引。

至於型別名稱,它也是任意的。 它有幾個用途,包括:

  • 每種型別都有自己的ID空間。
  • 不同型別具有不同的對映(“模式”,定義屬性/欄位應如何編制索引)。
  • 搜尋多種型別是可以的,並且也很常見,但很容易搜尋一種或多種指定型別。

現在我們來索引一些內容! 可以把任何東西放到索引中,只要它可以表示為單個JSON物件。 在本教程中,使用索引和搜尋電影的一個示例。這是一個經典的電影物件資訊:

要建立一個索引,這裡使用索引的名稱為“movies”,型別名稱(“movie”)和id(“1”),並按照上述模式使用JSON物件在正文中進行請求。

curl -XPUT "http://localhost:9200/movies/movie/1" -d'
{
"title": "The Godfather", "director": "Francis Ford Coppola", "year": 1972 }

執行請求後,可以看到接收到來自ElasticSearch響應的JSON物件。如下所示

{
   "_index": "movies",
   "_type": "movie",
   "_id": "1",
   "_version": 1,
   "result": "created",
   "_shards": {
      "total": 2,
      "successful": 1,
      "failed": 0
   },
   "created": true
}

更新索引

現在,在索引中有了一部電影資訊,接下來來了解如何更新它,新增一個型別列表。要做到這一點,只需使用相同的ID索引它。使用與之前完全相同的索引請求,但型別擴充套件了JSON物件。

curl -XPUT "http://localhost:9200/movies/movie/1" -d'
{
    "title": "The Godfather",
    "director": "Francis Ford Coppola",
    "year": 1972,
    "genres": ["Crime", "Drama"]
}'

ElasticSearch的響應結果與前面的大體上一樣,但有一點區別,結果物件中的_version屬性的值為2,而不是1。響應結果如下

{
   "_index": "movies",
   "_type": "movie",
   "_id": "1",
   "_version": 2,
   "result": "updated",
   "_shards": {
      "total": 2,
      "successful": 1,
      "failed": 0
   },
   "created": false
}

版本號(_version)可用於跟蹤文件已編入索引的次數。它的主要目的是允許樂觀的併發控制,因為可以在索引請求中提供一個版本,如果提供的版本高於索引中的版本,ElasticSearch將只覆蓋文件內容,ID值不變,版本號自動新增。

由ID獲取文件/索引

上面已經學習了索引新文件以及更新存在的文件。還看到了一個簡單搜尋請求的示例。如果只是想檢索一個具有已知ID的索引,一個方法是搜尋索引中的文件。另一個簡單而快速的方法是通過ID,使用GET來檢索它。

簡單的做法是向同一個URL發出一個GET請求,URL的ID部分是強制性的。通過ID從ElasticSearch中檢索文件可發出URL的GET請求:http://localhost:9200/<index>/<type>/<id>

使用以下請求嘗試獲取電影資訊:

curl -XGET "http://localhost:9200/movies/movie/1" -d''

返回示例:

正如下圖所看到的,結果物件包含與索引時所看到的類似的元資料,如索引,型別和版本資訊。 最後最重要的是,它有一個名稱為“_source”的屬性,它包含實際獲取的文件資訊。

關於GET沒有什麼可說的,因為它很簡單,繼續最後刪除操作。

刪除文件

為了通過ID從索引中刪除單個指定的文件,使用與獲取索引文件相同的URL,只是這裡將HTTP方法更改為DELETE

curl -XDELETE "http://localhost:9200/movies/movie/1" -d''

響應物件包含元資料方面的一些常見資料欄位,以及名為“_found”的屬性,表示文件確實已找到並且操作成功。

在執行DELETE呼叫後切換回GET,可以驗證文件是否確實已刪除。