搭建部署 分佈式ELK平臺 (一)

搭建部署 分佈式ELK平臺
java


ELK 是什麼 ?node

ELK 其實並非一款軟件,而是一整套解決方案,是三個軟件產品的首字母縮寫python

    – Elasticsearch:負責日誌檢索和儲存web

    – Logstash:負責日誌的收集和分析、處理數據庫

    – Kibana:負責日誌的可視化json

這三款軟件都是開源軟件,一般是配合使用,並且又前後歸於 Elastic.co 公司名下,故被簡稱爲 ELKvim


ELK 能作什麼?瀏覽器

• ELK組件在海量日誌系統的運維中,可用於解決:安全

    – 分佈式日誌數據集中式查詢和管理服務器

    – 系統監控,包含系統硬件和應用各個組件的監控

    – 故障排查

    – 安全信息和事件管理

    – 報表功能


Elasticsearch

• ElasticSearch 是一個基於 Lucene 的搜索服務器。它提供了一個分佈式多用戶能力的全文搜索引擎,基於 RESTful API 的 web 接口。

• Elasticsearch是用Java開發的,並做爲Apache許可條款下的開放源碼發佈,是當前流行的企業級搜索引擎。設計用於雲計算中,可以達到實時搜索,穩定,可靠,快速,安裝使用方便


• 主要特色

    – 實時分析

    – 分佈式實時文件存儲,並將每個字段都編入索引

    – 文檔導向,全部的對象所有是文檔

    – 高可用性,易擴展,支持集羣(Cluster)、分片和複製(Shards 和 Replicas)

    – 接口友好,支持 JSON


• Elasticsearch 沒有典型意義的事務.

• Elasticsearch 是一種面向文檔的數據庫。

• Elasticsearch 沒有提供受權和認證特性


• 相關概念:

    – Node: 裝有一個 ES 服務器的節點。

    – Cluster: 有多個Node組成的集羣

    – Document: 一個可被搜素的基礎信息單元

    – Index: 擁有類似特徵的文檔的集合

    – Type: 一個索引中能夠定義一種或多種類型

    – Filed: 是 ES 的最小單位,至關於數據的某一列

    – Shards: 索引的分片,每個分片就是一個 Shard

    – Replicas: 索引的拷貝


• ES 與關係型數據庫的對比

– 在 ES 中,文檔歸屬於一種 類型 (type) ,而這些類型存在於索引 (index) 中,類比傳統關係型數據庫

– DB -> Databases -> Tables -> Rows -> Columns

– 關係型   數據庫           表         行           列

– ES -> Indices -> Types -> Documents -> Fields

– ES      索引         類型         文檔         域(字段)

05.jpg

Elasticsearch架構圖

1.jpg

ES 集羣安裝

準備集羣 es1 es2 es3 es4 es5 五臺主機 部署集羣


步驟1 設置ip 與主機名稱對應關係

# ssh -x root@192.168.4.11

# vim /etc/hosts

...

192.168.4.11     es1

192.168.4.12     es2

192.168.4.13     es3

192.168.4.14     es4

192.168.4.15     es5

# for i in {12..15}; do rsync -a /etc/hosts 192.168.4.${i}:/etc/hosts ;done


步驟2 安裝 JDK

– Elasticsearch 要求至少 Java 7

– 通常推薦使用 OpenJDK 1.8

– 配置好安裝源之後,咱們先解決依賴關係

# yum install -y java-1.8.0-openjdk


步驟 3 安裝ES

# rpm -ivh  elasticsearch-2.3.4-1.noarch



步驟 4 修改配置文件

# ssh -x root@192.168.4.11

# vim /etc/elasticsearch/elasticsearch.yml

# grep -v "^#" /etc/elasticsearch/elasticsearch.yml 

cluster.name: es-test

node.name: es1

network.host: 0.0.0.0

discovery.zen.ping.unicast.hosts: ["es1", "es2", "es3"]

//其餘主機可使用以下方法 快速修改配置文件

# for i in {12..15}; do rsync -a /etc/elasticsearch/elasticsearch.yml 192.168.4.${i}:/etc/elasticsearch/elasticsearch.yml ; done

# for i in {2..5}; do  ssh es${i} 'sed -i "s/^\(node.name:\).*/\1 ${HOSTNAME}/" /etc/elasticsearch/elasticsearch.yml' ; done


步驟5 啓動服務,設置自啓動

# systemctl enable elasticsearch

# systemctl start elasticsearch

//其餘主機可使用以下方法 快速啓動服務

# for i in {12..15}; do ssh 192.168.4.${i} systemctl restart elasticsearch.service; done

# for i in {12..15}; do ssh 192.168.4.${i} systemctl enable elasticsearch.service; done


驗證

# nmap -n -sS -p 9200,9300 192.168.4.12-15


Starting Nmap 6.40 ( http://nmap.org ) at 2018-01-24 02:36 EST

Nmap scan report for 192.168.4.12

Host is up (0.00037s latency).

PORT     STATE SERVICE

9200/tcp open  wap-wsp

9300/tcp open  vrace

MAC Address: 74:52:51:32:11:01 (Unknown)


Nmap scan report for 192.168.4.13

Host is up (0.00038s latency).

PORT     STATE SERVICE

9200/tcp open  wap-wsp

9300/tcp open  vrace

MAC Address: 74:52:51:32:12:01 (Unknown)


Nmap scan report for 192.168.4.14

Host is up (0.00036s latency).

PORT     STATE SERVICE

9200/tcp open  wap-wsp

9300/tcp open  vrace

MAC Address: 74:52:51:32:13:01 (Unknown)


Nmap scan report for 192.168.4.15

Host is up (0.00037s latency).

PORT     STATE SERVICE

9200/tcp open  wap-wsp

9300/tcp open  vrace

MAC Address: 74:52:51:32:14:01 (Unknown)


Nmap done: 4 IP addresses (4 hosts up) scanned in 0.05 seconds



• 經過瀏覽器或 curl 訪問 9200 端口

# curl http://es1:9200/_cluster/health?pretty

{

  "cluster_name" : "es-test",        – 返回字段解析

  "status" : "green",                      – 集羣狀態,綠色爲正常,×××表示有問題但不是很嚴重,紅色表示嚴重故障

  "timed_out" : false,

  "number_of_nodes" : 5,            – 5, 表示集羣中節點的數量

  "number_of_data_nodes" : 5,

  "active_primary_shards" : 0,

  "active_shards" : 0,

  "relocating_shards" : 0,

  "initializing_shards" : 0,

  "unassigned_shards" : 0,

  "delayed_unassigned_shards" : 0,

  "number_of_pending_tasks" : 0,

  "number_of_in_flight_fetch" : 0,

  "task_max_waiting_in_queue_millis" : 0,

  "active_shards_percent_as_number" : 100.0

}


ES 經常使用插件

• head 插件:

    – 它展示ES集羣的拓撲結構,而且能夠經過它來進行索引(Index)和節點(Node)級別的操做

    – 它提供一組針對集羣的查詢API,並將結果以json和表格形式返回

    – 它提供一些快捷菜單,用以展示集羣的各類狀態

• kopf 插件

    – 是一個ElasticSearch的管理工具

    – 它提供了對ES集羣操做的API

• bigdesk 插件

    – 是elasticsearch的一個集羣監控工具

    – 能夠經過它來查看es集羣的各類狀態,如:cpu、內存使用狀況,索引數據、搜索狀況,http鏈接數等

ES 插件安裝,查看 

    插件能夠安裝在集羣當中任意一臺主機

    – 安裝插件

    # cd /usr/share/elasticsearch/bin/

    # ./plugin install  file:///root/bigdesk-master.zip

    # ./plugin install  file:///root/elasticsearch-head-master.zip

    # ./plugin install  file:///root/elasticsearch-kopf-master.zip 

    這裏必須使用 url 的方式進行安裝,若是文件在本地,咱們也須要使用 file:// 的方式指定路徑,

    例如文件在/tmp/xxx 下面,咱們要寫成 file:///tmp/xxx 刪除使用remove 指令


     –  查看安裝的插件   

    # ./plugin list

    Installed plugins in /usr/share/elasticsearch/plugins:

        - bigdesk

        - head

        - kopf

查看插件   

# firefox http://es1:9200/_plugin/head 

5.jpg

# firefox http://es1:9200/_plugin/kopf 

6.jpg


# firefox http://es1:9200/_plugin/bigdesk 


7.jpg


HTTP與 RESTful API


• Elasticsearch提供了一系列RESTful的API

    – 檢查集羣、節點、索引的健康度、狀態和統計

    – 管理集羣、節點、索引的數據及元數據

    – 對索引進行CRUD操做及查詢操做

    – 執行其餘高級操做如分頁、排序、過濾等


• POST 或 PUT 數據使用 json 格式


• json

    – JSON的全稱是」JavaScript Object Notation」,意思是JavaScript對象表示法,它是一種基於文本,獨立於語言的輕量級數據交換格式。

    – json 傳輸的就是一個字符串

    – python 中對應的 字符串,列表,字典均可以轉換成對應的 json 格式


• Rest API 的簡單使用

– _cat API 查詢集羣狀態,節點信息

# curl -X "GET" http://192.168.4.13:9200/_cat/

=^.^=

/_cat/allocation

/_cat/shards

/_cat/shards/{index}

/_cat/master

/_cat/nodes

/_cat/indices

/_cat/indices/{index}

/_cat/segments

/_cat/segments/{index}

/_cat/count

/_cat/count/{index}

/_cat/recovery

/_cat/recovery/{index}

/_cat/health

/_cat/pending_tasks

/_cat/aliases

/_cat/aliases/{alias}

/_cat/thread_pool

/_cat/plugins

/_cat/fielddata

/_cat/fielddata/{fields}

/_cat/nodeattrs

/_cat/repositories

/_cat/snapshots/{repository}


– nodes 查詢節點狀態信息

# curl -X "GET" http://192.168.4.13:9200/_cat/nodes

192.168.4.12 192.168.4.12 5 89 0.00 d m es2 

192.168.4.13 192.168.4.13 4 75 0.01 d m es3 

192.168.4.11 192.168.4.11 5 85 0.01 d m es1 

192.168.4.15 192.168.4.15 6 73 0.00 d * es5 

192.168.4.14 192.168.4.14 5 76 0.00 d m es4 

– v 參數顯示詳細信息

# curl -X "GET" http://192.168.4.13:9200/_cat/nodes?v

– help 顯示幫助信息

# curl -X "GET" http://192.168.4.13:9200/_cat/nodes?help


• HTTP Methods 和 RESTful API 設計

– HTTP Methods 也叫 HTTP Verbs, 它們是 HTTP 協議的一部分, 主要規定了 HTTP 如何請求和操做服務器上的資源,常見的有GET, POST等

– HTTP Methods 一共有九個,分別是 GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS,CONNECT,PATCH


• HTTP Methods

– 在RESTful API 設計中,經常使用的有POST,GET,PUT,PATCH 和 DELETE。分別對應對資源的建立,獲取,修改,部分修改和刪除操做。

– 咱們默認訪問 ES API 的方法是 GET,若是要對數據庫增長、刪除、修改數據咱們還要使用對應的方法

– GET 查詢

– PUT 增長

– POST 更改

– DELETE 刪除


• RESTful API 增長

— 建立一個school 的(index) 和 一個students (Type)

— 並增長兩條信息

# curl -X "PUT" 'http://192.168.4.11:9200/school/student/1' -d '{

>   "title": "devops",

>    "name":{

> "first":"aa",

> "last":"bb"

>    },

>     "age":25

> }'

{"_index":"school","_type":"student","_id":"1","_version":1,"_shards":{"total":2,"successful":1,"failed":0},"created":true}

# curl -X "PUT" 'http://192.168.4.11:9200/school/student/2' -d '{

>   "title": "devops",

>    "name":{

> "first":"AA",

> "last":"XX"

>    },

>     "age":25

> }'

{"_index":"school","_type":"student","_id":"2","_version":1,"_shards":{"total":2,"successful":2,"failed":0},"created":true}

10.jpg

11.jpg

• RESTful API 更改

— 修改school 下面students 的第一個文檔中的age 信息,從25修改30 

# curl -X "POST" 'http://192.168.4.11:9200/school/student/1/_update' -d '{

>    "doc":{

>  "age":30

>     }

>  }'

{"_index":"school","_type":"student","_id":"1","_version":2,"_shards":{"total":2,"successful":2,"failed":0}}

12.jpg

• RESTful API 查詢

— 查詢剛剛建立的文擋信息

# curl -X "GET" 'http://192.168.4.11:9200/school/student/1'

{"_index":"school","_type":"student","_id":"1","_version":2,"found":true,"_source":{

  "title":"devops",

  "name":{

      "first":"aa",

      "last":"bb"

 },

    "age":30

}}

# curl -X "GET" 'http://192.168.4.11:9200/school/student/2' 

{"_index":"school","_type":"student","_id":"2","_version":1,"found":true,"_source":{

  "title": "devops",

   "name":{

      "first":"AA",

      "last":"XX"

   },

    "age":25

}}


• RESTful API 刪除

# curl -X "DELETE" 'http://192.168.4.11:9200/school/student/2'

{"found":true,"_index":"school","_type":"student","_id":"2","_version":2,"_shards":{"total":2,"successful":2,"failed":0}}

# curl -X "DELETE" 'http://192.168.4.11:9200/school/student/1' 

{"found":true,"_index":"school","_type":"student","_id":"1","_version":3,"_shards":{"total":2,"successful":2,"failed":0}}

# curl -X "DELETE" 'http://192.168.4.11:9200/school'

{"acknowledged":true}

13.jpg


kibana 


• kibana是什麼

– 數據可視化平臺工具

• 特色:

– 靈活的分析和可視化平臺

– 實時總結和流數據的圖表

– 爲不一樣的用戶顯示直觀的界面

– 即時分享和嵌入的儀表板


Kibana 安裝

– kibana 的安裝很是簡單,咱們使用 rpm 方式安裝

# rpm -ivh kibana-4.5.2-1.x86_64.rpm

– kibana 默認安裝在 /opt/kibana 下面,配置文件在/opt/kibana/config/kibana.yml

# rpm -qc kibana

/opt/kibana/config/kibana.yml

• kibana.yml 的配置

    # vim /opt/kibana/config/kibana.yml 

    # grep -Pv '^(#|$)' /opt/kibana/config/kibana.yml

    server.port: 5601

    server.host: "0.0.0.0"

    elasticsearch.url: "http://192.168.4.11:9200"

    kibana.index: ".kibana"

    kibana.defaultAppId: "discover"

    elasticsearch.pingTimeout: 1500

    elasticsearch.requestTimeout: 30000

    elasticsearch.startupTimeout: 5000

— 啓動服務 設置開機啓動

# systemctl start kibana.service

# systemctl enable kibana.service 

# netstat -pantu | grep 5601

tcp        0      0 0.0.0.0:5601            0.0.0.0:*               LISTEN      10011/node       


—web 訪問kibana

http://192.168.4.10:5601/

14.jpg

15.jpg

http://192.168.4.11:9200/_plugin/head

03.jpg


數據批量導入

# ls json/

accounts.json   logs.jsonl  shakespeare.json

• 使用 _bulk 批量導入數據

– 批量導入數據使用 POST 方式,數據格式爲 json,url編碼使用 data-binary

– 導入含有 index 配置的 json 文件

# curl -X "POST" 'http://192.168.4.11:9200/_bulk' --data-binary @logs.jsonl

# curl -X "POST" 'http://192.168.4.11:9200/_bulk' --data-binary @shakespeare.json

• 使用 _bulk 批量導入數據

– 導入沒有有 index 配置的 json 文件

– 咱們須要在 uri 裏面制定 index 和 type

# curl -X "POST" 'http://192.168.4.11:9200/accounts/act/_bulk' --data-binary @accounts.json

數據批量查詢

數據批量查詢使用 GET

# curl -X 'GET' "http://192.168.4.11:9200/_mget?pretty" -d'{

> "docs":[

>     {

>       "_index":"accounts",

>       "_type":"act",

>       "_id":3

>     }

>  ]

> }'

{

  "docs" : [ {

    "_index" : "accounts",

    "_type" : "act",

    "_id" : "3",

    "_version" : 1,

    "found" : true,

    "_source" : {

      "account_number" : 3,

      "balance" : 44947,

      "firstname" : "Levine",

      "lastname" : "Burks",

      "age" : 26,

      "gender" : "F",

      "address" : "328 Wilson Avenue",

      "employer" : "Amtap",

      "email" : "levineburks@amtap.com",

      "city" : "Cochranville",

      "state" : "HI"

    }

  } ]

}

# curl -X 'GET' "http://192.168.4.11:9200/accounts/act/3?pretty"       //另外一種查詢方法 結果同樣

//也能夠同時查詢多個

# curl -X 'GET' "http://192.168.4.11:9200/_mget?pretty" -d '{

> "docs":[

> {

> "_index":"accounts",

> "_type":"act",

> "_id":3

> },

> {

> "_index":"accounts",

> "_type":"act",

> "_id":5

> },

> {

> "_index":"shakespeare",

> "_type":"line",

> "_id":110

> }

> ]

> }'

數據導入之後查看logs 是否導入成功

001.jpg

修改kibana 的配置文件後啓動 kibana ,而後查看ES集羣,若是出現 .kibana Index 表示kibana 與ES集羣鏈接成功

002.jpg


kibana 裏選擇日誌

— 支持通配符 *

— 咱們這裏選擇 logstash-*

– 在下面的 Time-field 選擇 @timestramp 做爲索引

– 而後點 create 按鈕


04.jpg




1.jpg



這裏顯示數據沒有找到 由上角能夠看見 系統默認選擇的是 最近15分鐘

3.jpg




緣由是咱們剛剛導入的日誌是2015-05-10至 2015-05-20 時間段的,這裏咱們修改一下時間顯示  就能夠看見數據展現了

5.jpg


數據展現

6.jpg


除了柱狀圖,kibana 還支持不少種展現方式

7.jpg

8.jpg

9.jpg

10.jpg14.jpg

這裏選項就是日誌文件的字段類型,每一個字段類型表明不一樣的數據

11.jpg


多種維度自定義統計分析 

15.jpg


保存後能夠在 Dashboard 查看

16.jpg

相關文章
相關標籤/搜索