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配合使用。以上只是我個人見解,並且沒有什麼經驗,簡單看看。
作者:陸游。