ElasticStack系列,第一章
一、Elastic Stack簡介
ElasticStack目前由四部分組成:
ElasticSearch:核心存儲和檢索引擎
Kibana:數據可視化
Logstash:高吞吐量數據處理引擎
Beats:採集數據
ElasticSearch:基於Java,是一個開源分佈式搜索引擎,特點:分佈式,零配置,自動發現,索引自動分片,索引副本機制,restful風格,多數據源,自動搜索負載等。
logstash:基於Java,是一個開源的用於收集,分析和存儲日誌的工具。(主要用beats做數據採集)
kibana:基於nodejs,也是一個開源的免費工具,kibana可以爲logstash和elasticsearch提供的日誌分析友好的web界面,可以彙總、分析和搜索重要數據日誌。
beats:是elastic公司開源的一款採集系統監控數據的代理agent,實在被監控服務器上以客戶端形式運行的數據蒐集器的統稱。可以直接把數據發送給elasticsearch或者通過logstash發送給elasticsearch,然後進行後續的數據分析活動。
Beats由如下組成:
Packetbeat:是一個網絡數據包分析器,用於監控、收集網絡流量信息,Packetbeat嗅探服務器之間的流量,解析應用層協議,並關聯到消息的處理,其支 持ICMP (v4 and v6)、DNS、HTTP、Mysql、PostgreSQL、Redis、MongoDB、Memcache等協議;
Filebeat:用於監控、收集服務器日誌文件,其已取代 logstash forwarder;
Metricbeat:可定期獲取外部系統的監控指標信息,其可以監控、收集 Apache、HAProxy、MongoDBMySQL、Nginx、PostgreSQL、Redis、System、Zookeeper等服務;
Winlogbeat:用於監控、收集Windows系統的日誌信息;
二、ElasticSearch簡介和安裝
1、簡介
ElasticSearch是一個基於Lucene的搜索服務器。
它提供了一個分佈式多用戶能力的全文搜索引擎,基於RestFul web接口。
ElasticSearch使用Java開發的,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。
2、安裝
下載:https://www.elastic.co/cn/downloads/elasticsearch
單機版安裝:
##創建elsearch用戶,Elasticsearch不支持root用戶運行
useradd elsearch
##在opt下創建elasticStack
mkdir elasticStack
##在elasticStack中創建es
cd elasticStack
mkdir es
##更改elasticStack文件夾的用戶權限
chown elsearch:elsearch elasticStack/ -R
【目錄elasticStack和es文件夾都所屬elsearch了】
##切換用戶elsearch
su elsearch
##上傳或下載elasticsearch-6.5.4.tar.gz
##解壓到當前目錄
tar -xvf elasticsearch-6.5.4.tar.gz -C /opt/elasticStack/es
配置config:
##修改配置文件
cd /conf
vim elasticsearch.yml
network.host: 0.0.0.0 ?#設置ip地址,任意網絡均可訪問
##說明:在Elasticsearch中如果,network.host不是localhost或者127.0.0.1的話,
##就會認爲是生產環境,會對環境的要求比較高,我們的測試環境不一定能夠滿足,一般情況下需要修改2處配置,如下:
#1:修改jvm啓動參數
vim conf/jvm.options
-Xms128m #根據自己機器情況修改原來是-Xms1g
-Xmx128m #原來是-Xmx1g
##2:一個進程在VMAs(虛擬內存區域)創建內存映射最大數量【用root用戶操作:su root】
vim /etc/sysctl.conf
vm.max_map_count=655360 #新增
sysctl -p #配置生效
啓動:
##啓動ES服務【以elsearch用戶啓動】
su elsearch
cd bin
./elasticsearch 或 ./elasticsearch -d #後臺啓動
##訪問:
http://你的主機IP:9200/
##阿里雲如果拒絕訪問,你需要給ESC實例設置安全組規則:
啓動過程中會發現一些錯誤,總結如下:
1、ERROR: [1] bootstrap checks failed,
[1]: max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]
#解決:切換到root用戶,編輯limits.conf 添加類似如下內容
vi /etc/security/limits.conf
添加如下內容:
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
2、max number of threads [1024] for user [elsearch] is too low, increase to at least [4096]
#解決:切換到root用戶,進入limits.d目錄下修改配置文件。
vi /etc/security/limits.d/90-nproc.conf
#修改如下內容:
* soft nproc 1024
#修改爲
* soft nproc 4096
3、system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk
#解決:Centos6不支持SecComp,而ES5.2.0默認bootstrap.system_call_filter爲true
vim config/elasticsearch.yml
添加:
bootstrap.system_call_filter: false
3、ElasticSearch-head
lasticsearch-head是一個爲ES開發的一個頁面客戶端工具,其源碼託管於GitHub,
地址爲:https://github.com/mobz/elasticsearch-head
head提供了4種安裝方式:
源碼安裝,通過npm run start啓動(不推薦)
通過docker安裝(推薦)
通過chrome插件安裝(推薦)
通過ES的plugin方式安裝(不推薦)
通過docker安裝
#拉取鏡像
docker pull mobz/elasticsearch-head:5
#創建容器
docker create --name elasticsearch-head -p 9100:9100 mobz/elasticsearch-head:5
#啓動容器
docker start elasticsearch-head
通過瀏覽器進行訪問:
http://你的主機IP:9100 【docker暴露的9100端口】
注意:
由於前後端分離開發,所以會存在跨域問題,需要在服務端做CORS的配置,如下:
vim elasticsearch.yml
http.cors.enabled: true http.cors.allow-origin: "*"
通過chrome插件的方式安裝不存在該問題。
chrome插件的方式安裝
https://github.com/liufengji/es-head
下載然後解壓
訪問:chrome://extensions/
打開開發者模式
加載已解壓的擴展程序
三、ElasticSearch快速入門
1、基本概念
索引
索引(index)是Elasticsearch對邏輯數據的邏輯存儲,所以它可以分爲更小的部分。
可以把索引看成關係型數據庫的表,索引的結構是爲快速有效的全文索引準備的,特別是它不存儲原始值。
Elasticsearch可以把索引存放在一臺機器或者分散在多臺服務器上,每個索引有一或多個分片(shard),
每個分片可以有多個副本(replica)。
文檔
存儲在Elasticsearch中的主要實體叫文檔(document)。
用關係型數據庫來類比的話,一個文檔相當於數據庫表中的一行記錄。
Elasticsearch和MongoDB中的文檔類似,都可以有不同的結構,但Elasticsearch的文檔中,相同字段必須有相同類型。
文檔由多個字段組成,每個字段可能多次出現在一個文檔裏,這樣的字段叫多值字段(multivalued)。
每個字段的類型,可以是文本、數值、日期等。字段類型也可以是複雜類型,一個字段包含其他子文檔或者數組。
文檔類型
在Elasticsearch中,一個索引對象可以存儲很多不同用途的對象。
例如,一個博客應用程序可以保存文章和評論。
每個文檔可以有不同的結構。
不同的文檔類型不能爲相同的屬性設置不同的類型。
例如,在同一索引中的所有文檔類型中,一個叫title的字段必須具有相同的類型。
映射
所有文檔寫進索引之前都會先進行分析,如何將輸入的文本分割爲詞條、哪些詞條又會被過濾,這種行爲叫做映射(mapping)。
一般由用戶自己定義規則。
2、RestFul API
在Elasticsearch中,提供了功能豐富的RESTful API的操作,包括基本的CRUD、創建索引、刪除索引等操作。
2.1)、創建索引
在Lucene中,創建索引是需要定義字段名稱以及字段的類型的,在Elasticsearch中提供了非結構化的索引,就是不需要創建索引結構,即可寫入數據到索引中,實際上在Elasticsearch底層會進行結構化操作,此操作對用戶是透明的。
(POSTMAN請求即可)
PUT /haoke
{
"settings": {
"index": {
"number_of_shards": "2",
"number_of_replicas": "0"
}
}
}
## "number_of_shards" #分片數
## "number_of_replicas" #副本數
2.2)、刪除索引
(POSTMAN請求即可)
DELETE /haoke
{
"acknowledged": true
}
2.3)、插入數據
URL規則
POST /{索引}/{類型}/{id} {id}可有可無,沒有會自動生成一個隨機數
POST /haoke/user/1001
##數據
{
"id":1001,
"name":"張三",
"age":20,
"sex":"男"
}
##結果
{
_index: "haoke"
_type: "user"
_id: "1001"
_version: 1
result: "created" ##結果
_shards: {
total: 1
successful: 1
failed: 0
}-
_seq_no: 0
_primary_term: 1
}
2.4)、更新數據
在Elasticsearch中,文檔數據是不可以修改的,但是可以通過覆蓋的方式進行更新。(先刪除後新增的方式)
覆蓋更新
URL規則:
PUT /{索引}/{type}/{id}
PUT /haoke/user/1001
##數據
{
"id":1001,
"name":"張三",
"age":21,
"sex":"女"
}
##結果
{
_index: "haoke"
_type: "user"
_id: "1001"
_version: 2 ##版本
result: "updated" ##結果
_shards: {
total: 1
successful: 1
failed: 0
}-
_seq_no: 2
_primary_term: 1
}
局部更新
URL規則:
POST /{索引}/{type}/{id}/_update
- 從舊文檔中檢索JSON 2. 修改它 3. 刪除舊文檔 4. 索引新文檔
#注意:這裏多了_update標識 PUT換成了POST
POST /haoke/user/1001/_update
##數據
{
"doc":
{
"age":23
}
}
##結果
{
_index: "haoke"
_type: "user"
_id: "1001"
_version: 4
result: "updated"
_shards: {
total: 1
successful: 1
failed: 0
}-
_seq_no: 4
_primary_term: 1
}
2.5)、刪除數據
URL規則:
DELETE /{索引}/{類型}/{id}
在Elasticsearch中,刪除文檔數據,只需要發起DELETE請求即可。
注意:
刪除一個文檔也不會立即從磁盤上移除,它只是被標記成已刪除狀態。
Elasticsearch將會在你之後添加更多索引的時候纔會在後臺進行刪除內容的清理。
測試:
DELETE /haoke/user/1001
結果:
{
_index: "haoke"
_type: "user"
_id: "1001"
_version: 5
result: "deleted" ##結果
_shards: {
total: 1
successful: 1
failed: 0
}-
_seq_no: 5
_primary_term: 1
}
2.6)、查詢數據
A、根據ID搜索
URL規則:
GET /{索引}/{類型}/{id}
GET /haoke/user/FD_2gm4BoifuYiH46rUl
結果:
{
_index: "haoke"
_type: "user"
_id: "FD_2gm4BoifuYiH46rUl"
_version: 1
found: true
_source: {
id: 1002
name: "李四"
age: 21
sex: "男"
}-
}
B、查詢所有
URL規則:
GET /{索引}/{類型}/_search
注意:
默認返回10條數據
更多數據要做分頁查詢
測試:
GET /haoke/user/_search
##結果:
{
took: 9
timed_out: false
_shards: {
total: 2
successful: 2
skipped: 0
failed: 0
}-
hits: {
total: 1
max_score: 1
hits: [1] ##擊中,查詢出1條數據
0: {
_index: "haoke"
_type: "user"
_id: "FD_2gm4BoifuYiH46rUl"
_score: 1 ##得分
_source: {
id: 1002
name: "李四"
age: 21
sex: "男"
}-
}-
-
}-
}
C、根據字段搜索
URL規則:
GET /{索引}/{類型}/_search?q=字段:字段值
測試:
GET /haoke/user/_search?q=age:21
##結果:
{
took: 2
timed_out: false
_shards: {
total: 2
successful: 2
skipped: 0
failed: 0
}-
hits: {
total: 1
max_score: 1
hits: [1] ##擊中
0: {
_index: "haoke"
_type: "user"
_id: "FD_2gm4BoifuYiH46rUl"
_score: 1 ##得分
_source: {
id: 1002
name: "李四"
age: 21
sex: "男"
}-
}-
-
}-
}
2.7)、DSL搜索
_index | _type | _id | _score | id | name | age | sex |
---|---|---|---|---|---|---|---|
haoke | user | FT_Hh24BoifuYiH4yLVZ | 1 | 1002 | 李四 | 21 | 女 |
haoke | user | Fj_Ih24BoifuYiH4mrUZ | 1 | 1001 | 張三 | 20 | 男 |
haoke | user | Fz_Ih24BoifuYiH49rXb | 1 | 1004 | 趙六 | 32 | 女 |
haoke | user | GD_Jh24BoifuYiH4ULXB | 1 | 1005 | 孫七 | 33 | 男 |
haoke | user | GT_Jh24BoifuYiH4frUv | 1 | 1003 | 王五 | 31 | 男 |
a、查詢年齡等於20的
{
"query":{
"match":{
"age":20
}
}
}
b、查詢年齡大於30歲的男性
{
"query":{
"bool":{
"filter":{ ##過濾
"range":{ ##範圍
"age":{
"gt":30
}
}
},
"must":{ ##必須
"match":{ ##匹配
"sex":"男"
}
}
}
}
}
//TODO 有關DSL的詳細敘述,之後再寫
2.8)、高亮顯示
name高亮顯示:
{
"query":{
"match":{
"name":"張三 李四"
}
},
"highlight":{
"fields":{
"name":{}
}
}
}
2.9)、聚合
類似group by
{
"aggs":{
"all_interests":{
"terms":{
"field":"age"
}
}
}
}
以上只是簡單的闡述一下,詳細內容之後會做解析