搭建部署 分佈式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 索引 類型 文檔 域(字段)
Elasticsearch架構圖
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
# 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 查詢
– 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}
• 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" : "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 是否導入成功
修改kibana 的配置文件後啓動 kibana ,而後查看ES集羣,若是出現 .kibana Index 表示kibana 與ES集羣鏈接成功
kibana 裏選擇日誌
— 支持通配符 *
— 咱們這裏選擇 logstash-*
– 在下面的 Time-field 選擇 @timestramp 做爲索引
– 而後點 create 按鈕
這裏顯示數據沒有找到 由上角能夠看見 系統默認選擇的是 最近15分鐘
緣由是咱們剛剛導入的日誌是2015-05-10至 2015-05-20 時間段的,這裏咱們修改一下時間顯示 就能夠看見數據展現了
數據展現
除了柱狀圖,kibana 還支持不少種展現方式
這裏選項就是日誌文件的字段類型,每一個字段類型表明不一樣的數據
多種維度自定義統計分析
保存後能夠在 Dashboard 查看