01 . ELK Stack簡介原理及部署應用

men發表於2020-06-20

簡介

ELK並不是一款軟體,是一整套解決方案,是由ElasticSearch,Logstash和Kibana三個開源工具組成:通常是配合使用,而且先後歸於Elastic.co公司名下,簡稱ELK協議棧.

日誌的收集和處理

在日常運維工作中,對於系統和業務日誌的處理尤為重要。日誌主要包括系統日誌,應用日誌,應用程式日誌和安全日誌。系統運維和開發人員可以通過日誌瞭解伺服器軟硬體資訊,檢查配置過程中的錯誤及錯誤發生的原因。經常分析日誌可以瞭解伺服器的負荷,效能安全性,從而及時採取措施糾正錯誤。

通常,日誌被分散的儲存在不同的裝置上,如果你管理上百臺伺服器,你還在使用依次登入每臺機器的傳統方法查閱日誌是很繁瑣且效率低下的。當務之急是使用集中化的日誌管理,例如: 開源的syslog,將所有伺服器上的日誌收集彙總。集中化管理日誌後,日誌的統計和檢索又成為一件比較麻煩的事情.

一個完整的集中式日誌系統,是離不開以下幾個主要特點的

# 1. 收集 - 能夠收集多種來源的日誌資料
# 2. 傳輸 - 能夠穩定的把日誌資料傳輸到中央系統
# 3. 儲存 - 如何儲存日誌資料
# 4. 分析 - 可以支援UI分析
# 5. 警告 - 能夠提供錯誤報告
日誌分析工具

1 . grep,awk,wc,rsyslog,syslog-ng: 對於龐大的機器數量,要達到要求更高的查詢,排序和統計等使用這樣的方法難免有點力不從心.

2 . 商業化的splunk: Splunk作為企業級的分散式機器資料的平臺,擁有強大的分散式配置,包括跨資料中心的叢集配置,Splunk提供兩種叢集,indexer叢集和Search Head叢集.具體情況請看Splunk文章.

3 . 開源的:

# 1 FaceBook公司的Scribe
# 2 Apache的Chukwa
# 3 Linkedin的Kafka
# 4 Cloudera的Fluentd
# 5 ELK
Elasticsearch

ElasticSearch是一個基於Lucene的開源分散式搜尋伺服器.是一個實時的分散式搜尋和分析引擎,他可以用於全文搜尋,結構化搜尋以及分析,他是一個建立在全文搜尋引擎Apache lucene基礎上的搜尋引擎,使用Java語言編寫,並作為Apache許可條款下的開放原始碼釋出,是第二流行的企業搜尋引擎。設計用於雲端計算中,能夠達到實時搜尋,穩定,可靠,快速,安裝使用方便,在elasticsearch中,所有節點的資料是均等的.

主要特點

# 1 實時分析
# 2 分散式實時檔案儲存,並將每一個欄位都編入索引
# 3 文件導向,所有的物件全部是文件
# 4 高可用性,易擴充套件,支援叢集(cluster),分片和複製(hards和Replicas
# 5 介面友好,支援JSON

Logstash

logstash是一個具有實時渠道能力的資料收集引擎,使用JRuby語言編寫,其做著是世界著名的運維工程師喬丹西塞,他是一個完全開源工具,可以對你的日誌進行收集,過濾

# 主要特點:
#        1> 幾乎可以訪問任何資料
#        2> 可以和多種外部應用結合
#        3> 支援彈性擴充套件

# 它主要由三個主要部分組成,見下圖.
#        1> Shipper - 傳送日誌資料
#        2> Broker -  收集資料,預設內建Redis
#        3> Indexer - 資料寫入

Kibana

Kibana是一款基於Apache開源協議,使用JavaScript語言編寫,為Elasticsearch提供分析和視覺化的Web平臺,他可以在Elasticsearch的索引中查詢,互動資料,並生成各種維度的表圖.

Filebeat

ELK協議棧的新成員,一個輕量級開源日誌資料蒐集器,基於Logstash-Forwarder原始碼開發,是對他的替代。是需要在採集日誌資料server上安裝filebeat,並指定日誌目錄或日誌檔案後,Filebeat就能讀取資料,迅速傳送到Logstash進行解析,亦或直接傳送到Elasticsearch進行集中式儲存和分析

ELK協議棧體系結構

最簡單架構

在這種架構中,只有一個Logstash,Elasticsearch和Kibana例項。Logstash通過輸入外掛從多種資料來源(比如日誌檔案,標準輸入Stdin等)獲取資料,再經過過濾外掛加工資料,然後經過Elasticsearch輸出外掛輸出到Elasticsearch,通過Kibana展示.

Logstash作為日誌收集器

這種架構是對上面架構的擴充套件,把一個Logstash資料蒐集節點擴充套件到多個,分佈於多臺機器,將解析好的資料傳送到Elasticsearch server進行儲存,最後在Kibana查閱,生成日誌報表等.

這種結構因為需要在各個伺服器上部署Logstash,而它比較消耗CPU和記憶體資源,所以比較適合資源豐富的伺服器,否則容易造成伺服器效能下降,甚至可能導致無法正常工作.

Beats作為日誌蒐集器

這種架構引入Beats作為日誌蒐集器。目前Beats包括四種

# 1> Packetbeat (蒐集網路流量資料)
# 2> Topbeat (蒐集系統,程式和檔案系統級別的CPU和記憶體使用情況等資料)
# 3> Filebeat (蒐集檔案資料)
# 4> Winlogbeat (蒐集Windows事件日誌資料)

Beats將蒐集到的資料傳送到Logstash,經Logstash解析,過濾後,將其傳送到Elasticsearch儲存,並由Kibana呈現給使用者.

這種架構解決了Logstash在各伺服器節點上佔用系統資源高的問題,相比Logstash,Beats所佔系統的CPU和記憶體幾乎可以省略不計,另外,Beats和Logstash之間保持SSL/TLS加密傳輸,客戶端和伺服器雙向認證,保證了通訊安全

因此這種架構適合對資料安全性要求較高,同時各伺服器效能比較敏感的場景.

基於Filebeat架構的配置部署詳解

前面提到Filebeat已經完全替代了Logstash-Forwarder 成為新一代的日誌採集器,同時鑑於它輕量、安全等特點,越來越多人開始使用它。這個章節將詳細講解如何部署基於 Filebeat 的 ELK 集中式日誌解決方案,具體架構見下圖.

引入訊息佇列機制的架構

Beats 還不支援輸出到訊息佇列,所以在訊息佇列前後兩端只能是 Logstash 例項。這種架構使用 Logstash 從各個資料來源蒐集資料,然後經訊息佇列輸出外掛輸出到訊息佇列中。目前 Logstash 支援 Kafka、Redis、RabbitMQ 等常見訊息佇列。然後 Logstash 通過訊息佇列輸入外掛從佇列中獲取資料,分析過濾後經輸出外掛傳送到 Elasticsearch,最後通過 Kibana 展示。見下圖

這種架構適合於日誌規模比較龐大的情況,但由於Logstash日誌解析節點和Elasticsearch的符合比較重,可將他們配置為叢集模式,以分擔負荷,引入訊息佇列,均衡了網路傳輸,從而降低了網路閉塞,尤其丟失資料的可能性,但依然存在Logstash佔用系統資源過多的問題.

部署

架構圖

999

List
Package:
# elasticsearch-7.2.0-linux-x86_64.tar.gz
# filebeat-7.2.0-x86_64.rpm
# jdk-8u121-linux-x64.rpm
# kibana-7.2.0-linux-x86_64.tar.gz
# logstash-7.2.0.tar.gz
IP hostname 軟體 配置要求 網路 備註
192.168.144.131 ES/資料儲存 elasticsearch-7.2 記憶體最低2GB/硬碟40GB Nat,內網
192.168.144.128 Kibana/UI展示 kibana-7.2****logstash-7.2 記憶體最低2GB/硬碟40GB Nat,內網
192.168.144.135 Filebeat/資料採集 Filebeat-7.2/nginx 記憶體最低2GB/硬碟40GB Nat,內網
注意事項
# 1.一定要對時,時間校正,不然日誌出不來
# 2.啟動Elasticsearch必須切換成所建立的ELK使用者啟動,不然ES處於安全目的,會啟動報錯.
# 3.日誌從Filebeat到Logstash再到ES檢索到Kibana的讀取速度取決於機器配置
Elasticsearch安裝
# 1.初始化
setenforce 0
sed -i '/^SELINUX=/ s/enforcing/disabled/'  /etc/selinux/config
systemctl stop firewalld
systemctl disable firewalld
sed -i '/^GSSAPIAu/ s/yes/no/' /etc/ssh/sshd_config
sed -i '/^#UseDNS/ {s/^#//;s/yes/no/}' /etc/ssh/sshd_config
curl -o /etc/yum.repos.d/163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo &>/dev/null
curl  -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    yum -y install ntpdate
    ntpdate -b  ntp1.aliyun.com

# 2.設定Hostname解析
hostnamectl set-hostname elk-1
        ## 修改/etc/hosts 增加如下內容
        192.168.144.131     elk-1

# 4.java安裝
# rpm -ivh jdk-8u121-linux-x64.rpm
# 如果使用rpm請到/etc/profile加上
# JAVA_HOME=/usr/java/jdk1.8.0_121
# export PATH=$PATH:$JAVA_HOME/bin
yum -y install java-1.8.0-openjdk.x86_64

# 5.建立使用者和組並準備相關目錄並授權
groupadd  elk
useradd  elk  -g  elk
mkdir  -pv  /data/elk/{data,logs}
chown  -R  elk:elk  /data/elk/

# 6.軟體包解壓、授權
# 上傳軟體包
            通過scp 或者FTP方式上傳到/opt下
# 解壓軟體包到/opt目錄
tar xvf elasticsearch-7.2.0-linux-x86_64.tar.gz -C  /opt/
# 授權
chown  -R  elk:elk  /opt/elasticsearch-7.2.0/  # 軟體包名

# 7.修改elk配置檔案
[root@elk-1 ~]# vim /opt/elasticsearch-7.2.0/config/elasticsearch.yml
        # 叢集名
        cluster.name:  elk
        # 節點名
        node.name: node-1
        # 儲存資料
        path.data:  /data/elk/data
        # 存放日誌
        path.logs:  /data/elk/logs
        # 鎖記憶體,儘量不使用交換記憶體
        bootstrap.memory_lock:  false
        # 網路地址
        network.host: 0.0.0.0
        http.port: 9200
        # 發現叢集hosts
        discovery.seed_hosts: ["elk-1"]
        # 設定叢集master節點
        cluster.initial_master_nodes: ["node-1"]

# 8.修改/etc/security/limits.conf
        # *號不是註釋
        * soft nproc 65535
        * hard nproc 65535
        * soft nofile 65535
        * hard nofile 65535

ulimit -n 65535
ulimit -u 20480

# 9.修改/etc/sysctl.conf
        echo "vm.max_map_count=262144" >> /etc/sysctl.conf
        sysctl -p

# 10.啟動ES並檢查叢集健康狀態
nohup runuser -l elk -c '/bin/bash /opt/elasticsearch-7.2.0/bin/elasticsearch' &
    # 這裡為了省事直接用的nohup 可以使用supervisord 對程式進行管理
[root@elk-1 ~]# curl -XGET 'elk-1:9200/_cluster/health?pretty'
{
  "cluster_name" : "elk",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 0,
  "active_shards" : 0,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}
Kibana安裝
# 1.解壓Kibana安裝包
tar xvf kibana-7.2.0-linux-x86_64.tar.gz  -C /opt/

# 2.修改Kibana配置檔案
server.port:  5601   # Port
server.host:  0.0.0.0   # 訪問限制
elasticsearch.hosts: ["http://192.168.144.131:9200"]        # ES主機IP:Port

# 3.啟動命令
[root@kibana ~]# nohup /opt/kibana-7.2.0-linux-x86_64/bin/kibana --allow-root &
[1] 14650
    # tailf nohup.out 即可實時檢視日誌
Logstash安裝
[root@kibana ~]# rpm -ivh jdk-8u121-linux-x64.rpm
[root@kibana ~]# tar xvf logstash-7.2.0.tar.gz  -C /opt/
[root@kibana opt]# vim /opt/nginx.yml
# Sample Logstash configuration for creating a simple
# # Beats -> Logstash -> Elasticsearch pipeline.
#
input {
    beats {
        port => 5044
        }
}

filter {
    grok {
        match => ["message","%{DATA:log_date} %{WORD:method} %{TIME:log_localtime} %{HOSTNAME:host_name} %{WORD:workd}\[%{WORD:ls}\]\: %{DATA:log_date} %{TIME:log_localtime2} %{WORD:year_tmp}\: %{WORD:name_2}\: %{WORD:request_leixin} %{WORD:request_num}\, %{WORD}\: %{WORD:app_id}\, %{WORD}\: %{IP:ip}\, %{WORD}\: %{INT}\, %{WORD}\: %{USERNAME:device_id}"]
        }
}

output {
    elasticsearch {
       hosts => ["http://192.168.144.131:9200"]
       index => "app_log-%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
     }
}




# 啟動 (如果起不來或者報錯一般都是配置檔案語法錯誤之類的)
    /opt/logstash-7.2.0/bin/logstash -f /opt/配置檔名.yml
    ## 後臺執行
    nohup  /opt/logstash-7.2.0/bin/logstash -f /opt/配置檔名.yml  &
Filebeat安裝
# 安裝filebeat RPM包
[root@filebeat ~]# rpm -ivh filebeat-7.2.0-x86_64.rpm

# 修改配置檔案:
Filebeat到Logstash
(vim /etc/filebeat/filebeat.yml) shift + : 輸入set nu 顯示行號
24:   enabled:  true                         # 更改為true以啟用輸入配置
28:   - /data/*.log                   # 替換為要抓取的日誌檔案路徑,如果抓取nginx日誌,修改為/var/log/nginx/access.log,如果是日誌伺服器,在下面再加上多行其他地方的日誌目錄即可
73:  reload.enabled:  true                  # 啟動Filebeat模組
148: output.elasticsearch:                  # 加上註釋;
150:  hosts: ["localhost:9200"]              # 加上註釋;
158: output.logstash:                       # 去掉註釋;
160: hosts: ["192.168.144.128<logstash>:5044"]       # 去掉註釋,並修改localhost為logstash機器IP及對應埠號;


# 測試配置檔案並啟動
filebeat  test  config  -e
systemctl  start filebeat && systemctl  enable filebeat

[root@filebeat ~]# cat /data/nginx.log        # 建立該目錄及檔案,加入兩行日誌.
Sep  2 16:00:18 cc-prd-3-tk-13-pcs1 pcs[16118]: Mon Sep  2 16:00:18 2019: PCS: recv request, app_id: app_1w5B6O4R2o1k881k12177, ip: 223.104.145.136, os: 0, device_id: 02c3864050502d43dc514905133bcc9c
Sep  2 16:00:18 cc-prd-3-tk-13-pcs1 pcs[16118]: Mon Sep  2 16:00:18 2019: PCS: recv request, app_id: app_1w5B6O4R2o1k881k12177, ip: 223.104.145.136, os: 0, device_id: 02c3864050502d43dc514905133bcc9c

收集的日誌需要把有用的資訊做切割,讓相應欄位成為獨立的個一個欄位,而不是一整條日誌是一個欄位,那樣就沒法做分析,而做資料來源切割很重要,否則日誌會過不來,或者日誌做不了分析,統計.

可以把源日誌拿到kibana上的grok上做切割,直到Structured Data能出現你想要的欄位就可以放到logstash的配置檔案中

相關文章