前言
通常當(dāng)系統(tǒng)發(fā)生故障時(shí),工程師需要登錄到各個(gè)服務(wù)器上,使用 grep / sed / awk/ docker 等 Linux 腳本工具去日志里查找故障原因。在沒有日志系統(tǒng)的情況下,首先需要定位處理請(qǐng)求的服務(wù)器,如果這臺(tái)服務(wù)器部署了多個(gè)實(shí)例,則需要去每個(gè)應(yīng)用實(shí)例的日志目錄下去找日志文件。每個(gè)應(yīng)用實(shí)例還會(huì)設(shè)置日志滾動(dòng)策略(如:每天生成一個(gè)文件),還有日志壓縮歸檔策略等。
這樣一系列流程下來,對(duì)于我們排查故障以及及時(shí)找到故障原因,造成了比較大的麻煩。因此,如果我們能把這些日志集中管理,并提供集中檢索功能,不僅可以提高診斷的效率,同時(shí)對(duì)系統(tǒng)情況有個(gè)全面的理解,避免事后救火的被動(dòng)。
一、ELK是什么?
E:ElasticSearch是個(gè)開源分布式搜索引擎,它的特點(diǎn)有:分布式,零配置,自動(dòng)發(fā)現(xiàn),索引自動(dòng)分片,索引副本機(jī)制,Restful風(fēng)格接口,多數(shù)據(jù)源,自動(dòng)搜索負(fù)載等。
L:Logstash是一個(gè)完全開源的工具,他可以對(duì)你的日志進(jìn)行收集、過濾,并將其存儲(chǔ)供以后使用
K:Kibana是一個(gè)開源和免費(fèi)的工具,它Kibana可以為 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以幫助您匯總、分析和搜索重要數(shù)據(jù)日志
二、安裝使用步驟
1.安裝JDK
1.1 將Oracle Java PPA添加到apt
sudo add-apt-repository -y ppa:webupd8team/java
1.2 更新apt包數(shù)據(jù)庫(kù)
sudo apt-get update
1.3 使用這個(gè)命令安裝Oracle Java 8的最新穩(wěn)定版本(并接受彈出的許可協(xié)議)
sudo apt-get -y install oracle-java8-installer
現(xiàn)在已經(jīng)安裝了Java 8,讓我們安裝ElasticSearch。
2.安裝Elasticsearch-6.1.1
Elasticsearch可以通過軟件包安裝。
2.1 執(zhí)行以下命令下載Elasticsearch包
sudo wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.1.1.deb -P ~/
2.2 使用以下命令安裝Elasticsearch
sudo dpkg -i ~/elasticsearch-6.1.1.deb
2.3 安裝完成后編輯配置
sudo vim /etc/elasticsearch/elasticsearch.yml
You will want to restrict outside access to your Elasticsearch instance (port 9200), so outsiders can't read your data or shutdown your Elasticsearch cluster through the HTTP API. Find the line that specifies network.host, uncomment it, and replace its value with "127.0.0.1" so it looks like this:
/etc/elasticsearch/elasticsearch.yml excerpt (updated)
network.host: 127.0.0.1
Save and exit elasticsearch.yml.
2.4 啟動(dòng)Elasticsearch
sudo systemctl restart elasticsearch
2.5 然后執(zhí)行如下命令,在開機(jī)時(shí)啟動(dòng)Elasticsearch
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
2.6 檢查Elasticsearch運(yùn)行情況
curl http://localhost:9200
curl http://localhost:9200/_cat/indices
curl http://localhost:9200/_aliases?pretty=true
現(xiàn)在Elasticsearch已經(jīng)啟動(dòng)并運(yùn)行,讓我們安裝Logstash。
3.安裝Logstash-6.1.1
Kibana可以通過軟件包安裝。
3.1 執(zhí)行以下命令下載Logstash包
sudo wget https://artifacts.elastic.co/downloads/logstash/logstash-6.1.1.deb -P ~/
3.2 使用以下命令安裝Logstash
sudo dpkg -i ~/logstash-6.1.1.deb
3.3 配置Logstash
3.3.1 創(chuàng)建目錄/app/logstash來保存sincedb文件
mkdir /app
cd /app
mkdir /logstash
chown -R logstash:logstash /app/logstash
3.3.2 創(chuàng)建Logstash配置文件
Logstash配置文件是json格式的,位于/etc/logstash/conf.d配置包括三個(gè)部分:輸入、過濾器和輸出。例如:
input {
file {
path => ["/app/logs/access.log"]
type => "test-access"
start_position => "beginning"
#/app/logstash must belongs to logstash -- chown -R logstash:logstash /app/logstash
sincedb_path => "/app/logstash/.test-access-sincedb"
ignore_older => 2592000 #one month
}
}
filter {
if [type] == "test-access" {
grok {
match => [ "message" , "%{COMBINEDAPACHELOG}+%{GREEDYDATA:extra_fields}"]
overwrite => [ "message" ]
}
mutate {
convert => ["response", "integer"]
convert => ["bytes", "integer"]
convert => ["responsetime", "float"]
}
geoip {
source => "clientip"
target => "geoip"
add_tag => [ "nginx-geoip" ]
}
date {
match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
remove_field => [ "timestamp" ]
}
useragent {
source => "agent"
}
}
}
output{
if [type] == "test-access"{
elasticsearch {
hosts => ["localhost:9200"]
index => "test-access-logs-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug }
}
}
4.安裝Kibana-6.1.1
Kibana可以通過軟件包安裝。
4.1 執(zhí)行以下命令下載Kibana包
sudo wget https://artifacts.elastic.co/downloads/kibana/kibana-6.1.1-amd64.deb -P ~/
4.2 使用以下命令安裝Kibana
sudo dpkg -i ~/kibana-6.1.1-amd64.deb
4.3 啟動(dòng)Kibana服務(wù)
sudo systemctl daemon-reload
sudo systemctl enable kibana
sudo systemctl start kibana
二、備份和恢復(fù)
1.備份ELK
1.1 安裝存儲(chǔ)庫(kù)S3插件
sudo bin/elasticsearch-plugin install repository-s3
1.2 創(chuàng)建S3 credential (在提示處輸入值)
sudo bin/elasticsearch-keystore add s3.client.default.access_key
sudo bin/elasticsearch-keystore add s3.client.default.secret_key
1.3 創(chuàng)建S3 repository
curl -H "Authorization: Basic ZWxhc3RpYzpTdtFyMjAxNyoox=" -XPUT 'localhost:9200/_snapshot/test_s3_repository?pretty' -H 'Content-Type: application/json' -d'
{
"type": "s3",
"settings": {
"bucket": "elk-repository-qa",
"region": "ap-northeast-1",
"compress": true
}
}
'
1.4 檢查S3 repository
curl -H "Authorization: Basic ZWxhc3RpYzpTdtFyMjAxNyoox=" -XGET 'localhost:9200/_snapshot?pretty'
1.5 創(chuàng)建S3 snapshot
curl -H "Authorization: Basic ZWxhc3RpYzpTdtFyMjAxNyoox=" -XPUT 'localhost:9200/_snapshot/test_s3_repository/snapshot_1?wait_for_completion=true&pretty'
1.6 檢查S3 snapshot
curl -H "Authorization: Basic ZWxhc3RpYzpTdtFyMjAxNyoox=" -XGET 'localhost:9200/_snapshot/test_s3_repository/snapshot_1?pretty'
curl -H "Authorization: Basic ZWxhc3RpYzpTdtFyMjAxNyoox=" -XGET 'localhost:9200/_snapshot/test_s3_repository/_all?pretty'
2.恢復(fù)ELK
2.1 關(guān)閉所有indices
curl -H "Authorization: Basic ZWxhc3RpYzpTdtFyMjAxNyoox=" -XPOST "localhost:9200/_all/_close?pretty"
2.2 恢復(fù)
curl -H "Authorization: Basic ZWxhc3RpYzpTdtFyMjAxNyoox=" -XPOST 'localhost:9200/_snapshot/test_s3_repository/snapshot_1/_restore?pretty'
總結(jié)
ELK可以使日志更加靈活,可以幫助coder完成更加的任務(wù)。動(dòng)手試試吧!