文章目錄
分佈式ELK平臺
ELK簡介
來源
在微服務開發過程中,一般都會利用多臺服務器做分佈式部署,如何能夠把分散在各個服務器中的日誌歸集起來做分析處理,是一個微服務服務需要考慮的一個因素。
什麼是ELK
- ELK是日誌分析平臺,不是一款軟件,而是一整套解決方案,是三個軟件產品的首字母縮寫,ELK分別代表:
– Elasticsearch:負責日誌檢索和儲存
– Logstash:負責日誌的收集和分析、處理
– Kibana:負責日誌的可視化 - 這三款軟件都是開源軟件,通常是配合使用,而且又先後歸於Elastic.co公司名下.故被簡稱爲ELK
ELK能做什麼
- ELK組件在海量日誌系統的運維中,可用於解決
– 分佈式日誌數據集中式查詢和管理
– 系統監控,包括系統硬件和應用各個組件的監控
– 故障排查
– 安全信息和事件管理
– 報表功能
Elasticsearch
主要特點
– 實時分析
– 分佈式實時文件存儲,並將每一個字段都編入索引
– 文檔導向,所有的對象全部是文檔
– 高可用性,易擴展,支持集羣(Cluster)、分片和複製(Shards和Replicas)
– 接口友好,支持JSON
ES缺點
– 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 -> Dcuments -> Fields
ES 索引 類型 文檔 域(字段)
Relational database | Elasticsearch |
---|---|
Database | index |
Table | Type |
Row | Document |
Column | Field |
Schema | Mapping |
Index | Everything is indexed |
SQL | Query DSL |
SELECT * FROM table… | GET http://… |
UPDATE table SET | PUT http://… |
Elasticsearch架構圖
ES集羣安裝
- 主機名
- IP地址
- /etc/hosts配置主機名解析
- yum源 CentOS7-1804.iso 和
[[email protected] ~]$ ls /var/ftp/elk
kibana-4.5.2-1.x86_64.rpm logstash-2.3.4-1.noarch.rpm
repodata filebeat-1.2.3-x86_64.rpm
-
安裝JDK
– 要求至少java 7
– 推薦openjdk 1.8 -
在es1上
vim /etc/yum.repos.d/local.repo
[local_repo]
name=CentOS-Base
baseurl="ftp://192.168.1.254/system"
enabled=1
gpgcheck=0
[elk]
name=elk
baseurl="ftp://192.168.1.254/elk"
enabled=1
gpgcheck=0
yum -y install java-1.8.0-openjdk.x86_64
java -version
openjdk version "1.8.0_161"
OpenJDK Runtime Environment (build 1.8.0_161-b14)
OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)
sestatus //查看selinux狀態
SELinux status: disabled
yum -y install elasticsearch
vim /etc/elasticsearch/elasticsearch.yml
17 cluster.name: myelk #配置集羣名字
23 node.name: es1 #當前主機名稱
54 network.host: 0.0.0.0 #0.0.0.0(監聽所有地址)
68 discovery.zen.ping.unicast.hosts: ["es1", "es2", "es3"]
//聲明集羣裏的主機成員有誰,不需要全部寫進去
systemctl restart elasticsearch
systemctl enable elasticsearch
ss -antup | grep 9200
ss -antup | grep 9300
- 查看是否成功
curl http://192.168.1.51:9200
{
"name" : "es1",
"cluster_name" : "myelk",
"version" : {
"number" : "2.3.4",
"build_hash" : "e455fd0c13dceca8dbbdbb1665d068ae55dabe3f",
"build_timestamp" : "2016-06-30T11:24:31Z",
"build_snapshot" : false,
"lucene_version" : "5.5.0"
},
"tagline" : "You Know, for Search"
}
部署多臺es
使用ansible部署ES集羣
ansible的安裝部署請查看ansible基礎及部署
vim elk.yml
---
- name: 批量部署elk
hosts: es
tasks:
- name: 配置yum源
copy:
src: /etc/yum.repos.d/local.repo
dest: /etc/yum.repos.d/local.repo
- name: 配置主機名
copy:
src: /etc/hosts
dest: /etc/hosts
- name: 安裝jdk
yum:
name: java-1.8.0-openjdk
state: installed
- name: 安裝elasticsearch
yum:
name: elasticsearch
state: installed
- name: 修改elk配置文件
copy:
src: /etc/elasticsearch/elasticsearch.yml
dest: /etc/elasticsearch/elasticsearch.yml
- replace:
path: /etc/elasticsearch/elasticsearch.yml
regexp: 'es1$'
replace: "${HOSTNAME}"
#或者 replace: "{{inventory_hostname}}"
- service:
name: elasticsearch.service
state: started
enabled: yes
- 測試
firefox http://192.168.1.51:9200/_cluster/health?pretty
ES插件使用
head插件
kopf插件
bigdesk插件
安裝
插件裝在哪一臺機器上,只能在哪臺機器上使用(這裏安裝在es5機器上面)
cd /usr/share/elasticsearch/bin
./plugin install \
ftp://192.168.1.254/elk/elasticsearch-head-master.zip #安裝head插件
./plugin install \
ftp://192.168.1.254/elk/elasticsearch-kopf-master.zip #安裝kopf插件
./plugin install \
ftp://192.168.1.254/elk/bigdesk-master.zip
#安裝bigdesk插件
./plugin list #查看安裝的插件
Installed plugins in /usr/share/elasticsearch/plugins:
- head
- kopf
- bigdesk
訪問head插件
firefox http://192.168.1.55:9200/_plugin/head
訪問kopf插件
firefox http://192.168.1.55:9200/_plugin/kopf
訪問bigdesk插件
firefox http://192.168.1.55:9200/_plugin/bigdesk
使用head創建index
curl -X PUT "http://192.168.1.55:9200/index" -d '
> {
> "settings":{
> "index":{
> "number_of_shards":5, #分片數
> "number_of_replicas":1 #副本數
> }
> }
> }'
{"acknowledged":true}
擴展插件
RESTful API
HTTP協議簡介
- http請求由三部分組成
- http請求方法
– 常用方法GET,POST,HEAD
– 其他方法 OPTIONS,PUT,DELETE,TRACE和CONNECT - ES常用
– PUT ----增
– DELETE ----刪
– POST -----改
– GET —查
系統命令curl
- 在Linux中curl是一個利用URL規則在命令行下工作的文件傳輸工具,可以說是一款跟強大的http命令行工具.它支持多種請求模式,自定義請求頭等強大功能,是一款綜合工具
- curl常用參數介紹
– -A 修改請求agent
– -X 設置請求方法
– -i 顯示返回頭信息
RESTful API調用
- Elasticsearch提供一系列RESTful的API
– 檢查集羣,節點,索引的健康度,狀態和統計
– 管理集羣,節點,索引的數據及元數據
– 對索引進行CRUD操作及查詢操作
– 執行其他高級操作如分頁,排序,過濾等 - POST或PUT數據使用json格式
- JSON
— JSON(JavaScript Object NOtation),意思是JavaScript對象表達法,它是一種基於文本獨立於語言的輕量級數據交換格式 - RESTful API的簡單使用
– _cat API查詢集羣狀態,節點信息
– v參數顯示詳細信息
curl http://192.168.1.51:9200/_cat/health?v
— help顯示幫助信息
curl http://192.168.1.51:9200/_cat/health?help
– nodes查詢節點狀態信息
curl http://192.168.1.51:9200/_cat/nodes?v
– 索引信息
curl http://192.168.1.51:9200/_cat/indices?v
增加數據
curl -X PUT "http://192.168.1.55:9200/tedu/teacher/1" -d '{
"職業":"詩人",
"名字":"李白",
"稱號":"詩仙",
"年代":"唐"
}'
{"_index":"tedu","_type":"teacher","_id":"1","_version":1,"_shards":{"total":2,"successful":2,"failed":0},"created":true}
修改數據
curl -X PUT "http://192.168.1.55:9200/tedu/teacher/1" -d '{
"doc":{
"年代": "唐代"
}
}'
{"_index":"tedu","_type":"teacher","_id":"1","_version":3,"_shards":{"total":2,"successful":2,"failed":0},"created":false}
或者
curl -X POST "http://192.168.1.55:9200/tedu/teacher/1/_update" -d '{
"doc":{
"年代": "唐代"
}
}'
{"_index":"tedu","_type":"teacher","_id":"1","_version":3,"_shards":{"total":2,"successful":2,"failed":0},"created":false}
查詢數據
curl -X GET "http://192.168.1.55:9200/tedu/teacher/3?pretty"
{
"_index" : "tedu",
"_type" : "teacher",
"_id" : "3",
"found" : false
}
刪除數據
curl -X DELETE "http://192.168.1.55:9200/tedu/teacher/3?pretty"
{
"found" : false,
"_index" : "tedu",
"_type" : "teacher",
"_id" : "3",
"_version" : 1,
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
}
}
刪除索引
curl -X DELETE http://192.168.1.55:9200/tedu/ #刪除索引
{"acknowledged":true}
curl -X DELETE http://192.168.1.65:9200/* #刪除所有索引
{"acknowledged":true}
導入數據
gzip -d logs.jsonl.gz
curl -X POST "http://192.168.1.51:9200/_bulk" \
--data-binary @logs.jsonl