Docker實戰(十一):Docker安裝ELK環境(二)
阿新 • • 發佈:2019-01-29
Docker安裝ELK環境(二)
日誌收集系統架構
日誌收集系統架構簡介
- Logstash Agent/Flume:採集各個業務系統的日誌,然後傳送給Redis/Kafka訊息佇列。
- Redis/Kafka:接收使用者日誌的訊息佇列,臨時儲存日誌並且起到緩衝的作用,防止日誌量上來之後,拖垮Logstash Indexer。
- Logstash Indexer:做日誌解析,統一成JSON輸出給Elasticsearch。
- Elasticsearch:實時日誌分析服務的核心技術,一個schemaless,實時的資料儲存服務,通過index組織資料,兼具強大的搜尋和統計功能。
- Kibana:基於Elasticsearch的資料視覺化元件,超強的資料視覺化能力是眾多公司選擇ELK stack的重要原因。
這裡實現的是 ELK + Redis 收集 Nginx 的 access.log
我們這裡是把各個元件拆開,模擬每個元件是一個叢集,每個叢集部署在一臺機器上
1.Nginx + Logstash agent
2.Redis
3.Logstash indexer
4.ElasticSearch
5.Kibana
Nginx配置檔案
daemon off;
master_process off;
error_log logs/error.log;
...
http {
include mime.types;
default_type application/octet-stream;
# 設定nginx日誌格式,格式的名稱logstash
log_format logstash '$http_host $server_addr $remote_addr [$time_local] "$request" $request_body $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time $upstream_response_time';
# 設定access_log日誌輸出的檔案路徑,以及使用的日誌格式名稱
access_log logs/access.log logstash;
# 以下內容省略
...
}
logstash agent的配置檔案logstash.conf
input {
file {
type => "nginx_access"
path => ["/usr/local/nginx/logs/access.log"]
}
}
output {
redis {
host => "10.211.55.4"
port => 6379
password => admin
data_type => "list"
key => "logstash:redis"
}
}
注意
這裡配置就是往redis佇列中塞入日誌就行,所以input的來源是Nginx的log檔案,output的目標設定為redis,這裡redis充當MQ訊息佇列的作用。
logstash indexer的配置檔案logstash.conf
input {
redis {
host => "10.211.55.4"
port => 6379
password => admin
data_type => "list"
key => "logstash:redis"
}
}
filter {
grok {
match => [
"message", "%{IPORHOST:http_host} %{IPORHOST:server_ip} %{IPORHOST:client_ip} \[%{HTTPDATE:timestamp}\] \"%{WORD:http_verb} (?:%{PATH:baseurl}\?%{NOTSPACE:params}(?: HTTP/%{NUMBER:http_version})?|%{DATA:raw_http_request})\" (%{NOTSPACE:params})?|- %{NUMBER:http_status_code} (?:%{NUMBER:bytes_read}|-) %{QS:referrer} %{QS:agent} %{NUMBER:time_duration:float} %{NUMBER:time_backend_response:float}"
]
}
kv {
prefix => "params."
field_split => "&"
source => "params"
}
urldecode {
all_fields => true
}
date {
locale => "en"
match => ["timestamp" , "dd/MMM/YYYY:HH:mm:ss Z"]
}
}
output {
elasticsearch {
embedded => false
codec => "json"
protocol => "http"
host => "10.211.55.4"
port => 9200
index => "birdlogstash"
}
}
注意
logstash indexer的配置檔案就比較麻煩了,需要配置的有三個部分
- input: 負責從redis中獲取日誌資料
- filter: 負責對日誌資料進行分析和結構化
- output: 負責將結構化的資料儲存進入elasticsearch
這裡配置就是從redis佇列中獲取日誌,對日誌進行相應地過濾,所以input的來源是Redis的list佇列,其中的redis配置當然要和logstash agent的配置一致了。output的目標設定為ES搜尋引擎的索引,在通過kibana圖形介面化的展示ES的查詢索引。
kibana.yml配置檔案
# 這裡配置Kibana訪問ES叢集的地址
# The Elasticsearch instance to use for all your queries.
elasticsearch_url: "http://10.211.55.4:9200"
elk_log_agent的Dockerfile檔案
############################################
# version : birdben/elk_log_agent:v1
# desc : 當前版本安裝的elk_log_agent
############################################
# 設定繼承自我們建立的 jdk7 映象
FROM birdben/jdk7:v1
# 下面是一些建立者的基本資訊
MAINTAINER birdben (191654006@163.com)
# 設定環境變數,所有操作都是非互動式的
ENV DEBIAN_FRONTEND noninteractive
# 新增 supervisord 的配置檔案,並複製配置檔案到對應目錄下面。(supervisord.conf檔案和Dockerfile檔案在同一路徑)
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# 設定 LOGSTASH 的環境變數,若讀者有其他的環境變數需要設定,也可以在這裡新增。
ENV LOGSTASH_HOME /software/logstash-1.5.4
# 複製 logstash-1.5.4 檔案到映象中(logstash-1.5.4 資料夾要和Dockerfile檔案在同一路徑)
ADD logstash-1.5.4 /software/logstash-1.5.4
# 解決環境問題,否則logstash無法從log檔案中採集日誌。具體環境: Logstash 1.5, Ubuntu 14.04, Oracle JDK7
RUN ln -s /lib/x86_64-linux-gnu/libcrypt.so.1 /usr/lib/x86_64-linux-gnu/libcrypt.so
# 安裝升級gcc
RUN sudo rm -rf /var/lib/apt/lists/*
RUN sudo apt-get update
RUN sudo apt-get -y install \
build-essential
RUN sudo mkdir -p /software/temp
RUN wget http://nginx.org/download/nginx-1.8.0.tar.gz && tar -zxvf nginx-1.8.0.tar.gz -C /software/temp
RUN wget http://zlib.net/zlib-1.2.8.tar.gz && tar -zxvf zlib-1.2.8.tar.gz -C /software/temp
RUN wget http://www.openssl.org/source/openssl-1.0.1q.tar.gz && tar -zxvf openssl-1.0.1q.tar.gz -C /software/temp
RUN wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz && tar -zxvf pcre-8.37.tar.gz -C /software/temp
RUN cd /software/temp/nginx-1.8.0 && sudo ./configure --sbin-path=/software/nginx-1.8.0/nginx --conf-path=/software/nginx-1.8.0/nginx.conf --pid-path=/software/nginx-1.8.0/nginx.pid --with-http_ssl_module --with-pcre=/software/temp/pcre-8.37 --with-zlib=/software/temp/zlib-1.2.8 --with-openssl=/software/temp/openssl-1.0.1q && sudo make && sudo make install
# 設定nginx是非daemon啟動
RUN echo 'daemon off;' >> /software/nginx-1.8.0/nginx.conf
RUN echo 'master_process off;' >> /software/nginx-1.8.0/nginx.conf
RUN echo 'error_log logs/error.log;' >> /software/nginx-1.8.0/nginx.conf
# 設定 NGINX 的環境變數,若讀者有其他的環境變數需要設定,也可以在這裡新增。
ENV NGINX_HOME /software/nginx-1.8.0
# 掛載/logstash目錄
VOLUME ["/logstash"]
# 容器需要開放Nginx 80埠
EXPOSE 80
# 執行supervisord來同時執行多個命令,使用 supervisord 的可執行路徑啟動服務。
CMD ["/usr/bin/supervisord"]
elk_log_agent的supervisord.conf配置檔案
# 配置檔案包含目錄和程序
# 第一段 supervsord 配置軟體本身,使用 nodaemon 引數來執行。
# 第二段包含要控制的 2 個服務。每一段包含一個服務的目錄和啟動這個服務的命令。
[supervisord]
nodaemon=true
[program:sshd]
command=/usr/sbin/sshd -D
[program:nginx]
command=/software/nginx-1.8.0/nginx -c /software/nginx-1.8.0/nginx.conf
[program:logstash]
# 指定配置檔案時,一定要使用絕對路徑,相對路徑是不好用的,這個坑已經踩過兩次了。。
command=/software/logstash-1.5.4/bin/logstash -f /logstash/logstash_agent.conf
elk_log_agent的控制檯終端
# 構建映象
$ docker build -t="birdben/elk_log_agent:v1" .
# 執行已經構件好的映象
$ docker run -p 9999:22 -p 8888:80 -t -i -v /docker/logstash:/logstash "birdben/elk_log_agent:v1"
logstash的Dockerfile檔案
############################################
# version : birdben/logstash:v1
# desc : 當前版本安裝的logstash
############################################
# 設定繼承自我們建立的 jdk7 映象
FROM birdben/jdk7:v1
# 下面是一些建立者的基本資訊
MAINTAINER birdben (191654006@163.com)
# 設定環境變數,所有操作都是非互動式的
ENV DEBIAN_FRONTEND noninteractive
# 新增 supervisord 的配置檔案,並複製配置檔案到對應目錄下面。(supervisord.conf檔案和Dockerfile檔案在同一路徑)
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# 設定 LOGSTASH 的環境變數,若讀者有其他的環境變數需要設定,也可以在這裡新增。
ENV LOGSTASH_HOME /software/logstash-1.5.4
# 複製 logstash-1.5.4 檔案到映象中(logstash-1.5.4資料夾要和Dockerfile檔案在同一路徑)
ADD logstash-1.5.4 /software/logstash-1.5.4
# 解決環境問題,否則logstash無法從log檔案中採集日誌。具體環境: Logstash 1.5, Ubuntu 14.04, Oracle JDK7
RUN ln -s /lib/x86_64-linux-gnu/libcrypt.so.1 /usr/lib/x86_64-linux-gnu/libcrypt.so
# 掛載/logstash目錄
VOLUME ["/logstash"]
# 執行supervisord來同時執行多個命令,使用 supervisord 的可執行路徑啟動服務。
CMD ["/usr/bin/supervisord"]
logstash的supervisord.conf配置檔案
# 配置檔案包含目錄和程序
# 第一段 supervsord 配置軟體本身,使用 nodaemon 引數來執行。
# 第二段包含要控制的 2 個服務。每一段包含一個服務的目錄和啟動這個服務的命令。
[supervisord]
nodaemon=true
[program:sshd]
command=/usr/sbin/sshd -D
[program:logstash]
# 指定配置檔案時,一定要使用絕對路徑,相對路徑是不好用的,這個坑已經踩過兩次了。。
command=/software/logstash-1.5.4/bin/logstash -f /logstash/logstash.conf
logstash的控制檯終端
# 構建映象
$ docker build -t="birdben/logstash:v1" .
# 執行已經構件好的映象
$ docker run -p 9999:22 -t -i -v /docker/logstash:/logstash "birdben/logstash:v1"
kibana的Dockerfile檔案
############################################
# version : birdben/kibana:v1
# desc : 當前版本安裝的kibana
############################################
# 設定繼承自我們建立的 tools 映象
FROM birdben/tools:v1
# 下面是一些建立者的基本資訊
MAINTAINER birdben (191654006@163.com)
# 設定環境變數,所有操作都是非互動式的
ENV DEBIAN_FRONTEND noninteractive
# 新增 supervisord 的配置檔案,並複製配置檔案到對應目錄下面。(supervisord.conf檔案和Dockerfile檔案在同一路徑)
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# 設定 KIBANA 的環境變數,若讀者有其他的環境變數需要設定,也可以在這裡新增。
ENV KIBANA_HOME /software/kibana-4.1.2
# 複製 kibana-4.1.2 檔案到映象中(kibana-4.1.2資料夾要和Dockerfile檔案在同一路徑)
ADD kibana-4.1.2 /software/kibana-4.1.2
# 容器需要開放Kibana的5601埠
EXPOSE 5601
# 執行supervisord來同時執行多個命令,使用 supervisord 的可執行路徑啟動服務。
CMD ["/usr/bin/supervisord"]
kibana的supervisord.conf配置檔案
# 配置檔案包含目錄和程序
# 第一段 supervsord 配置軟體本身,使用 nodaemon 引數來執行。
# 第二段包含要控制的 2 個服務。每一段包含一個服務的目錄和啟動這個服務的命令。
[supervisord]
nodaemon=true
[program:sshd]
command=/usr/sbin/sshd -D
[program:kibana]
command=/software/kibana-4.1.2/bin/kibana
kibana的控制檯終端
# 構建映象
$ docker build -t="birdben/kibana:v1" .
# 執行已經構件好的映象
$ docker run -p 9999:22 -p 5601:5601 -t -i "birdben/kibana:v1"
注意
ES和Redis如之前的文章介紹部署即可
驗證日誌收集
訪問Nginx主頁,檢視access.log中的日誌是否按照指定的日誌格式輸出,之後access.log會被log_agent收集到Redis中,如果log_indexer是可用狀態的,就會從Redis中消費掉日誌資訊,如果log_indexer是不可用的,日誌資訊就會儲存在Redis中。log_indexer從Redis中消費掉日誌後,就會在ES中建立相應地索引,最後在Kibana中進行查詢顯示
參考文章: