單機部署 ELK

對於一個體量不大的系統,運行在單機上的 ELK 就足以勝任日誌的處理任務了。本文介紹如何在單臺服務器上安裝並配置 ELK(elalasticsearch + logstash + kibana),並最終經過 filebeat 把日誌數據發送給日誌服務器(ELK)。總體的架構以下圖所示(此圖來自互聯網):java

本文的演示環境爲 Ubuntu Server 18.04,ELK 和 filebeat 的版本都是 6.2.4。瀏覽器

安裝 java 運行時

咱們假設您已經有一臺運行 Ubuntu Server 18.04 的主機了,因此安裝步驟從 java 運行時開始。必須安裝 java 運行時是由於 elasticsearch 和 logstash 都是 Java 程序。下面的命令安裝 openjdk8:bash

$ apt update
$ apt install -y openjdk-8-jre-headless

安裝完成後檢查一下安裝結果:服務器

$ java -version

安裝 elasticsearch

能夠經過下面的命令安裝 elasticsearch 6.2.4:架構

$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
$ sudo echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list
$ sudo apt update
$ sudo apt install -y elasticsearch=6.2.4
$ sudo systemctl daemon-reload
$ sudo systemctl enable elasticsearch.service

安裝 kibana

能夠經過下面的命令安裝 kibana 6.2.4:less

$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
$ sudo echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | tee -a /etc/apt/sources.list.d/elastic-6.x.list
$ sudo apt update
$ sudo apt install -y kibana=6.2.4
$ sudo systemctl daemon-reload
$ sudo systemctl enable kibana.service

安裝 logstash

筆者在經過上面的方式安裝 logstash 6.2.4 的時候發生了錯誤,說是找不到 logstash 6.2.4:curl

因此直接從官網下載了 6.2.4 的安裝包經過下面的命令進行本地安裝:elasticsearch

$ sudo apt install ./logstash-6.2.4.deb

$ sudo systemctl daemon-reload
$ sudo systemctl enable logstash.service

完整的安裝腳本

能夠經過下面的腳本一次完成 elasticsearch、kibana 和 logstash 的安裝:學習

#!/bin/bash
# sudo ./installelk6.2.4.u1804.sh
 
apt update
apt install -y openjdk-8-jre-headless
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add -
echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | tee -a /etc/apt/sources.list.d/elastic-6.x.list

apt update

apt install -y elasticsearch=6.2.4
apt install -y kibana=6.2.4
apt install -y ./logstash-6.2.4.deb
 
systemctl daemon-reload
systemctl enable elasticsearch.service
systemctl enable logstash.service
systemctl enable kibana.service

把上面的內容保存在 installelk6.2.4.u1804.sh 文件中,和下載的 logstash-6.2.4.deb 文件放在同一個目錄下,並進入到該目錄中,執行下面的命令進行安裝:測試

$ chomd +x installelk6.2.4.u1804.sh
$ sudo ./installelk6.2.4.u1804.sh

爲 elasticsearch 掛載一個大磁盤

elasticsearch 須要大容量的存儲設備來保存日誌數據,因此咱們這裏單獨添加一塊 1T 的磁盤來保存日誌數據。
先在系統的根目錄下建立 esdata 目錄做爲磁盤的掛載點,elasticsearch 中的數據和自身的日誌將會保存到這個目錄中:

$ sudo mkdir /esdata

咱們添加的磁盤的文件設備名稱爲 /dev/sdb,下面就把磁盤掛載到 /esdata 目錄。
先使用 fdisk 命令對磁盤進行分區:

$ (echo n; echo p; echo 1; echo ; echo ; echo w) | sudo fdisk /dev/sdb

而後使用 mkfs 命令將文件系統寫入分區:

$ sudo mkfs -t ext4 /dev/sdb1

最後把新的磁盤分區掛載到 /esdata 裝載新磁盤使其在操做系統中可訪問:

$ sudo mount /dev/sdb1 /esdata

查看掛載完成後的文件系統:

$ df -h 

接下來設置 elasticsearch 用戶做爲該目錄的全部者,這樣就 elasticsearch 就能往目錄下寫文件了:

$ sudo chown elasticsearch:elasticsearch /esdata
$ sudo chmod 750 /esdata

設置開機自動掛載

如今掛載的文件系統 /esdata 會在系統重啓後丟掉,所以須要設置在開機時自動掛載這個文件系統。先經過下面的命令找到設備的 UUID:

$sudo -i blkid

輸出的內容爲相似於下面的一些行,其中的 UUID 是咱們須要的:

/dev/sdb1: UUID="db048fa3-903b-4b85-a7ab-01c920283eeb" TYPE="ext4" PARTUUID="b0261bed-01"

在 /etc/fstab 文件中添加相似於如下內容的行,其中的 UUID 就是從上面得來的:

UUID=db048fa3-903b-4b85-a7ab-01c920283eeb /esdata  ext4    defaults,nofail,barrier=0   1  2

這樣的設置完成後,文件系統會在開機時自動掛載。

修改 elasticsearch 數據和日誌文件的存儲位置
在 /etc/elasticsearch/elasticsearch.yml 文件中找 path.data 和 path.logs 的設置,並修改以下:

# ----------------------------------- Paths ------------------------------------
# Path to directory where to store the data (separate multiple locations by comma):
path.data: /esdata
#
# Path to log files:
path.logs: /esdata

配置 kibana

kibana 服務默認監聽的端口號修爲 5601,可是默認只有在本機才能訪問!
要取消對訪問者 IP 地址的限制,須要修改配置文件 /etc/kibana/kibana.yml 中的 server.host,把默認值 localhost 改成 0.0.0.0:

#server.host: "localhost"
server.host: "0.0.0.0"

配置 logstash

logstash 的配置文件爲 /etc/logstash/logstash.yml 默認不須要修改。在 /etc/logstash/conf.d 目錄下添加配置文件 beat2es.conf,內容以下:

input{
    beats{
        port => 5044
    }
}
output {
    elasticsearch {
        hosts => ["localhost:9200"]
        index => "beat-test-%{+YYYY.MM.dd}"
        sniffing => true
        template_overwrite => true
    }
}

該配置會讓 logstash 服務監聽 5044 端口接收數據:

*:5044

到此爲止,咱們已經完成了 elasticsearch、kibana 和 logstash 的安裝和配置,下面啓動這些服務:

$ sudo systemctl start elasticsearch.service
$ sudo systemctl start kibana.service
$ sudo systemctl start logstash.service

安裝 filebeat

假設咱們也在 Ubuntu Server 18.04 的環境中安裝 filebeat 6.2.4。先從官網下載 filebeat 6.2.4 deb 包,或者直接運行下面的命令進行安裝:

$ curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.4-amd64.deb
$ sudo dpkg -i ./filebeat-6.2.4-amd64.deb
$ sudo systemctl daemon-reload
$ sudo systemctl enable filebeat.service

驗證安裝:

$ filebeat version
filebeat version 6.2.4 (amd64), libbeat 6.2.4

配置 filebeat

配置 filebeat 從文件收集日誌
編輯配置文件 /etc/filebeat/filebeat.yml,在 filebeat.prospectors 段修改 type 爲 log 中的內容:

- type: log
  # Change to true to enable this prospector configuration.
  enabled: true
  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    - /home/nick/work/test.log

把日誌發送給 logstash
編輯配置文件 /etc/filebeat/filebeat.yml,在 output.logstash 段修改配置 中的內容:

output.logstash:
  # The Logstash hosts
  hosts: ["your log server ip:5044"]

多行事件編碼(合併多行到一條記錄)
在 filebeat.prospectors 配置塊中添加下面的配置:

### Multiline options
multiline.pattern: '^\['
multiline.negate: true
multiline.match: after

註釋掉 output.elasticsearch
同時要把 output.elasticsearch 的配置註釋掉。

#output.elasticsearch:
  # Array of hosts to connect to.
  #hosts: ["localhost:9200"]

最後啓動 filebeat 服務:

$ sudo systemctl start filebeat.service

測試一下

經過 echo 向 /home/nick/work/test.log 文件中追加 '[' 開頭的行模擬日誌記錄:

echo "[exception:]" >> work/test.log
echo "  at xxx" >> work/test.log
echo "  at xxx" >> work/test.log
echo "[OK]" >> work/test.log 

"  at" 開頭的行用來模擬程序中的異常堆棧。

在瀏覽器中打開 kibana,添加 beat-test* 模式的索引就能夠看到日誌記錄了:

因爲咱們在 filebeat 的配置中設置了 multiline 處理,因此相似 "  at" 開頭的行會被認爲是異常堆棧從而合併到一條記錄中:

這樣的設置在故障調查時會讓異常堆棧看起來更友好些!

總結

ELK 自己是個體量比較大的日誌系統(固然也能夠用來幹其它的事情),安裝和配置都會有些坑。本文只是介紹如何部署一個袖珍的 demo 環境,方便你們開始瞭解和學習 ELK。

相關文章
相關標籤/搜索