ElasticStack系列,第一章

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
  1. 從舊文檔中檢索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"
            }
        }
    }
}

以上只是簡單的闡述一下,詳細內容之後會做解析

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