天天看點

記錄日志系統ELKB 5.6.4的搭建過程

前言

ELK是最近比較流行的免費的日志系統解決方案,注意,ELK不是一個軟體名,而是一個結局方案的縮寫,即Elasticsearch+Logstash+Kibana(ELK Stack)。這哥幾個都是java系的産品,但是衆所周知,java的東西很吃記憶體和CPU,Logstash在當作為收集日志的Agent時,就顯得太過臃腫了。聽說直播平台“鬥魚”團隊很為logstash占用資源的情況很而苦惱,後來為了解決這個問題,他們自己寫了一個agent。不過後來官方在logstash-forwarder的基礎上推出了beat系列,裡面包括四個兄弟,分别是:Packetbeat(搜集網絡流量資料);Topbeat(搜集系統、程序和檔案系統級别的 CPU 和記憶體使用情況等資料);Filebeat(搜集檔案資料);Winlogbeat(搜集 Windows 事件日志資料)。而Filebeat也就這樣加入了“日志收集分析”的團隊裡,是以雖然大家還是習慣性的叫ELK,其實準确的說法已經是ELKB了。

ELKB這幾個哥們的分工如下:

Elasticsearch:分布式搜尋和分析引擎,具有高可伸縮、高可靠和易管理等特點。基于 Apache Lucene 建構,能對大容量的資料進行接近實時的存儲、搜尋和分析操作。通常被用作某些應用的基礎搜尋引擎,使其具有複雜的搜尋功能;

Logstash:資料收集額外處理和資料引擎。它支援動态的從各種資料源搜集資料,并對資料進行過濾、分析、豐富、統一格式等操作,然後存儲到使用者指定的位置;

Kibana:資料分析和可視化平台。通常與 Elasticsearch 配合使用,對其中資料進行搜尋、分析和以統計圖表的方式展示;

Filebeat:ELK 協定棧的新成員,在需要采集日志資料的 server 上安裝 Filebeat,并指定日志目錄或日志檔案後,Filebeat 就能讀取資料,迅速發送到 Logstash 進行解析,亦或直接發送到 Elasticsearch 進行集中式存儲和分析。

設計架構

本文的設計結構就是這樣,其中紅色的redis/RebbitMQ部分可以省略(我這個例子裡暫省略),讓日志直接傳遞到logstash,如果日志量較大,最好還是添加上redis,同時再橫向擴容Elasticsearch,搞成一個叢集。

對于這幾個子產品伺服器多說幾句:

1)Logstash要選擇計算能力強的,CPU和記憶體比較豐滿的;

2)Elasticsearch要選擇磁盤容量大的,同時CPU和記憶體也比較豐滿的;

實驗軟體版本

Elasticsearch 5.6.4  

Logstash 5.6.4 

Kibana 5.6.4 

Filebeat 5.6.4

由于ELKB這幾個東西都是牆外的,牆内的下載下傳可能會比較費勁。是以我稍後會把所有ELKB的5.6.4程式都放在51CTO的存儲空間裡,需要的朋友可以去下載下傳,還是那話,雖然ELK更新頻率很快,但是5.6.4已經足夠穩定了。

實驗伺服器情況

伺服器名稱

伺服器IP

伺服器情況

伺服器用途

func-auc-001 

10.117.32.243

阿裡雲Centos 6.5 2核2G

這個auc是我公司的一個内部java子產品,會産生日志。将filebeat安裝在這個機器上;

chen-logstash-001

10.162.80.171

阿裡雲Centos 7.4 2核4G(JAVA1.8.0)

Logstash

chen-elk-001

10.162.80.192

阿裡雲Centos 7.4 2核8G(JAVA1.8.0)

Elasticsearch+Kibana

nginx直接使用阿裡雲負載均衡取代

安裝Elasticsearch 5.6.4(以下所有操作都是root下進行的)

1

2

<code>curl -L -O https:</code><code>//artifacts</code><code>.elastic.co</code><code>/downloads/elasticsearch/elasticsearch-5</code><code>.6.4.rpm</code>

<code>rpm -ivh elasticsearch-5.6.4.rpm</code>

然後編輯/etc/elasticsearch/elasticsearch.yml,不然的話logstash無法與之相連:

3

<code>#cluster.name: my-application    #如果是叢集的es就把這個打開,Elasticsearch 啟動時會根據配置檔案中設定的叢集名字(cluster.name)自動查找并加入叢集,端口是9300</code>

<code>network.host: 0.0.0.0    </code><code>#取消注釋,并且改成0.0.0.0</code>

<code>http.port: 9200    </code><code>#取消注釋</code>

儲存之後,啟動并且添加開機啟動:

<code>systemctl start elasticsearch     </code>

<code>systemctl </code><code>enable</code> <code>elasticsearch</code>

使用#curl localhost:9200能看到這樣的情景就證明已經成功啟動了:

安裝kibana 5.6.4(以下所有操作都是root下進行的)

4

<code>curl -L -O https:</code><code>//artifacts</code><code>.elastic.co</code><code>/downloads/kibana/kibana-5</code><code>.6.4-linux-x86_64.</code><code>tar</code><code>.gz</code>

<code>tar</code> <code>xzvf kibana-5.6.4-linux-x86_64.</code><code>tar</code><code>.gz</code>

<code>cd</code> <code>kibana-5.6.4-linux-x86_64/</code>

<code>vim config</code><code>/kibana</code><code>.yml</code>

把kibana.yml裡的“server.host: localhost”改成“server.host: 0.0.0.0”,然後儲存退出,在kibana的bin檔案夾裡執行#./kibana即可。如果要背景啟動就是#nohup /kibana安裝路徑/bin/kibana &amp; 。

啟動之後,如圖:

在浏覽器裡輸入“kibana伺服器外網IP:5601”,就會看到web界面。

安裝Logstash 5.6.4(以下所有操作都是root下進行的)

<code>curl -L -O https:</code><code>//artifacts</code><code>.elastic.co</code><code>/downloads/logstash/logstash-5</code><code>.6.4.rpm </code>

<code>rpm -ivh logstash-5.6.4.rpm</code>

如果安裝的時候爆錯:/usr/share/logstash/vendor/jruby/bin/jruby: line 388: /usr/bin/java: No such file or directory。那麼就先#which java檢視一下java的檔案,然後做一個軟連接配接過去,然後重裝logstash即可,如圖:

使用者可以使用TLS雙向認證加密 Filebeat 和 Logstash 的連接配接,保證Filebeat隻向可信的Logstash發送加密的資料(如果你的logstash和filebeat是内網通信,而且你認可目前内網的安全度,這一步可以省略)。同樣的,Logstash也隻接收可信的 Filebeat 發送的資料。這個功能預設是關閉的,要開啟的話需要先#vim /etc/pki/tls/openssl.cnf,如圖:

找到[ v3_ca ]的字段,在底下添加“subjectAltName = IP:logstash的内網IP”字段,儲存退出來到/etc/pki/tls/,執行

<code>openssl req -x509 -days 365 -batch -nodes -newkey rsa:2048 -keyout private</code><code>/logstash-forwarder</code><code>.key -out certs</code><code>/logstash-forwarder</code><code>.crt</code>

來生成一個期限為365天的IP SAN證書對,如果想生成一個十年的證書,就把365改成3650即可,如圖:

安裝完畢之後,#vim /etc/logstash/logstash.yml,編輯成如下的樣子:

然後在/etc/logstash/下手動建立一個目錄conf.d,在conf.d裡建立一個logstash.conf的檔案,如下:

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

<code>$ </code><code>cat</code> <code>/usr/local/logstash/config/conf</code><code>.d</code><code>/logstash</code><code>.conf</code>

<code>#在輸入部分,配置Logstash通信端口以及添加SSL證書,進而進行安全通信。</code>

<code>input {</code>

<code> </code><code>beats {</code>

<code>   </code><code>port =&gt; 5044</code>

<code>   </code><code>ssl =&gt; </code><code>true</code>

<code>   </code><code>ssl_certificate =&gt; </code><code>"/etc/pki/tls/certs/logstash-forwarder.crt"</code>

<code>   </code><code>ssl_key =&gt; </code><code>"/etc/pki/tls/private/logstash-forwarder.key"</code>

<code>  </code><code>}</code>

<code>}</code>

<code>#在過濾器部分,我們将使用Grok來解析這些日志,然後将其發送到Elasticsearch。以下grok過濾器将查找“syslog”标記的日志,并嘗試解析它們,以生成結構化索引。</code>

<code>filter {</code>

<code>  </code><code>if</code> <code>[</code><code>type</code><code>] == </code><code>"syslog"</code> <code>{</code>

<code>    </code><code>grok {</code>

<code>      </code><code>match =&gt; { </code><code>"message"</code> <code>=&gt; </code><code>"%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}"</code> <code>}</code>

<code>      </code><code>add_field =&gt; [ </code><code>"received_at"</code><code>, </code><code>"%{@timestamp}"</code> <code>]</code>

<code>      </code><code>add_field =&gt; [ </code><code>"received_from"</code><code>, </code><code>"%{host}"</code> <code>]</code>

<code>    </code><code>}</code>

<code>    </code><code>syslog_pri { }</code>

<code>    </code><code>date</code> <code>{</code>

<code>      </code><code>match =&gt; [ </code><code>"syslog_timestamp"</code><code>, </code><code>"MMM  d HH:mm:ss"</code><code>, </code><code>"MMM dd HH:mm:ss"</code> <code>]</code>

<code>#輸出部分,我們将定義要存儲的日志位置</code>

<code>output {</code>

<code> </code><code>elasticsearch {</code>

<code>  </code><code>hosts =&gt; [ </code><code>"10.162.80.192:9200"</code> <code>]                </code><code>#這個位址是elasticsearch的内網位址</code>

<code>    </code><code>index =&gt; </code><code>"auclogstash-%{+YYYY.MM.dd}"</code>                <code>#設定這個是索引</code>

<code> </code><code>user =&gt; elastic                    </code><code>#這個是為了将來裝x-pack準備的</code>

<code> </code><code>password =&gt; changeme                </code><code>#同上</code>

<code>       </code><code>}</code>

<code>stdout {</code>

<code>    </code><code>codec =&gt; rubydebug</code>

然後就是啟動并且添加開機自啟動

<code>systemctl start logstash        </code>

<code>systemctl </code><code>enable</code> <code>logstash</code>

安裝filebeat(以下所有操作都是root下進行的)

在子產品伺服器上安裝filebeat的方法如下: 

<code>curl -L -O https:</code><code>//artifacts</code><code>.elastic.co</code><code>/downloads/beats/filebeat/filebeat-5</code><code>.6.4-x86_64.rpm </code>

<code>rpm -ivh filebeat-5.6.4-x86_64.rpm</code>

之前在logstash上生成了一個IP SAN證書,現在需要把這個證書傳遞給filebeat的機器裡,使用scp語句如下:

<code>scp</code> <code>-</code><code>pr</code> <code>[email protected]:</code><code>/etc/pki/tls/certs/logstash-forwarder</code><code>.crt </code><code>/etc/ssl/certs/</code>        <code>#10.162.80.171就是logstash的内網IP</code>

輸入logstash的密碼,并且密鑰檔案複制完畢之後,需要修改filebeat.yml,于是#vim /etc/filebeat/filebeat.yml:

<code>[root@func-auc-001 log]</code><code># grep -iv '#' /etc/filebeat/filebeat.yml | grep -iv '^$'</code>

<code>filebeat.prospectors:</code>

<code>- input_type: log</code>

<code>  </code><code>paths:</code>

<code>    </code><code>-  </code><code>/mnt/hswx/auc/logs/</code><code>*.log        </code><code>#這個是那個auc子產品的路徑</code>

<code>    </code><code>-    /第二個日志路徑/*.log                   </code><code>#如果有第二個檔案路徑的話</code>

<code>  </code><code>tail_files: </code><code>true</code>                                 <code>#從檔案末尾開始讀取</code>

<code>  </code><code>document_type: </code><code>"newnginx-api"</code>                    <code>#logstash那裡已經設定了index,如果要使用了document_type,那麼在logstash的index就要這麼寫:"%{type}-%{+YYYY.MM.dd}"</code>

<code>  </code><code># 以下是規避資料熱點的優化參數:</code>

<code>    </code><code>spool_size: 1024         </code><code># 積累1024條消息才上報</code>

<code>    </code><code>idle_timeout: </code><code>"5s"</code>        <code># 空閑5s上報</code>

<code>  </code> 

<code>output.logstash:</code>

<code>  </code><code>hosts: [</code><code>"10.162.80.171:5044"</code><code>]            </code><code>#這個地方要寫logstash的内網位址</code>

<code>  </code><code>ssl.certificate_authorities: [</code><code>"/etc/ssl/certs/logstash-forwarder.crt"</code><code>]    </code><code>#這裡就是剛剛複制的那個密鑰檔案路徑</code>

<code>  </code><code>#注意上面是ssl而不是tls,1.0版本才是tls,如果這個寫錯了,啟動的時候會出現“read: connection reset by peer”的錯誤</code>

注意!Filebeat的配置檔案采用YAML格式,這意味着縮進非常重要!請務必使用與這些說明相同數量的空格。

儲存之後,使用#/etc/init.d/filebeat start啟動filebeat,如圖:

故障解決

而使用#tailf /var/log/filebeat/filebeat 去檢視filebeat的日志是這樣的:

再看看logstash-plain.log,裡面的情況是這樣的:

配置kibana

在浏覽器輸入“kibana伺服器外網IP:5601”打開kibana的web界面,把“idenx pattern”的地方改成filebeat-*,然後點選“create”,如圖:

然後就得到了細節的web界面,如圖:

點選左側框的“Discover”,就會看到夢寐以求的日志web 界面,如圖:

看一下紅色框的内容裡面有時間,有host主機,有source來源,還有具體的日志資訊,我們再去func-auc-001這個日志源主機上查詢一下日志:

兩個日志是一樣的,可見實作了預期的日志展示的目标!

最後一步,就是把kibana與nginx聯系起來(也可以把kibana做阿裡雲負載均衡的後端伺服器),這樣通過nginx/負載均衡來通路kibana的界面,對kibana來說更安全。配置端口監聽如圖,再把kibana伺服器挂在負載均衡後面即可。

最後的最後,如果您覺得本文對您升職加薪有幫助,那麼請不吝贊助之手,刷一下下面的二維碼,贊助本人繼續寫更多的博文!

 本文轉自 蘇幕遮618 51CTO部落格,原文連結:http://blog.51cto.com/chenx1242/2048014