快速搭建日志系統——ELK STACK


什么是ELK STACK

ELK StackElasticserachLogstashKibana三種工具組合而成的一個日志解決方案。ELK可以將我們的系統日志、訪問日志、運行日志、錯誤日志等進行統一收集、存儲分析和搜索以及圖形展現。相比傳統的CTRL+F或者數據庫語句來進行數據查詢,ELK支持分布式搜搜,數據量可達PB級別,檢索速度更快速,接近實時處理,並且更智能,可以去掉一些沒有特殊含義的詞匯,比如“這,的,是”,還可以進行搜索補全與搜索糾錯。

LogStash

負責日志的收集,並且可以輸出到指定位置,如Redis、kafka、以及最主要的ElasticSearch中,通常會在所有需要收集日志的服務器上安裝Logstash,然后由Logstash agent端發送到Logstash的Server端

ElasticSearch

使用JAVA開發、基於Lucene搜索引擎庫的全文搜索工具,通過RESTful API(一種接口設計規范,讓接口更易懂)隱藏了Lucene原本的復雜性。實現了日志數據的分布式、實時分析,並且可以進行搜索補全與糾錯等功能,是ELK最核心的組件。相比MySQL庫和表的概念,在ES中把庫叫做索引。

Kibana

負責數據的展示與統計,是一個圖形化的管理系統。

下面一一介紹這幾個系統的安裝搭建。 

一、安裝Elasticsearch:

1、ElasticSearch默認工作在集群模式下,擴展性很強,並且支持自動發現。所以在實驗環境中需要至少2台服務器來搭建,但是為了防止腦裂,建立使用基數台服務器。在部署ElasticSearch前需要先部署JAVA環境,所以第一步是安裝JDK,這里偷懶使用yum安裝了openjdk,生產環境還是建議用JDK的源碼包(暫時不支持JDK 9)。

1 yum install java-1.8.0-openjdk.x86_64

2、下載ElasticSearch,官網地址是www.elastic.co(不是com),其每個Products下都有專門的文檔用於參考。

下載tar包解壓,然后進入config目錄,該目錄下除了有一個主配置文件elasticsearch.yml需要配置外,還有一個jvm.options文件用於JVM的調優

1 tar zxf elasticsearch-6.3.tar.gz
2 
3 cd elasticsearch-6.3/config

jvm.options文件主要是JVM優化相關,關於垃圾回收這塊使用默認配置就可以了,我們要調整的就是最大內存和最小內存的設置。通常設置為一樣大小,具體的值可以設置為系統最大內存的一半或三分之二

1 -Xms1g  #程序啟動時占用內存的大小
2 
3 -Xmx1g  #程序啟動后最大可占用內存的大小

3、修改ElasticSearch的配置,編輯elasticsearch.yml

 1 cluster.name: my-application  #集群名稱,相同集群名稱的節點會自動加入到該集群
 2 
 3 node.name: r1  #節點名稱,兩個節點不能重復
 4 
 5 path.data: /path/to/data  #指定數據存儲目錄
 6 
 7 path.logs: /path/to/logs  #指定日志存儲目錄
 8 
 9 network.host: 0.0.0.0  #本機地址或者4個0
10 
11 http.port: 9200  #指定端口
12 
13 discovery.zen.ping.unicast.hosts: ["192.168.44.130"]  #集群中master節點初始化列表,通過列表中的機器來自動發現其他節點

3、運行bin/elasticsearch 啟動服務(加-d是在后台運行)。啟動后服務會監聽在9200端口,還有個9300端口用於集群間通信。如果配置文件中監聽的端口是外網地址,在運行Elasticsearch時會遇到一些內核報錯,具體報錯和解決方法如下(做好配置后,需要注銷用戶重新登錄才會生效):

(1)don't run elasticsearch as root:

解決辦法:Elasticsearch是不允許使用root用戶來運行的,所以需要把ElasticSearch目錄所有者修改為其他用戶,並切換到該用戶去執行。用瀏覽器打開能看到如下信息代表安裝成功:

 

(2)Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c5330000, 986513408, 0) failed; error='Cannot allocate memory' (errno=12):

解決辦法:內存不足,升級內存

(3)Exception in thread "main" java.nio.file.AccessDeniedException

解決辦法:運行Elasticsearch程序的用戶權限不夠,把Elasticsearch目錄權限修改下即可

(4)max virtual memory areas vm.max_map_count [65530] is too low
解決辦法:修改/etc/sysctl.conf,增加一行vm.max_map_count= 262144。然后執行sysctl -p使其生效

(5)max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]
解決辦法:修改/etc/security/limits.conf,做以下配置

1 *                soft   nproc          65536
2 *                hard   nproc          65536
3 *                soft   nofile         65536
4 *                hard   nofile         65536

(6)max number of threads [3812] for user [elkuser] is too low, increase to at least [4096]

解決辦法:修改/etc/security/limits.d/20-nproc.conf,做以下配置

1 *          soft    nproc     4096
2 *          hard    nproc     4096

Elasticsearch接口說明:

ES啟動后如何驗證節點是否在集群中呢?ES是使用RESTful形式的接口對外提供訪問,所以我們要訪問ES接口的話可以使用curl命令。ES有四類API,作用大概如下:

1、用來檢查集群節點、索引當前狀態

2、管理集群節點、索引及元數據

3、執行增刪改查操作

4、執行高級操作,例如paging,filtering

 

Elasticsearch 常用API有cat、cluster等,下面是一些簡單介紹:


通過curl可以看到cat這個API下有很多子功能 

 

1、Elasticsearch集群健康檢查:

通過cat、cluster兩個API都可以進行集群健康檢查,green代表集群完全正常;yellow代表集群正常,部分副本分片不正常;red代表集群故障,數據可能會丟失

1 http://localhost:9200/_cat/health
2 
3 http://localhost:9200/_cat/health?v  #顯示信息更詳盡
4 
5 http://localhost:9200/_cluster/health
6 
7 http://localhost:9200/_cluster/health?pretty(加上pretty會將內容格式化再輸出,更美觀)

2、查詢所有節點列表

1 http://localhost:9200/_cat/nodes?v

3、查詢所有索引

1 http://localhost:9200/_cat/indices?v

curl命令在Elasticsearch中的使用

使用curl可以通過模擬http請求的方式去創建和管理索引,常用選項如下:

-X:指定http的請求方法,如HEAD,POST,PUT,DELETE

-d:指定要傳輸的數據

-H:指定http請求頭信息

1、使用curl新增索引

1 curl -XPUT "localhost:9200/blog_test?pretty"  #新增一個blog_test索引

2、刪除索引

1 curl -X DELETE "localhost:9200/bolg_test?pretty"

3、查詢創建的索引

1 http://localhost:9200/_cat/indices?v

下面是更貼近實際操作的curl命令,插入了兩條數據

 1 #為blog索引新增兩條記錄,指定type為article,ID為2和3
 2 
 3 curl -XPUT -H "Content-Type: application/json" 'localhost:9201/blog/article/2?pretty' -d '
 4 
 5 {
 6 
 7   "title": "test",
 8 
 9   "content":"testsfsdfdsfdsf",
10 
11   "PV":10
12 
13 }'
14 
15  
16 
17 curl -XPUT -H "Content-Type: application/json" 'localhost:9201/blog/article/3?pretty' -d '
18 
19 {
20 
21   "title": "test",
22 
23   "content":"testsfsdfdsfdsf",
24 
25   "PV":23
26 
27 }'

查詢索引和數據搜索

1 #通過ID來查詢
2 
3 curl -XGET 'localhost:9200/blog/article/2?pretty'
4 
5 #指定具體的索引和type進行搜索
6 
7 curl -XGET 'http://localhost:9200/blog/article/_search?q=title:test'

二、Logstash安裝步驟

1、下載Logstash 6.3

依然是在ELK的官方網站www.elastic.co,本文以源碼包形式進行Logstash的安裝。其實Logstash的安裝很簡單,只要保證JDK正常運行(目前只支持JDK8),然后直接解壓Logstash即可。這里我們解壓到了/usr/local/logstash下,並且建立一個軟連接

1 tar zxf logstash-6.3.tar.gz
2 
3 mv logstash-6.3 /usr/local/
4 
5 ln -s logstash-6.3.logstash

2、配置與命令行啟動Logstash

在Logstash目錄下有很多子目錄,但是大多數是不用去關注和修改的(僅有2個配置文件可能需要略微修改,一個是config/logstash.yml,可能需要修改啟動進程數以及日志信息;一個是jvm.options,這個和Elasticsearch是一樣的,主要是優化內存)。bin目錄下有啟動服務需要的腳本,現在可以用命令行來啟動Logstash測試是否正常(運行后多等一會兒才有反應):

 1 cd logstash-6.3
 2 
 3 bin/logstash -e 'input{ stdin{} } output{ stdout{} }'  #-e選項是直接用命令行模式,采用標准輸入,標准輸出
 4 
 5 Settings: Default pipeline workers: 1
 6 
 7 Pipeline main started
 8 
 9 hello world  #這里手動輸入的hello world,作為標准輸入
10 
11 2016-05-19T01:59:03.797Z 0.0.0.0 hello world  #標准輸出的結果顯示在屏幕
12 
13 nihao
14 
15 2016-05-19T02:00:20.013Z 0.0.0.0 nihao

使用codec指定輸出格式(codec是一種解碼編碼的工具)

 1 [root@server bin]# ./logstash -e 'input{ stdin{} } output{ stdout{codec => rubydebug} }'  # -e選項是直接用命令行模式,輸入采用標准輸入,輸出采用的codec風格
 2 
 3 Settings: Default pipeline workers: 1
 4 
 5 Pipeline main started
 6 
 7 hello world
 8 
 9 {
10 
11        "message" => "hello world",  #輸入的內容
12 
13        "@version" => "1",  #版本號
14 
15        "@timestamp" => "2016-05-19T02:09:43.921Z",  #自動生成時間戳
16 
17        "host" => "0.0.0.0"  #數據是由哪個節點發過來的

3、自定義Logstash配置文件

生產環境中需要用到的規則更為復雜,使用命令行顯然不可取。所以可以自定義規則文件,然后讓Logstash根據規則進行工作。下面是通過配置文件指定Logstash的數據輸入輸出的示例,配置文件里主要是寫明input、output規則,filter規則是需要過濾內容時才會有:

 1 input{
 2 
 3 stdin {}
 4 
 5 }
 6 
 7  
 8 
 9 output{
10 
11         stdout{
12 
13                 codec  => rubydebug
14 
15         }
16 
17 }

啟動服務時加上-t選項可以檢查配置文件是否正確,-f選項就是配置文件的路徑

1 logstash -t  -f /etc/logstash.conf

啟動成功后會看到Pipeline main started這樣的信息出來,這個時候我們就可以輸入信息給Logstash了,我們輸入的信息會通過標准輸出顯示到屏幕上,如圖:

在Logstash中輸入的數據我們可以通過日志文件來獲取,當然輸出的數據我們也可以指定到自己需要的容器中,如Elasticsearch里。要通過日志文件來獲取輸入信息的話就需要用到最常用的input插件——file(官方文檔里有詳細介紹每個input插件的使用方式,output插件同理)。下面是一個使用file插件的簡單案例,由於output依然是標准輸出,所以會有瘋狂刷屏的情況出現:

 1 vi etc/logstash.conf                                  
 2 
 3 input {
 4 
 5   file {
 6 
 7     path => [ "/var/log/secure" ]  #文件路徑
 8 
 9     type => "system"  #類似打個標記,自定義
10 
11     start_position => "beginning"  #從文件頭部讀取,相反還有end
12 
13   }
14 
15 }
16 
17 
18 output {
19 
20   stdout {
21 
22     codec => rubydebug
23 
24   }
25 
26 }

file插件使用了一個sincedb文件來記錄當前文件讀區位置,即使重新啟動服務也不會丟失文件的讀取位置。默認情況下sincedb文件放在運行Logstash的用戶的主目錄中,可以用sincedb_path選項自定義存放路徑。

總結:在實際工作中Logstash數據收集的一個流程大概是:數據源→通過input插件(如file、redis、stdin)→output插件→寫到Elasticsearch。在官網文檔中可以看到有很多其他input插件,如圖:

下面看看如何將Logstash收集到的數據提交給Elasticsearch。這里需要使用一個output插件——elasticsearch。使用方法也很簡單,只需要在配置文件里指定插件就可以了,如下:

 1 [root@server ~]# cat /etc/logstash.conf  
 2 
 3 input{
 4 
 5   file{ 
 6 
 7     path=> "/var/log/audit/audit.log"
 8 
 9     type=> "system"
10 
11     start_position=> "beginning" 
12 
13   }
14 
15 }
16 
17 output{
18 
19   elasticsearch{  #輸出到es
20 
21     hosts=> ["192.168.44.129:9200","192.168.44.130:9200"]
22 
23   }
24 
25 }

文件設置好了后運行logstash的程序,再到Elasticsearch就可以查看到數據了

1 [root@server ~]# /usr/local/logstash/bin/logstash -f /etc/logstash.conf

在生產環境中啟動Logstash都是放后台運行,我們可以一次運行多個程序,因為Logstash不會占用端口,加-w選項可以啟動多個線程,提高效率,默認是2,例:

1 nohup /logstash/bin/logstash agent -f /logstash/conf/indexer-xire.conf -w 4 &

三、Kibana安裝步驟

 繼Elasticsearch和Logstash之后,輪到了Kibana。Kibana是為Elasticsearch提供的可視化平台,負責數據的美觀展示。Kibana的安裝和Logstash一樣極其簡單,而且不需要在每個客戶端都安裝,通常想讓哪台服務器作為展示就用哪台安裝一個kibana,Kibana是從Elasticsearch中獲取數據的,即使安裝在Elasticsearch集群之外的節點也是沒有問題的。

1 tar zxf kibana-6.3-linux-x64.tar.gz
2 
3 mv kibana-6.3-linux-x64 /usr/local/
4 
5 ln -s /usr/local/kibana-6.3-linux-x64 /usr/local/kibana

配置很簡單,修改配置文件config/kibana.yml里的以下信息即可:

1 vi config/kibana.yml
2 
3  server.port: 5601  #服務端口
4 
5  server.host: "0.0.0.0"  #修改為本機地址
6 
7  elasticsearch.url: "http://192.168.44.129:9200"  #ES的地址與端口
8 
9  kibana.index: ".kibana"

運行bin/kibana可以直接啟動服務,但是通常是放后台運行,所以加上nohup吧(從2.x到6.x都是這個方式)

1 nohup kibana &

Kibana服務默認監控在5601端口,瀏覽器訪問http://IP:5601可以打開Kibana的界面(不要用IE內核訪問)。第一次訪問Kibana會提示配置索引,輸入在ES中存在的索引名字后Kibana會自動進行正則匹配(通常用Logstash發送的數據索引名是以logstash打頭,用filebeat就是filebeat打頭,當然也可以在Logstash配置文件的output段使用index選項自定義索引)

 1 output {
 2 
 3   elasticsearh {
 4 
 5     hosts => ["http://127.0.0.1:9200"]
 6 
 7     index => "nginx-%{+YYYY.MM.dd}"
 8 
 9   }
10 
11 }

左側導航欄有很多選項,Discover用於和Elasticsearch交互和展示搜索結果;Visualize用於報表生成,比如有一個銀行系統,里面有很多用戶,現在想統計每個存錢區間的人數,存款在1萬以下有多少人,5萬以下有多少人等,用這個報表系統就可以方便的進行操作。

右上角有個時間過濾器,默認是logstash索引最后15分鍾的數據,沒有的話就會顯示No results found。點擊過濾器后可以在左側選擇過濾條件,分為了快速查找(Quick)、相對時間(Relative)、絕對時間(Absolute)。

在中間部分有綠色的直方圖,點擊綠色區域會跳轉到對應時間的數據,並且顯示該時間內產生了多少數據,如圖:

 

在頁面左側可以選擇索引以及字段:

通過kibana進行全文搜索也很簡單,只需要在搜索框里輸入關鍵詞,然后就會自動把匹配的日志給展示出來:

Kibana的監控頁

和Nginx一樣,Kibana也有一個監控頁用於查看服務器當前狀況,當然在生產中最好也使用Nginx做好權限審核,不要讓任何人都可以登錄,Kibana監控頁訪問地址是http://URL/status!

 

 至此一個高效多功能的日志系統就初步完成了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM