探索 - Elastic Stack(ELK)實時日誌分析平臺

簡介

  • Elasticsearch(更多詳情
    搜索、分析和存儲您的數據。
  • Kibana(更多詳情
    實現數據可視化。
  • Logstash(更多詳情
    Logstash 是動態數據收集管道,擁有可擴展的插件生態系統,可以與 Elasticsearch 產生強大的協同做用。
  • Beats(更多詳情
    Beats 是輕量型採集器的平臺,從邊緣機器向 Logstash 和 Elasticsearch 發送數據。
  • X-Pack(更多詳情
    X-Pack 是集成了多種便捷功能的單個插件 — security、alerting、monitoring、reporting、graph 探索和 machine learning 。
  • ES-Hadoop(更多詳情
    Elasticsearch-Hadoop (ES-Hadoop) 鏈接器將 Hadoop 海量的數據存儲和深度加工能力與 Elasticsearch 實時搜索和分析功能進行鏈接。它可以讓您快速深刻了解大數據,並讓您在 Hadoop 生態系統中更好地開展工做。

安裝順序

按照如下順序安裝 你要使用的Elastic Stack產品:html

  1. Elasticsearch
  2. X-Pack for Elasticsearch
  3. Kibana
  4. X-Pack for Kibana
  5. Logstash
  6. X-Pack for Logstash
  7. Beats
  8. Elasticsearch Hadoop

下圖爲X-PackElasticsearchKibanaLogstash中所提供的功能。java

X-pack

注: X-Pack 將於 6.3 版本起開源。( 官方說明

準備工做

一、下載所需的軟件包:官方地址node

  • 我這裏所用的版本是:6.2.4(發佈時間:2018-4-17)
  • 所涉及到的Elastic Stack軟件產品有:Elasticsearch、Kibana、Logstash、FileBeat、X-Pack
  • 下載的均是 tar.gz 的包,這樣能夠更加靈活的控制在服務器中的部署位置。
# mkdir /opt/download/elastic
# cd /opt/download/elastic
# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.4.tar.gz
# wget https://artifacts.elastic.co/downloads/kibana/kibana-6.2.4-linux-x86_64.tar.gz
# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.4-linux-x86_64.tar.gz
# wget https://artifacts.elastic.co/downloads/logstash/logstash-6.2.4.tar.gz
# wget https://artifacts.elastic.co/downloads/packs/x-pack/x-pack-6.2.4.zip

二、服務器資源linux

  • ES最小的集羣爲3個節點。
  • 這裏我以單點的形式部署介紹Elastic Stack,同時也會有對集羣模式的說明。

三、建立普通用戶
不要以root用戶運行應用程序,這裏我建立一個elastic普通用戶。nginx

# useradd elastic

四、建立目錄結構
分別建立 程序目錄、日誌目錄、數據目錄,並對elastic普通用戶受權目錄權限。web

# mkdir -p /opt/soft/elastic    
# mkdir -p /opt/log/elastic/{elasticsearch,logstash,kibana}
# mkdir -p /opt/data/elastic/{elasticsearch,logstash,kibana}

# chwon -R elastic:elastic /opt/soft/elastic
# chwon -R elastic:elastic  /opt/log/elastic
# chwon -R elastic:elastic /opt/data/elastic

五、配置java環境
訪問Oracle官網 下載JAVA
這裏我下載的版本是jdk-8u171-linux-x64.tar.gz緩存

## 解壓安裝
# tar xzf jdk-8u171-linux-x64.tar.gz -C /opt/soft/

## 配置JAVA的全局環境變量
# tail -1 /etc/profile
export PATH=/opt/soft/jdk1.8.0_171/bin:$PATH

## 從新登陸當前終端或重載環境,可直接執行java命令爲完成配置。
# . /etc/profile
# java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)

六、補充說明
本文只根據官方資料,對nginx日誌採集處理組織一個比較系統的簡要介紹,沒有針對單個產品的深刻剖析。bash

全文中,代碼字段說明:
  • ##符號開頭,註釋行
  • # 符號開頭,以超級用戶執行的命令
  • $符號開頭,以普通用戶執行的命令

安裝過程

Elastic Stack

全文會圍繞着此圖進行Elastic Stack介紹。服務器

  • Beats服務部署在應用服務器(或稱之邊緣服務器)進行數據採集。
  • Logstash服務接收數據進行解析,處理數據結構後寫入ES。
  • ElasticSearch服務搜索、分析和存儲數據。在規模較大時,ES集羣須要進行角色拆分。
  • Kibana操做 Elastic Stack 可視化 Elasticsearch 中的數據。

說明:在生產環境中每層都建議是獨立的主機,避免額外的干擾,提升每層的數據處理能力。另外,在一些網上的資料中,有的會在採集層和解析層中間加一層隊列層(隊列服務 - REDIS/MQ/Kafka),用來提升突發尖峯等異常狀況的容錯能力。實際上是非必要的,下面會在介紹Logstash時對此說明。數據結構


安裝 Elasticsearch

## 配置用戶的文件打開數及線程數
# grep "elastic" /etc/security/limits.conf
elastic - nofile  65536
elastic - nproc 4096

## 配置虛擬內存
# grep "max_map_count" /etc/sysctl.conf
vm.max_map_count = 262144
# sysctl -p

## 解壓即安裝
# su - elastic
$ tar xzf /opt/download/elastic/elasticsearch-6.2.4.tar.gz -C /opt/soft/elastic/

## 配置文件
$ cd /opt/soft/elastic/elasticsearch-6.2.4
$ cat config/elasticsearch.yml
cluster.name: elasticsearch
node.name: ${HOSTNAME}
network.host: 0.0.0.0
path.data: /opt/data/elastic/elasticsearch
path.logs: /opt/log/elastic/elasticsearch

## 安裝 X-pack 插件
$ bin/elasticsearch-plugin install file:///opt/download/elastic/x-pack-6.2.4.zip

## 啓動服務
$ bin/elasticsearch  -p elasticsearch.pid -d

## 生成 elastic、kibana、logstash_system 用戶密碼
$ bin/x-pack/setup-passwords auto

能夠直接以${...}的方式,調用系統中的環境變量。

一些重要的ES配置

來源參見: 官方說明

  • Path settings
    配置日誌、數據的存放路徑,其中數據存放路徑能夠配置成多個路徑,在這種狀況下,全部路徑都將被用於存儲數據。
  • Cluster name
    cluster.name相同的節點能夠組建成一個集羣,默認的名稱是elasticsearch,可是你應該將它更改成一個適當的名稱,它描述了集羣的目的。 確保不會在不一樣的環境中重用相同的集羣名稱,不然可能會遇到鏈接錯誤集羣的節點。
  • Node name
    在默認狀況下,elasticsearch將使用隨機生成的UUID的前七個字符做爲節點id。注意,節點id是持久化的,也就是說當節點從新啓動時不會改變,因此配置一個可讀性更高的節點名是有意義的,這裏我習慣以主機名命名。
  • Network host
    默認狀況下,elasticsearch只綁定本地迴環地址127.0.0.1,這適合在單臺服務器上部署單個開發節點。生產環境根據狀況配置爲你要監聽的實際地址,以實現集羣個節點間的通訊。
    注意:單個服務器啓動多個elasticsearch進程也能實現集羣功能,但僅適用於測試。
  • Discovery settings
    elasticsearch使用Zen Discovery自定義發現實現節點與節點的集羣創建和主選舉。在生產環境中應該配置兩個重要的發現設置。

    • discovery.zen.ping.unicast.hosts
      單播其它節點
    • discovery.zen.minimum_master_nodes
      避免腦裂,防止數據丟失,每一個主合格節點都知道必須可見的主合格節點的最小數量,以便造成集羣。最小值:(master_eligible_nodes / 2) + 1
  • Heap size
    默認狀況下,Elasticsearch告訴JVM使用最小和最大的Heap size爲1GB。生產環境中,配置Heap size是很重要的,以確保ES有足夠的堆可用。配置法則是:

    • 將最小堆大小(Xms)和最大堆大小(Xmx)設置爲相等。其目的是爲了可以在java垃圾回收機制清理完堆區後不須要從新分隔計算堆區的大小而浪費資源,能夠減輕伸縮堆大小帶來的壓力。
    • 值大小不超過物理RAM的50%,以確保內核文件系統緩存中有足夠的物理RAM。
    • 最大大小不要超過32GB。
  • Heap dump path
    RPM和Debian默認配置JVM,以將內存溢出時的堆轉儲到/var/lib/elasticsearch,若是此路徑不適合存儲堆轉儲,可修改-XX:HeapDumpPath=/var/lib/elasticsearch自定義路徑。 若是指定了文件名而不是目錄,則JVM將重複使用相同的文件; 這是一種防止堆轉儲在堆轉儲路徑中積累的機制。或者,你能夠經過配置計劃任務,按期刪除比配置的時間早的堆轉儲。
    請注意,歸檔分發默認狀況下不配置堆轉儲路徑。
  • GC logging
    默認啓用,存放路徑與ES日誌路徑一致。而且每64MB就會旋轉日誌,最多能夠消耗2GB的磁盤空間。

重要的系統配置

這裏不作過多的贅述,細節詳情參見:官方說明

  • Disable swapping
  • Increase file descriptors
  • Ensure sufficient virtual memory
  • Ensure sufficient threads
  • JVM DNS cache settings

須要瞭解的 Node 角色

  • Master-eligible node
    有資格被選爲控制集羣的主節點。主節點負責輕量級集羣範圍的操做,如建立或刪除索引、跟蹤哪些節點是集羣的一部分,以及決定將哪些切分分配給哪些節點。對於集羣健康來講,擁有一個穩定的主節點是很重要的。
  • Data node
    數據節點保存數據並執行與數據相關的操做,如CRUD、搜索和聚合。擁有專用數據節點的主要好處是主服務器和數據角色的分離。
  • Ingest node
    攝取節點可以將攝取管道應用於文檔,以便在編制索引以前轉換和豐富文檔。
  • Tribe node
    經過 tribe.* 配置部落節點。是一種特殊的協調節點,它能夠鏈接到多個集羣,並在全部鏈接的集羣中執行搜索和其餘操做。

    注意:Tribe node 從5.4.0版本起已被棄用。被 Cross Cluster Search 功能所取代,並將於 Elasticsearch 7.0 時移除。
  • Coordinating node
    若是 node 禁用了node.master、node.data、node.ingest 能力,那麼就剩下了一個協調節點,該節點只能路由請求、處理搜索減小階段,以及分發批量索引。從本質上說,只協調節點就像智能負載平衡器同樣。這樣的節點須要有足夠的內存和CPU來處理收集階段。

    注意:將太多的協調節點添加到集羣中會增長整個集羣的負擔,由於所選的主節點必須等待來自每一個節點的集羣狀態更新的確認!只協調節點的好處不該該被誇大 —— 數據節點能夠很好地服務於相同的目的。

更多細節詳情參見:官方說明


安裝 Kibana

配置爲單機部署的最簡配置。配置完啓動後可經過:http://your_server_ip:5601 訪問kibana的web服務。不要帶端口訪問的話,建議結合nginx來實現。

## 解壓即安裝
$ tar xzf /opt/download/elastic/kibana-6.2.4-linux-x86_64.tar.gz -C /opt/soft/elastic
$ cd /opt/soft/elastic/kibana-6.2.4-linux-x86_64

## 安裝 X-pack 插件
$ bin/kibana-plugin install file:///opt/download/elastic/x-pack-6.2.4.zip

## 配置文件
$ grep -Ev '^#|^$' config/kibana.yml 
server.host: "0.0.0.0"
elasticsearch.username: "kibana"
elasticsearch.password: "Your****Pass****For****Kibana"
pid.file: /opt/log/elastic/kibana/kibana.pid

## 啓動服務
$ nohup bin/kibana &> /dev/null &

安裝 Logstash

## 解壓即安裝
$ tar xzf /opt/download/elastic/logstash-6.2.4.tar.gz -C /opt/soft/elastic/
$ cd /opt/soft/elastic/logstash-6.2.4/

## 安裝 X-pack 插件
$ bin/logstash-plugin install file:///opt/download/elastic/x-pack-6.2.4.zip

## 主配置文件
$ grep -Ev "^#|^$" config/logstash.yml 
node.name: ${HOSTNAME}
path.data: /opt/data/elastic/logstash
config.reload.automatic: true
path.logs: /opt/log/elastic/logstash
xpack.monitoring.elasticsearch.url: ["http://your_es_ip:9200"] 
xpack.monitoring.elasticsearch.username: "logstash_system" 
xpack.monitoring.elasticsearch.password: "your***logstash***pass"

接下來配置work文件,用於解析處理數據。

$ mkdir workconfig
$ cat workconfig/test-nginx.conf
input {
  beats {
    port => 5044
    host => "0.0.0.0"
  }
}
filter {
  if [fileset][module] == "nginx" {
    if [fileset][name] == "access" {
      grok {
        match => { "message" => ["%{IPORHOST:[nginx][access][remote_ip]} - %{DATA:[nginx][access][user_name]} \[%{HTTPDATE:[nginx][access][time]}\] \"%{WORD:[nginx][access][method]} %{DATA:[nginx][access][url]} HTTP/%{NUMBER:[nginx][access][http_version]}\" %{NUMBER:[nginx][access][response_code]} %{NUMBER:[nginx][access][body_sent][bytes]} \"%{DATA:[nginx][access][referrer]}\" \"%{DATA:[nginx][access][agent]}\""] }
        remove_field => "message"
      }
      mutate {
        add_field => { "read_timestamp" => "%{@timestamp}" }
      }
      date {
        match => [ "[nginx][access][time]", "dd/MM/YYYY:H:m:s Z" ]
        remove_field => "[nginx][access][time]"
      }
      useragent {
        source => "[nginx][access][agent]"
        target => "[nginx][access][user_agent]"
        remove_field => "[nginx][access][agent]"
      }
      geoip {
        source => "[nginx][access][remote_ip]"
        target => "[nginx][access][geoip]"
      }
    }
    else if [fileset][name] == "error" {
      grok {
        match => { "message" => ["%{DATA:[nginx][error][time]} \[%{DATA:[nginx][error][level]}\] %{NUMBER:[nginx][error][pid]}#%{NUMBER:[nginx][error][tid]}: (\*%{NUMBER:[nginx][error][connection_id]} )?%{GREEDYDATA:[nginx][error][message]}"] }
        remove_field => "message"
      }
      mutate {
        rename => { "@timestamp" => "read_timestamp" }
      }
      date {
        match => [ "[nginx][error][time]", "YYYY/MM/dd H:m:s" ]
        remove_field => "[nginx][error][time]"
      }
    }
  }
}
output {
  elasticsearch {
    hosts => your_es_ip
    manage_template => false
    index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
  }
}

指定work配置文件,啓動服務。

$ bin/logstash -f workconfig/test-nginx.conf

Logstash工做有三個階段:inputs → filters → outputs
上面示例中的work配置,用於接收beats發來的nginx日誌事件,而後進行字段處理實現關鍵字匹配,最後輸出到ES並創建事件索引。每個Logstash插件都足夠的強大,更多細節性的插件說明請參閱官網:Input Plugins , Filter Plugins , Output Plugins , Codec Plugins.

前面我有提到說Beats數據採集層與Logstash解析層之間不須要額外的增長隊列層(緩衝層),緣由是由於:
假如 Logstash 節點發生故障,Logstash 會經過持久化隊列來保證運行中的事件至少一次被送達(at-least-once delivery)。那些未被正常處理的消息會被送往死信隊列(dead letter queue)以便作進一步處理。因爲具有了這種吸取吞吐量的能力,因此如今無需採用額外的隊列層,Logstash 就能平穩度太高峯期。


安裝 Filebeat

## 解壓即安裝
$ tar xzf /opt/download/elastic/filebeat-6.2.4-linux-x86_64.tar.gz -C /opt/soft/elastic/
$ cd /opt/soft/elastic/filebeat-6.2.4-linux-x86_64/

## 配置文件
$ grep -Pv "^[ ]*#|^$" filebeat.yml 
filebeat.prospectors:
- type: log
  enabled: false
  paths:
    - /var/log/*.log
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: true
setup.template.settings:
  index.number_of_shards: 3
output.logstash:
  hosts: ["your_logstash_ip:5044"]

使用filebeats模塊功能

## 啓用nginx模塊
./filebeat modules enable nginx

## 模塊配置
$ grep -Pv "^[ ]*#|^$" modules.d/nginx.yml 
- module: nginx
  access:
    enabled: true
    var.paths: 
      - /path/to/log/nginx/access.log*
  error:
    enabled: true
    var.paths: 
      - /path/to/log/nginx/error.log*

啓動服務

$ filebeat

尾聲

至此,整個配置過程完畢。

參考資料

相關文章
相關標籤/搜索