互联网亿级日志实时分析平台,一个码农半小时就可以搞定,只因ELK
一,前言
人們常常說數據如金,可是,能被利用起的數據,才是“金”。而互聯網的數據,常常以日志的媒介的形式存在,并需要從中提取其中的"數據"。
從這些數據中,我們可以做用戶畫像(每個用戶都點了什么廣告,對哪些開源技術感興趣),安全審計,安全防護(如果1小時內登錄請求數到達一定值就報警),業務數據統計(如開源中國每天的博客數是多少,可視化編輯格式和markdown格式各占比例是多少)等等。
之所以能做這些,是因為用戶的所有的行為,都將被記錄在nginx日志中或其它web服務器的日志中。日志分析要做的就是將這些日志進行結構化,方便我們的業務人員快速查詢。日志分析平臺要做的就是這些。
說完這些,你是不是覺得日志分析平臺很難做,需要十人的團隊加班幾個月才能完成?
自從有了Elasticsearch、Logstash、Kibana,俗稱ELK,小公司也可以很輕松地做日志分析了。說白了,1天幾G的日志,ELK完全可以吃得消。就像標題說的,只需要1個人半小時就可以搭建好了。
二,集中式日志分析平臺特點
- 收集-能夠采集多種來源的日志數據
- 傳輸-能夠穩定的把日志數據傳輸到中央系統
- 存儲-如何存儲日志數據
- 分析-可以支持 UI 分析
- 警告-能夠提供錯誤報告,監控機制 ELK完美的解決上述場景。
三,ELK Stack 簡介
ELK 不是一款軟件,而是 Elasticsearch、Logstash 和 Kibana 三種軟件產品的首字母縮寫。這三者都是開源軟件,通常配合使用,而且又先后歸于 Elastic.co 公司名下,所以被簡稱為 ELK Stack。根據 Google Trend 的信息顯示,ELK Stack 已經成為目前最流行的集中式日志解決方案。
?
- Elasticsearch:分布式搜索和分析引擎,具有高可伸縮、高可靠和易管理等特點?;?Apache Lucene 構建,能對大容量的數據進行接近實時的存儲、搜索和分析操作。通常被用作某些應用的基礎搜索引擎,使其具有復雜的搜索功能;
- Logstash:數據收集引擎。它支持動態的從各種數據源搜集數據,并對數據進行過濾、分析、豐富、統一格式等操作,然后存儲到用戶指定的位置;
- Kibana:數據分析和可視化平臺。通常與 Elasticsearch 配合使用,對其中數據進行搜索、分析和以統計圖表的方式展示;
- Filebeat:ELK 協議棧的新成員,一個輕量級開源日志文件數據搜集器,基于 Logstash-Forwarder 源代碼開發,是對它的替代。在需要采集日志數據的 server 上安裝 Filebeat,并指定日志目錄或日志文件后,Filebeat 就能讀取數據,迅速發送到 Logstash 進行解析,亦或直接發送到 Elasticsearch 進行集中式存儲和分析。
四,ELK 常用架構及使用場景
最簡單架構
在這種架構中,只有一個 Logstash、Elasticsearch 和 Kibana 實例。Logstash 通過輸入插件從多種數據源(比如日志文件、標準輸入 Stdin 等)獲取數據,再經過濾插件加工數據,然后經 Elasticsearch 輸出插件輸出到 Elasticsearch,通過 Kibana 展示。詳見圖 1。 圖 1. 最簡單架構
這種架構非常簡單,使用場景也有限。初學者可以搭建這個架構,了解 ELK 如何工作。
Logstash 作為日志搜集器
這種架構是對上面架構的擴展,把一個 Logstash 數據搜集節點擴展到多個,分布于多臺機器,將解析好的數據發送到 Elasticsearch server 進行存儲,最后在 Kibana 查詢、生成日志報表等。詳見圖 2。 圖 2. Logstash 作為日志搜索器
這種結構因為需要在各個服務器上部署 Logstash,而它比較消耗 CPU 和內存資源,所以比較適合計算資源豐富的服務器,否則容易造成服務器性能下降,甚至可能導致無法正常工作。
Beats 作為日志搜集器
這種架構引入 Beats 作為日志搜集器。目前 Beats 包括四種:
?
- Packetbeat(搜集網絡流量數據);
- Topbeat(搜集系統、進程和文件系統級別的 CPU 和內存使用情況等數據);
- Filebeat(搜集文件數據);
- Winlogbeat(搜集 Windows 事件日志數據)。
Beats 將搜集到的數據發送到 Logstash,經 Logstash 解析、過濾后,將其發送到 Elasticsearch 存儲,并由 Kibana 呈現給用戶。詳見圖 3。
圖 3. Beats 作為日志搜集器
這種架構解決了 Logstash 在各服務器節點上占用系統資源高的問題。相比 Logstash,Beats 所占系統的 CPU 和內存幾乎可以忽略不計。另外,Beats 和 Logstash 之間支持 SSL/TLS 加密傳輸,客戶端和服務器雙向認證,保證了通信安全。 因此這種架構適合對數據安全性要求較高,同時各服務器性能比較敏感的場景。
引入消息隊列機制的架構
這種架構使用 Logstash 從各個數據源搜集數據,然后經消息隊列輸出插件輸出到消息隊列中。目前 Logstash 支持 Kafka、Redis、RabbitMQ 等常見消息隊列。然后 Logstash 通過消息隊列輸入插件從隊列中獲取數據,分析過濾后經輸出插件發送到 Elasticsearch,最后通過 Kibana 展示。詳見圖 4。
圖 4. 引入消息隊列機制的架構
這種架構適合于日志規模比較龐大的情況。但由于 Logstash 日志解析節點和 Elasticsearch 的負荷比較重,可將他們配置為集群模式,以分擔負荷。引入消息隊列,均衡了網絡傳輸,從而降低了網絡閉塞,尤其是丟失數據的可能性,但依然存在 Logstash 占用系統資源過多的問題。
基于 Filebeat 架構的配置部署詳解
前面提到 Filebeat 已經完全替代了 Logstash-Forwarder 成為新一代的日志采集器,同時鑒于它輕量、安全等特點,越來越多人開始使用它。這個章節將詳細講解如何部署基于 Filebeat 的 ELK 集中式日志解決方案,具體架構見圖 5。
圖 5. 基于 Filebeat 的 ELK 集群架構
因為免費的 ELK 沒有任何安全機制,所以這里使用了 Nginx 作反向代理,避免用戶直接訪問 Kibana 服務器。加上配置 Nginx 實現簡單的用戶認證,一定程度上提高安全性。另外,Nginx 本身具有負載均衡的作用,能夠提高系統訪問性能。
五,實戰
具體安裝過程如下
- 步驟 1,安裝 JDK
- 步驟 2,安裝 Elasticsearch
- 步驟 3,安裝 Kibana
- 步驟 4,安裝 Nginx
- 步驟 5,安裝 Logstash
- 步驟 6,配置 Logstash
- 步驟 7,安裝 Logstash-forwarder
- 步驟 8,最終驗證
安裝前的準備
注意:以下所有操作都是在兩個平臺上完成。
步驟 1,安裝 JDK
Elasticsearch 要求至少 Java 7。一般推薦使用 Oracle JDK 1.8 或者 OpenJDK 1.8。我們這里使用 OpenJDK 1.8。
Ubuntu 14.04
加入 Java 軟件源(Repository)
$ sudo add-apt-repository ppa:openjdk-r/ppa更新系統并安裝 JDK
$ sudo apt-get update $ sudo apt-get install openjdk-8-jdk驗證 Java
$ java -version openjdk version "1.8.0_45-internal" OpenJDK Runtime Environment (build 1.8.0_45-internal-b14) OpenJDK 64-Bit Server VM (build 25.45-b02, mixed mode)CentOS 7.1
配置 YUM 源
$ cd /etc/yum.repos.d $ sudo vi centos.repo加入以下內容
[base] name=CentOS-$releasever - Base mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 #released updates [updates] name=CentOS-$releasever - Updates mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra #baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/ gpgcheck=1 gpgkey=<a href="../../../../../etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7"><code>file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7</code></a>安裝 JDK
$ sudo yum install java-1.8.0-openjdk驗證 Java
$ java -version openjdk version "1.8.0_65" OpenJDK Runtime Environment (build 1.8.0_65-b17) OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)步驟 2,安裝 Elasticsearch
Ubuntu 14.04
下載 Elasticsearch 軟件
$ wgethttps://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.1.0/elasticsearch-2.1.0.tar.gz
解壓
$ tar xzvf elasticsearch-2.1.0.tar.gz文件目錄結構如下:
$ pwd /home/elk/elasticsearch-2.1.0 $ ls bin config lib LICENSE.txt NOTICE.txt README.textile修改配置文件
$ cd config $ vi elasticsearch.yml找到 # network.host 一行,修改成以下:
network.host: localhost啟動 elasticsearch
$ cd ../bin $ ./elasticsearch驗證 elasticsearch
$ curl 'localhost:9200/' {"name" : "Surge","cluster_name" : "elasticsearch","version" : {"number" : "2.1.0","build_hash" : "72cd1f1a3eee09505e036106146dc1949dc5dc87","build_timestamp" : "2015-11-18T22:40:03Z","build_snapshot" : false,"lucene_version" : "5.3.1"},"tagline" : "You Know, for Search" }CentOS 7.1
步驟和上述 Ubuntu 14.04 安裝完全一致
步驟 3,安裝 Kibana
Ubuntu 14.04
下載 Kibana 安裝軟件
$ wget https://download.elastic.co/kibana/kibana/kibana-4.3.0-linux-x64.tar.gz
解壓
$ tar xzvf kibana-4.3.0-linux-x64.tar.gz文件目錄結構如下:
$ pwd /home/elk/kibana-4.3.0-linux-x64 $ ls bin config installedPlugins LICENSE.txt node node_modules optimize package.json README.txt src webpackShims修改配置文件
$ cd config $ vi kibana.yml找到 # server.host,修改成以下:
server.host:“localhost”啟動 Kibana
$ cd ../bin $ ./kibana […]log [07:50:29.926] [info][listening] Server running at http://localhost:5601 […]驗證 Kibana
由于我們是配置在 localhost,所以是無法直接訪問 Web 頁面的。
可以使用 netstat 來檢查缺省端口 5601,或者使用 curl:
$ curl localhost:5601 <script>var hashRoute = '/app/kibana'; var defaultRoute = '/app/kibana';var hash = window.location.hash; if (hash.length) {window.location = hashRoute + hash; } else {window.location = defaultRoute; }</script>CentOS 7.1
步驟和上述 Ubuntu 14.04 安裝完全一致。
步驟 4,安裝 Nginx
Nginx 提供了反向代理服務,可以使外面的請求被發送到內部的應用上。
Ubuntu 14.04
安裝軟件
$ sudo apt-get install nginx apache2-utils修改 Nginx 配置文件
$ sudo vi /etc/nginx/sites-available/default找到 server_name,修改成正確的值?;蛘呤褂?IP,或者使用 FQDN。
然后在加入下面一段內容:
server {listen 80;server_name example.com;location / {proxy_pass http://localhost:5601;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection 'upgrade';proxy_set_header Host $host;proxy_cache_bypass $http_upgrade; }}注意:建議使用 IP。
重啟 Nginx 服務
$ sudo service nginx restart驗證訪問
http://FQDN 或者 http://IP
CentOS 7.1
配置 Nginx 官方 yum 源
$ sudo vi /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1安裝軟件
$ sudo yum install nginx httpd-tools修改 Nginx 配置文件
$ sudo vi /etc/nginx/nginx.conf檢查是否 http 塊(http{...})含有下面這一行:
include /etc/nginx/conf.d/*conf為 Kibana 創建一個配置文件
$ sudo vi /etc/nginx/conf.d/kibana.conf加入以下這一段內容:
server {listen 80;server_name example.com;location / {proxy_pass http://localhost:5601;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection 'upgrade';proxy_set_header Host $host;proxy_cache_bypass $http_upgrade; } }注意:建議使用 IP。
啟動 Nginx 服務
$ sudo systemctl enable nginx $ sudo systemctl start nginx驗證訪問
http://FQDN 或者 http://IP
步驟 5,安裝 Logstash
Ubuntu 14.04
下載 Logstash 安裝軟件
$ wget https://download.elastic.co/logstash/logstash/logstash-2.1.1.tar.gz解壓
$ tar xzvf logstash-2.1.1.tar.gz文件目錄結構如下:
$ pwd /home/elk/logstash-2.1.1$ ls bin CHANGELOG.md CONTRIBUTORS Gemfile Gemfile.jruby-1.9.lock lib LICENSE NOTICE.TXT vendor驗證 Logstash
$ cd bin $ ./logstash -e 'input { stdin { } } output { stdout {} }' Settings: Default filter workers: 1 Logstash startup completed顯示如下:
hello elk stack 2015-12-14T01:17:24.104Z 0.0.0.0 hello elk stack說明 Logstash 已經可以正常工作了。按CTRL-D 退出
CentOS 7.1
步驟和上述 Ubuntu 14.04 安裝完全一致。
步驟 6,配置 Logstash
我們需要配置 Logstash 以指明從哪里讀取數據,向哪里輸出數據。這個過程我們稱之為定義 Logstash 管道(Logstash Pipeline)。
通常一個管道需要包括必須的輸入(input),輸出(output),和一個可選項目 Filter。見圖 7。
圖 7.Logstash 管道結構示意
標準的管道配置文件格式如下:
# The # character at the beginning of a line indicates a comment. Use # comments to describe your configuration. input { } # The filter part of this file is commented out to indicate that it is # optional. #filter { #} output { }每一個輸入/輸出塊里面都可以包含多個源。Filter 是定義如何按照用戶指定的格式寫數據。
由于我們這次是使用 logstash-forwarder 從客戶機向服務器來傳輸數據,作為輸入數據源。所以,我們首先需要配置 SSL 證書(Certification)。用來在客戶機和服務器之間驗證身份。
Ubuntu 14.04
配置 SSL
$ sudo mkdir -p /etc/pki/tls/certs etc/pki/tls/private $ sudo vi /etc/ssl/openssl.cnf找到 [v3_ca] 段,添加下面一行,保存退出。
subjectAltName = IP: logstash_server_ip執行下面命令:
$ cd /etc/pki/tls $ sudo openssl req -config /etc/ssl/openssl.cnf -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt這里產生的 logstash-forwarder.crt 文件會在下一節安裝配置 Logstash-forwarder 的時候使用到。
配置 Logstash 管道文件
$ cd /home/elk/logstash-2.1.1 $ mkdir conf $ vi simple.conf添加以下內容:
input {lumberjack {port => 5043type => "logs"ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"} } filter {grok {match => { "message" => "%{COMBINEDAPACHELOG}" }}date {match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]} } output {elasticsearch { hosts => ["localhost:9200"] }stdout { codec => rubydebug } }啟動 Logstsh
$ cd /home/elk/logstash-2.1.1/bin $ ./logstash -f ../conf/simple.confCentOS 7.1
在 CentOS 7.1 上配置 Logstash,只有一步配置 SSL 是稍微有點不同,其他全部一樣。
$ sudo vi /etc/pki/tls/openssl.cnf找到 [v3_ca] 段,添加下面一行,保存退出。
subjectAltName = IP: logstash_server_ip$ cd /etc/pki/tls $ sudo openssl req -config /etc/pki/tls/openssl.cnf -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt這里產生的 logstash-forwarder.crt 文件會在下一節安裝配置 Logstash-forwarder 的時候使用到。
步驟 7,安裝 Logstash-forwarder
注意:Logstash-forwarder 也是一個開源項目,最早是由 lumberjack 改名而來。在作者寫這篇文章的時候,被吸收合并到了 Elastic.co 公司的另外一個產品 Beat 中的 FileBeat。如果是用 FileBeat,配置稍微有些不一樣,具體需要去參考官網。
Ubuntu14.04
安裝 Logstash-forwarder 軟件
注意:Logstash-forwarder 是安裝在另外一臺機器上。用來模擬客戶機傳輸數據到 Logstash 服務器。
配置 Logstash-forwarder 安裝源
執行以下命令:
$ echo 'deb http://packages.elastic.co/logstashforwarder/debian stable main' | sudo tee /etc/apt/sources.list.d/logstashforwarder.list$ wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
安裝軟件包
$ sudo apt-get update $ sudo apt-get install Logstash-forwarder配置 SSL
$ sudo mkdir -p /etc/pki/tls/certs把在步驟六中在 Logstash 服務器上產生的 ssl 證書文件拷貝到剛剛創建出來的目錄下:
$ sudo scp user@logstash_server:/etc/pki/tls/certs/logstash_forwarder.crt /etc/pki/tls/certs/配置 Logstash-forwarder
$ sudo vi /etc/logstash-forwarder.conf在 network 段("network": {),修改如下:
"servers": [ "logstash_server_private_address:5043" ], "ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt", "timeout": 15在 files 段("files": [),修改如下:
{ "paths": ["/var/log/syslog","/var/log/auth.log"],"fields": { "type": "syslog" } }啟動 Logstash-forwarder
$ sudo service logstash-forwarder start驗證 Logstash-forwarder
$ sudo service logstash-forwarder status logstash-forwarder is running如果有錯誤,則需要去/var/log/logstash-forwarder 目錄下面檢查。
CentOS 7.1
配置 Logstash-forwarder 安裝源
執行以下命令:
$ sudo rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch$ sudo vi /etc/yum.repos.d/logstash-forwarder.repo加入以下內容:
[logstash-forwarder] name=logstash-forwarder repository baseurl=http://packages.elastic.co/logstashforwarder/centos gpgcheck=1 gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch enabled=1存盤退出。
安裝軟件包
$ sudo yum -y install logstash-forwarder剩余步驟和上述在 Ubuntu 14.04 上面的做法完全一樣。
步驟 8,最后驗證
在前面安裝 Kibana 的時候,曾經有過驗證。不過,當時沒有數據,打開 Web 頁面的時候,將如下所示:
圖 8. 無數據初始頁面
現在,由于 logstash-forwarder 已經開始傳輸數據了,再次打開 Web 頁面,將如下所示:
圖 9. 配置索引頁面
點擊創建按鈕(Create),在選擇 Discover,可以看到如下畫面:
圖 10. 數據展示頁面
至此,所有部件的工作都可以正常使用了。關于如何具體使用 Kibana 就不在本文中加以描述了,有興趣的同學可以參考官網。
文章參考出處:
https://my.oschina.net/zjzhai/blog/751246
https://www.zybuluo.com/dume2007/note/665868
https://www.ibm.com/developerworks/cn/opensource/os-cn-elk/index.html
原文發布于微信公眾號 - 架構師小秘圈(seexmq)
原文發表時間:2017-09-25
本文參與騰訊云自媒體分享計劃,歡迎正在閱讀的你也加入,一起分享。
發表于 2018-04-02
?
https://cloud.tencent.com/developer/article/1082326
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的互联网亿级日志实时分析平台,一个码农半小时就可以搞定,只因ELK的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 亿级 ELK 日志平台构建实践
- 下一篇: 新浪是如何分析处理32亿条实时日志的?