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
,可以驗證文件是否確實已刪除。