1. 程式人生 > >Docker實戰(十一):Docker安裝ELK環境(二)

Docker實戰(十一):Docker安裝ELK環境(二)

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中進行查詢顯示

參考文章: