1. 程式人生 > >搭建部署 分布式ELK平臺 (一)

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

sca java 7 zip 什麽 jpg repl columns sna count

搭建部署 分布式ELK平臺


ELK 是什麽 ?

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

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

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

– Kibana:負責日誌的可視化

這三款軟件都是開源軟件,通常是配合使用,而且又先後歸於 Elastic.co 公司名下,故被簡稱為 ELK


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 索引 類型 文檔 域(字段)

技術分享圖片

Elasticsearch架構圖

技術分享圖片

ES 集群安裝

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


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

# ssh -x [email protected]

# 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 [email protected]

# 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

技術分享圖片

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

技術分享圖片


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


技術分享圖片


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 查詢

– POST 增加

– PUT 更改

– 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}

技術分享圖片

技術分享圖片

? 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}}

技術分享圖片

? 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}

技術分享圖片


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/

技術分享圖片

技術分享圖片

http://192.168.4.11:9200/_plugin/head

技術分享圖片


數據批量導入

# 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" : "[email protected]",

"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 是否導入成功

技術分享圖片

修改kibana 的配置文件後啟動 kibana ,然後查看ES集群,如果出現 .kibana Index 表示kibana 與ES集群連接成功

技術分享圖片


kibana 裏選擇日誌

— 支持通配符 *

— 我們這裏選擇 logstash-*

– 在下面的 Time-field 選擇 @timestramp 作為索引

– 然後點 create 按鈕


技術分享圖片




技術分享圖片



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

技術分享圖片




原因是我們剛剛導入的日誌是2015-05-10至 2015-05-20 時間段的,這裏我們修改一下時間顯示 就可以看見數據展示了

技術分享圖片


數據展示

技術分享圖片


除了柱狀圖,kibana 還支持很多種展示方式

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片技術分享圖片

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

技術分享圖片


多種維度自定義統計分析

技術分享圖片


保存後可以在 Dashboard 查看

技術分享圖片





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