1. 程式人生 > >ELK+filebeat配置及其使用

ELK+filebeat配置及其使用

ELK介紹:

  隨著業務發展越來越壯大,伺服器的數量越來越多,導致我們運維人員無法很好的去管理日誌。

ELK就是由elasticsearch logstash以及kibana組成:

Elasticsearch:個開源分散式搜尋引擎,提供蒐集、分析、儲存資料三大功能。它的特點有:分散式,零配置,自動發現,索引自動分片,索引副本機制,restful風格介面,多資料來源,自動搜尋負載等。詳細可參考EC官網(https://www.elastic.co/cn/)

Logstash:主要是用來日誌的蒐集、分析、過濾日誌的工具,支援大量的資料獲取方式。一般工作方式為c/s架構,client端安裝在需要收集日誌的主機上,server端負責將收到的各節點日誌進行過濾、修改等操作在一併發往elasticsearch上去。

Kibana:Kibana 也是一個開源和免費的工具,Kibana可以為 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 介面,可以幫助彙總、分析和搜尋重要資料日誌。

以上是最初的時候的架構模型,隨著發展,我們出現了filebeat----輕量級的日誌處理工具,它的優點是佔用系統資源少,並且適合在各個伺服器上面部署收集可以直接傳輸給ES伺服器並且通過kibana進行日誌展示,但是他的缺點正是logstash的優點,他無法設定日誌的展示格式,看自己的需求進行構建。

Filebeat隸屬於beats,beats包含了6種工具。

Packetbeat: 網路資料(收集網路流量資料)

Metricbeat: 指標 (收集系統、程序和檔案系統級別的 CPU 和記憶體使用情況等資料)

Filebeat: 日誌檔案(收集檔案資料)

Winlogbeat: windows事件日誌(收集 Windows 事件日誌資料)

Auditbeat:審計資料 (收集審計日誌)

Heartbeat:執行時間監控 (收集系統執行時的資料)

關於x-pack工具,它提供了安全,警報,監控,報表,圖表於一身的擴充套件包,是收費的,所以我也沒裝過。

Logstash工作原理:

它處理事件有三個階段:input  filter  output,是一個接收,處理,轉發日誌的工具,支援很多種日誌:webserver 錯誤日誌,等等

架構原理:

標題

 

 

 

可以看出來源資料到到input,然後filter處理,output輸出;當然這裡面肯定是有些語法要求的。具體的可參考https://elkguide.elasticsearch.cn/logstash/examples/nginx-access.html太多了 這裡我就不寫了。

Logstash太耗費cpu  記憶體等資源了,所以可以通過filebeat來取代它

Filebeat的工作原理:

主要由prospectors(勘測者)和harvesters(收割機)兩部分組成:

prospectors(勘測者)主要負責管理harvesters並找到所有讀取源;

harvesters(收割機):負責讀取單個檔案內容,每個檔案會啟動一個收割機來負責開啟或關閉檔案,且在執行時檔案描述符處於開啟狀態,所以在收割機關閉之前磁碟不會被釋放(即使刪除正在被收割機開啟的檔案,磁碟空間也不會被釋放。一會安裝完成之後我們來看一下filebeat的配置檔案,很簡單就能懂。

搭建環境:

Centos7.0兩臺:

10.10.10.10(搭建es,kibana,以及logstash來演示)

10.10.10.20(搭建filebeat,nginx來演示)

由於是java開發的所以配置java1.8

安裝方式我採用的是rpm包,版本是6.5版本。到官網下載即可。

連結:https://www.elastic.co/downloads

10.10.10.10:

1配置jdk1.8

tar -xf jdk-8u191-linux-x64.tar.gz  -C /usr/local/ && mv jdk1.8.****  jdk1.8

vim /etc/profile

export JAVA_HOME=/usr/local/jdk1.8

export CLASSPATH=.:$JAVA_HOME/lib.tools.jar

export PATH=$JAVA_HOME/bin:$PATH

2 配置ES服務:

rpm -ivh elasticsearch-6.5.0.rpm

安裝完成後,在/etc/elasticsearch有elasticsearch.yml檔案是用來配置叢集節點等相關資訊的

開始配置叢集節點,在10.10.10.10上面配置es配置檔案

[[email protected]node ~]# vim /etc/elasticsearch/elasticsearch.yml  # 增加或更改以下內容

cluster.name: master-node  # 叢集中的名稱

node.name: master  # 該節點名稱

node.master: true  # 意思是該節點為主節點,若不是主節點寫為false

node.data: false  # 表示這不是資料節點,若是資料節點改為true

network.host: 0.0.0.0  # 監聽全部ip,在實際環境中應設定為一個安全的ip

http.port: 9200  # es服務的埠號

discovery.zen.ping.unicast.hosts: ["10.10.10.10", "10.10.10.20] # 配置自動發現

如果你的環境中需要搭建叢集的請注意紅色部分。我這裡就兩臺,所以不需要。

現在可以來啟動es服務了。

systemctl start elasticsearch,注意這不會報錯但是起不來,可以通過status檢視報錯資訊

在這裡很多朋友們會報錯,我也用的是虛擬機器,以為es要求最低的記憶體為2G,那我們可以調節一下執行記憶體。vim /etc/elasticsearch/jvm.options此檔案為java的虛擬機器的配置檔案

在裡面修改兩個引數-xms -xmx  預設應該是2G,我改為了256m

此時啟動發現還會報錯,發現它會報找不見java,那我們只能做個軟連線了,因為在這裡我也不知道是不是bug,因為確實已經配置好了環境變量了。

ln -s /usr/local/jdk1.8/bin/* /usr/local/bin

再次啟動就成功了!

ps aux| grep elasticsearch

善用systemctl status elasticsearch以及使tail -f /var/log/messages

netstat -antp | grep java   可以發現9200 9300 埠開啟

9300埠是叢集通訊用的,9200埠則是資料傳輸時用的。

當查到這些都沒有問題的時候我們的es可以算是啟動成功了,我們可以查詢一下我們的叢集狀態。

[[email protected] ~]# curl '10.10.10.10/_cluster/health?pretty'

{

  "cluster_name" : "master-node",

  "status" : "green",  # 為green則代表健康沒問題,如果是yellow或者red則是叢集有問題

  "timed_out" : false,  # 是否有超時

  "number_of_nodes" : 3, # 叢集中的節點數量

  "number_of_data_nodes" : 2, # 叢集中data節點的數量

  "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

}

也可以通過瀏覽器http://10.10.10.10:9200/_cluster/health?pretty來進行檢視

檢查完畢之後,我們的es就算是搭建好了。

 

第二步我們來搭建kibana,提供一個人性化的web展示框架,是node.js框架寫的

10.10.10.10:

我也都下載好了rpm包:

rpm -ivh kibana-6.5.0-x86_64.rpm

安裝完成後我們來對kibana來進行配置。

[[email protected] ~]# vim /etc/kibana/kibana.yml  # 增加以下內容

server.port: 5601  # 配置kibana的埠

server.host: 0.0.0.0  # 配置監聽ip

elasticsearch.url: "http://10.10.10.10:9200"  # 配置es伺服器的ip,如果是叢集則配置該叢集中主節點的ip

logging.dest: /var/log/kibana.log  # 配置kibana的日誌檔案路徑,不然預設是messages裡記錄日誌

建立kibana的日誌檔案:

touch /var/log/kibana.log; chmod 777 /var/log/kibana.log

啟動kibana服務

systemctl  start kibana

ps aux | grep kibana

netstat -antp | grep 5601

埠為5601,由於是node.js開發的所以程序名字為node

然後就可以通過瀏覽器訪問了

:http://10.10.10.10:5601

是不需要賬戶和密碼就可以登陸的。建議用谷歌登陸啊,因為全是外語。

 

安裝logstash:

rpm -ivh logstash-6.5.0.rpm

安裝完成後我們不要啟動服務,我們先配置logstash收集syslog的日誌:

[[email protected] ~]# vim /etc/logstash/conf.d/syslog.conf  # 加入如下內容

input {  # 定義日誌源

  syslog {

    type => "system-syslog"  # 定義型別

    port => 10514    # 定義監聽埠

  }

}

output {  # 定義日誌輸出

  stdout {

    codec => rubydebug  # 將日誌輸出到當前的終端上顯示

  }

}

檢查配置檔案是否有錯:

[[email protected] ~]# cd /usr/share/logstash/bin

[[email protected] /usr/share/logstash/bin]# ./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf --config.test_and_exit

Configuration OK  # 為ok則代表配置檔案沒有問題

命令說明:

--path.settings 用於指定logstash的配置檔案所在的目錄

-f 指定需要被檢測的配置檔案的路徑

--config.test_and_exit 指定檢測完之後就退出,不然就會直接啟動了

配置kibana伺服器的ip以及配置監聽的物件的埠

[[email protected] ~]# vim /etc/rsyslog.conf

#### RULES ####

 

*.* @@10.10.10.10:10514

重啟rsyslog,讓配置生效:systemctl restart rsyslog

接下來我們制定配置檔案,啟動logstash

[[email protected] ~]# cd /usr/share/logstash/bin

[[email protected] /usr/share/logstash/bin]# ./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf

# 這時終端會停留在這裡,因為我們在配置檔案中定義的是將資訊輸出到當前終端,如果上一步檢測執行成功的話這塊應該沒什麼問題,會輸出很多資訊。

上面只是測試,我們現在來真正配置logstash,讓收集的資訊輸送到es服務,並且通過kibana展示出來。

[[email protected] ~]# vim /etc/logstash/conf.d/syslog.conf # 更改為如下內容

input {

  syslog {

    type => "system-syslog"

    port => 10514

  }

}

output {

  elasticsearch {

    hosts => ["192.168.77.128:9200"]  # 定義es伺服器的ip

index => "system-syslog-%{+YYYY.MM}" # 定義索引

#這裡我們會引申出來一個叫索引的東西,這個我們後面要配合kibana來設定索引進行檢視。

現在我們繼續檢測配置檔案有沒有錯:

[[email protected] ~]# cd /usr/share/logstash/bin

[[email protected] /usr/share/logstash/bin]# ./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf --config.test_and_exit

Sending Logstash's logs to /var/log/logstash which is now configured via log4j2.properties

Configuration OK

沒問題後我們啟動服務,並且檢查程序以及監聽埠

systemctl start logstash

ps aux | grep logstash

netstat -antp | grep 9600

netstat -antp |grep 10514

這裡我得說明一下啊,我的這塊沒有報錯,但是如果報錯了首先是程序存在,這兩個埠沒起來;善用日誌,去messages找報錯資訊,這裡報錯可能是你的許可權不夠,我就不截圖了

chown logstash /var/log/logstash/logstash-plain.log

 chown -R logstash /var/lib/logstash/

這下再啟動logstash並且檢查埠。

此時我們還得修改一下logstash的yml檔案,修改一下監聽ip,因為它是本地迴環ip無法遠端通訊。

vim /etc/logstash/logstash.yml

http.host: "0.0.0.0"

重新啟動logstash服務並且檢視埠,到這裡我們的logstash也配置好了。

那我們現在可以登陸上kibana來進行日誌的檢視咯!

完成了logstash伺服器的搭建之後,回到kibana伺服器上檢視日誌,執行以下命令可以獲取索引資訊:

[[email protected] ~]# curl '10.10.10.10:9200/_cat/indices?v'

health status index                 uuid                   pri rep docs.count docs.deleted store.size pri.store.size

green  open   .kibana               6JfXc0gFSPOWq9gJI1ZX2g   1   1          1            0      6.9kb          3.4kb

green  open   system-syslog-2018.03 bUXmEDskTh6fjGD3JgyHcA   5   1         61            0    591.7kb        296.7kb

如上,可以看到,在logstash配置檔案中定義的system-syslog索引成功獲取到了,證明配置沒問題,logstash與es通訊正常。(第二行第三列就是我們再logstash.conf定義的索引)

[[email protected] ~]# curl -XGET '10.10.10.10:9200/system-syslog-2018.03?pretty'

這條命令是來檢視詳細資訊的。

刪除索引用:

curl -XDELETE 'localhost:9200/system-syslog-2018.03'

同樣的這些都可以同過web介面ip+埠來進行展示。

 

如果上面正常的話我們就可以去配置kibana了,瀏覽器訪問10.10.10.10:5601

我們來建立索引。

用谷歌瀏覽器來登陸-----左下角管理----kibana標籤找索引的字眼----設定索引的名稱(必須和的索引通配哦)----選擇過濾器(可以選或不選)-----建立-----左上角發現------然後輸入自己的設定的索引找到日誌就ok了

有時候會發現無法找到日誌資訊,可能是時間的問題,右上角選擇時間。

至此ELK就算是介紹完了,下面我們來介紹filebeat輕量級的收集工具的使用方法

 

之前也介紹過beats是ELK體系中新增的一個工具,它屬於一個輕量的日誌採集器,以上我們使用的日誌採集工具是logstash,但是logstash佔用的資源比較大,沒有beats輕量,所以官方也推薦使用beats來作為日誌採集工具。而且beats可擴充套件,支援自定義構建

官方:https://www.elastic.co/cn/products/beats

10.10.10.20:

我也是下載好的rpm包

 rpm -ivh filebeat-5.2.0-x86_64.rpm

安裝完成後我們來編輯配置檔案:

[[email protected] ~]# vim /etc/filebeat/filebeat.yml  # 增加或者更改為以下內容

filebeat.prospectors:

- type: log

   #enabled: false 這一句要註釋掉

   paths:

      - /var/log/messages  # 指定需要收集的日誌檔案的路徑

 

#output.elasticsearch:  # 先將這幾句註釋掉

  # Array of hosts to connect to.

#  hosts: ["localhost:9200"]

 

output.console:  # 找個位置新增下面這兩句話測試用,指定在終端上輸出日誌資訊

  enable: true

完成後:執行以下命令看看是否終端可以列印日誌,若可以則配置成功

[[email protected] ~]# /usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml

以上配置只是測試filebeat是否能正常收集資料,現在我們再次修改配置檔案

[[email protected] ~]# vim /etc/filebeat/filebeat.yml

#output.console:  把這兩句註釋掉

#  enable: true

 

# 把這兩句的註釋去掉

output.elasticsearch:

  # Array of hosts to connect to.

  hosts: ["10.10.10.10:9200"]  # 並配置es伺服器的ip地址

完事後我們啟動服務:

[[email protected] ~]# systemctl start filebeat

[[email protected] ~]# ps axu |grep filebeat

啟動成功後,到es伺服器上檢視索引,可以看到新增了一個以filebeat-6.0.0開頭的索引,這就代表filesbeat和es能夠正常通訊了:

[[email protected] ~]# curl '192.168.77.128:9200/_cat/indices?v'

最後在kibana上按照之前的流程配置索引了,以上這就是如何使用filebeat進行日誌的資料收集,可以看到配置起來比logstash要簡單,而且佔用資源還少。

 

在這裡我要說一下,為什麼有了filebeat卻還要用logstash呢,因為logstash可以設定日誌的輸出格式,當然如果你為了方便可以直接在客戶端配置filebeat,不需要logstash來進行處理了;如果你們日誌較多,那這時候就可以配置logstash配合使用。以上只是我個人見解,並且沒有什麼經驗,簡單看看。

 

作者:陸游。