ELK是啥子???java
ELK 是elastic公司提供的一套完整的日誌收集以及展現的解決方案,是三個產品的首字母縮寫,分別是ElasticSearch、Logstash 和 Kibana。node
特色:linux
收集-可以採集多種來源的日誌數據
傳輸-可以穩定的把日誌數據傳輸到中央系統
存儲-如何存儲日誌數據
分析-能夠支持 UI 分析
警告-可以提供錯誤報告,監控機制nginx
Elasticsearch是個開源分佈式搜索引擎,提供蒐集、分析、存儲數據三大功能。apache
特色:分佈式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。
Logstash 主要是用來日誌的蒐集、分析、過濾日誌的工具,支持大量的數據獲取方式。
通常工做方式爲c/s架構,client端安裝在須要收集日誌的主機上,server端負責將收到的各節點日誌進行過濾、修改等操做在一併發往elasticsearch上去。
Kibana 也是一個開源和免費的工具,Kibana能夠爲 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 界面,能夠幫助彙總、分析和搜索重要數據日誌。
Filebeat隸屬於Beats。目前Beats包含四種工具:
Packetbeat(蒐集網絡流量數據)
Topbeat(蒐集系統、進程和文件系統級別的 CPU 和內存使用狀況等數據)
Filebeat(蒐集文件數據)
Winlogbeat(蒐集 Windows 事件日誌數據)npm
第一步:環境基本配置:配置主機名和磁盤掛載,兩個節點都要配置
提早添加30G的硬盤,這傢伙統計日誌量真的很大,提早給好空間,內存配置至少得2G以上,我一開始是1G,結果服務總是失敗,看狀況而定,多給一點,仍是比較好的vim
[root@linux-node01 ~]# cat /etc/redhat-release 瀏覽器
CentOS Linux release 7.4.1708 (Core) #個人機子是Centos7.4,咋說也得七以上吧,六沒試ruby
[root@linux-node01 ~]# uname -a
Linux linux-node01 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux服務器
注意一下,本文配置顯示結果只是顯示要添加的部分,配置比較全,也比較詳細,寫給對ELK蠢蠢欲動缺不敢動的大家,嘿嘿嘿
[root@linux-node01 ~]# cat /etc/hosts #兩個節點都要寫
192.168.2.130 linux-node01 linux-node1.example.com
192.168.2.132 linux-node02 linux-node2.example.com
[root@linux-node01 ~]fdisk -l /dev/sdb #查看你添加的硬盤設備是否存在
[root@linux-node01 ~]mkfs.xfs /dev/sdb #加磁盤以後分區,而後格式化,這是一個基本的操做流程,這裏我就不分區了,直接使用格式化,文件系統的類型問xfs
[root@linux-node01 ~]# blkid /dev/sdb #查看一下UUID和類型
/dev/sdb: UUID="dc0f16bb-ae77-4a16-b1c7-b51d3f4b6e32" TYPE="xfs"
[root@linux-node01 ~]# mkdir /elk
[root@linux-node01 ~]# cat /etc/fstab #加入開機自動掛載
UUID="dc0f16bb-ae77-4a16-b1c7-b51d3f4b6e32" /elk xfs defaults 0 0 #把這行加進去就ok
[root@linux-node01 ~]# mount -a #掛載一會兒,直接all
[root@linux-node01 ~]# df -TH # df 的參數H和h差很少都是以人類可讀的方式顯示,只不過H的基準是1000而不是1024,因此看的時候多出來3G,實際空間大小爲30G
/dev/sdb xfs 33G 34M 33G 1% /elk #看到這個就說明咱們將磁盤掛載成功了
******以上的主機名和磁盤在兩個節點都是要添加的*******
第二步:安裝elasticsearch和java環境 ,兩個節點都要安裝配置
[root@linux-node01 ~]# ls
#將rpm的包下載到本地,能夠去官網直接下載選擇版本,我參考的資料有點老,可是功能不影響,就用5.6.5了,路先走通,才能變通,不要以爲版本舊就不嘗試,新的東西資料少,錯誤多,
a anaconda-ks.cfg elasticsearch-5.6.5.rpm jdk-8u151-linux-x64.rpm #這裏注意一下,你去官網看的時候它對JAVA的版本有一個說明
[root@linux-node01 ~]# yum -y install *.rpm # *就是全部啦,之前以爲學東西沒有啥子用,到了用的時候就以爲真方便,一個符號就能代替全部,呼哈
Installed:
elasticsearch.noarch 0:5.6.5-1 jdk1.8.x86_64 2000:1.8.0_151-fcs
Complete! #看到這個就說明java環境和elasticsearch安裝好了 ,安裝這兩個包,也能夠二進制安裝,兩個node都要安裝
[root@linux-node02 ~]# yum -y install iotop #安裝一個io查看工具 ,從名字就能看出和top用法同樣,專門針對IO的
第三步:修改elasticsearch配置文件
關閉防火牆和selinux ,
systemctl stop firewalld
臨時修改 setenforce 0
永久修改/etc/selinux/conf 中 SELINUX=disabled
node2修改
[root@linux-node02 ~]# vim /etc/elasticsearch/elasticsearch.yml
[root@linux-node02 elasticsearch]# egrep -v "^#" elasticsearch.yml #最後修改以後的配置以下,這七行都要添加
cluster.name: elk-cluster1 # 集羣名字,同一個集羣名字必須相同,學學英語,很重要
node.name: elk-node-2 #節點2的名字,起名大法
path.data: /elk # elk的數據存放目錄
path.logs: /elk/logs #elk的日誌存放目錄,必定要記住這個目錄,有啥錯誤看日誌,說明,不要一臉懵逼的撓頭,都TM撓成地中海了
network.host: 192.168.2.132 #主機的地址啦,node2的IP地址是192.168.2.132
http.port: 9200 #默認端口9200 ,最後查看服務是否啓動成功,看端口啊,排查故障,看網絡,看端口
discovery.zen.ping.unicast.hosts: ["192.168.2.130", "192.168.2.132"] #這裏能夠寫成網段,可是廣播很耗費性能,原本內存就不大,直接就改爲組播,就這倆就行
[root@linux-node02 ~]# vim /usr/lib/systemd/system/elasticsearch.service #查看這個文件的時候你會看到這幾行,和MySQL相似,就是對文件的用戶和用戶組添加一下就ok,切忌不要改文件屬性爲777,你是傻子麼??????
User=elasticsearch
Group=elasticsearch
[root@linux-node02 ~]#systemctl start elasticsearch #啓動服務,開始咱們的遊戲
[root@linux-node02 ~]#systemctl enable elasticsearch #開機自啓動
[root@linux-node02 ~]#vim /var/log/messages #查看一下日誌報什麼錯誤,有個權限拒絕相似的,就是說上面沒有對/elk文件沒有權限
[root@linux-node02 ~]# chown -R elasticsearch.elasticsearch /elk/ #添加用戶和用戶組,-R :就是說對整個文件夾下面的內容都要這麼操做,也就是所謂的遞歸
[root@linux-node02 ~]# ll /elk/ #如今整個文件夾下啥都沒有,啓動成功以後你就在這裏能看到日誌文件了,有錯誤找這裏,而後去百度找一找
total 0
[root@linux-node02 ~]# ll /elk/ -d
drwxr-xr-x. 2 elasticsearch elasticsearch 6 Oct 16 20:25 /elk/
#這裏有一個錯誤就是由於我內存給的1G,日誌顯示內存不足以支持配置,調大內存爲2G,從新啓動服務
[root@linux-node02 ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 ::ffff:192.168.2.132:9200 :::*
LISTEN 0 128 ::ffff:192.168.2.132:9300 :::*
#systemctl stop firewalld 關閉防火牆啦,若是你在瀏覽器查看不到效果,看你防火牆關沒關
測試:瀏覽器查看一下
node1修改
若是不想修改,能夠直接把2的文件拷到這邊,再稍微改動一下,主要針對節點名和主機地址
[root@linux-node01 ~]# egrep -v "^#" /etc/elasticsearch/elasticsearch.yml
cluster.name: elk-cluster1
node.name: elk-node-1
path.data: /elk
path.logs: /elk/logs
network.host: 192.168.2.130
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.2.130", "192.168.2.132"]
[root@linux-node01 ~]# systemctl start elasticsearch
[root@linux-node01 ~]# ll /elk/
total 0
drwxr-xr-x. 2 elasticsearch elasticsearch 158 Oct 16 22:03 logs
drwxr-xr-x. 3 elasticsearch elasticsearch 15 Oct 16 22:03 nodes
[root@linux-node01 ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 ::ffff:192.168.2.130:9200 :::*
LISTEN 0 128 ::ffff:192.168.2.130:9300 :::*
第三步:安裝npm而後運行head插件測試一下
#mkdir /usr/local/node
#cd /usr/local/node
#wget https://npm.taobao.org/mirrors/node/v4.4.7/node-v4.4.7-linux-x64.tar.gz
#tar -zxvf node-v4.4.7-linux-x64.tar.gz
#ln -s /usr/local/node/node-v4.4.7-linux-x64/bin/npm /usr/local/bin/npm
#ln -s /usr/local/node/node-v4.4.7-linux-x64/bin/node /usr/local/bin/node
#npm -v
去網上找這個插件elasticsearch-head,找不到也能夠直接pass作下一步
#cd /usr/local/src/elasticsearch-head #必須進入這個目錄才能夠,不然報錯
#npm run start & 執行以後查看端口會發現9100
玩到這裏你會發現這個插件不能鏈接,去修改主配置文件/etc/elasticsearch/elasticsearch.yml,增長這兩行內容
http.cors.enabled: true
http.cors.allow-origin: "*"
成功鏈接到集羣
玩一玩,點一點,測試一下
第四步:監控平臺健康值
[root@linux-node01 elasticsearch-head]# curl –sXGET http://192.168.2.132:9200/_cluster/health?pretty=true
curl: (6) Could not resolve host: xn--sxget-xu3b; Name or service not known
{
"cluster_name" : "elk-cluster1",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 2,
"number_of_data_nodes" : 2,
"active_primary_shards" : 5,
"active_shards" : 10,
"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
}
經過這個命令能夠寫一個腳原本監控系統健康狀態
第五步:安裝logstash,這個是你要檢測的系統或服務器須要安裝,在node2安裝,node1不須要
#cd /usr/local/src/
# ls #把logstash的rpm軟件包傳上去
elasticsearch-head elasticsearch-head.tar.gz logstash-5.6.5.rpm
[root@linux-node02 src]# yum -y install logstash-5.6.5.rpm
#/usr/share/logstash/bin/logstash --help #命令幫助信息
-t, --config.test_and_exit Check configuration for valid syntax and then exit. #測試配置文件格式是否正確
-f, --path.config CONFIG_PATH #指定文件
測試一下
#/usr/share/logstash/bin/logstash -e 'input { stdin{} } output { stdout{ codec => rubydebug }}' #它的主要功能input和output兩個模塊,注意格式不要錯
The stdin plugin is now waiting for input:
123 #輸入123,輸出格式化標準信息,說明麼有問題,可使用
{
"@version" => "1",
"host" => "linux-node02",
"@timestamp" => 2019-10-17T02:32:14.783Z,
"message" => "123"
}
[root@linux-node02 conf.d]# /usr/share/logstash/bin/logstash -e 'input { stdin{} } output { file { path=> "/tmp/a.txt" }}' #修改輸出模塊,直接輸出到一個目錄文件中,
[root@linux-node02 ~]# tail /tmp/a.txt
{"@version":"1","host":"linux-node02","@timestamp":"2019-10-17T02:37:52.832Z","message":"dffd"}
{"@version":"1","host":"linux-node02","@timestamp":"2019-10-17T02:37:54.464Z","message":"123"}
{"@version":"1","host":"linunode02","@timestamp":"2019-10-17T02:37:55.717Z","message":"fdfdf"}
測試配置文件書寫格式是否正確,若是錯誤會有提示
[root@linux-node02 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/systemlog.conf -t #利用上面的格式,咱們來寫一個將系統日誌的內容輸出到一個測試文件中,-t測試文件格式
WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using --path.settings. Continuing using the defaults
Could not find log4j2 configuration at path /usr/share/logstash/config/log4j2.properties. Using default config which logs errors to the console
Configuration OK
文件內容 /etc/logstash/conf.d/systemlog.conf
input{
file{
path => "/var/log/messages"
start_position => "beginning"
type => "systemlog-132"
stat_interval => "2"
}
}
output{
elasticsearch {
hosts => ["192.168.2.11:9200"]
index => "logstash-system-log-132-%{+YYYY.MM.dd}" #基礎啦,這個要是看不懂,就去看書去吧,意思是按照年月日的格式來輸出
}
file{
path => "/tmp/logstash.txt"
}
} #注意大括號是成雙成對的
啓動的時候發現個人systemctl start lsgstash 很差使,百度一下,以下步驟解決,
[root@linux-node02 conf.d]# /usr/share/logstash/bin/system-install /etc/logstash/startup.options systemd
Using provided startup.options file: /etc/logstash/startup.options
Manually creating startup for specified platform: systemd
Successfully created system startup script for Logstash
[root@linux-node02 conf.d]# systemctl start logstash
#cat /var/log/logstash/logstash-plain.log #看日誌最後一行的Successfully 你懂的啦
[2019-10-17T11:14:48,947][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
正常的話會看到兩個java程序 ,
作到這裏發現/tmp目錄下沒有咱們剛纔輸出的那個文件,查了一下,是由於日誌文件對其餘人沒有權限,改一下吧,644
#chmod 644 /var/log/messages
#tail /tmp/logstash.txt 能夠看到日誌輸出到了這裏,恭喜你,作到這裏,還有一步就能最後看到WEB管理界面了
第六步:kibana安裝,node1節點安裝
[root@linux-node01 ~]# ls #老套路,把rpm包上傳到這裏,而後yum install -y kibana-5.6.5-x86_64.rpm 安裝就行了
elasticsearch-5.6.5.rpm kibana-5.6.5-x86_64.rpm
[root@linux-node01 ~]# egrep -v "^#|^$" /etc/kibana/kibana.yml #修改一下配置文件
server.port: 5601 #默認服務端口
server.host: "192.168.2.130" #服務主機的地址,咱們這裏寫本身的IP地址
elasticsearch.url: "http://192.168.2.132:9200" #要收集日誌的目的地,elasticsearch的url和端口
啓動服務
[root@linux-node01 ~]# systemctl start kibana
測試
[root@linux-node01 ~]# ss -nlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:9100 *:* #9100是head插件的端口
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 192.168.2.130:5601 *:* #5601是kibana默認的端口
LISTEN 0 128 ::ffff:192.168.2.130:9200 :::* #9200和9300是elasticsearch默認的端口
LISTEN 0 128 ::ffff:192.168.2.130:9300 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
有了端口,就去瀏覽器看一下
[root@linux-node02 ~]# ss -nlt #看一下node2 的端口信息,
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 ::ffff:192.168.2.132:9200 :::*
LISTEN 0 128 ::ffff:192.168.2.132:9300 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 50 ::ffff:127.0.0.1:9600 :::* #9600是logstash默認的端口,沒有這幾個端口就說明你的服務沒有開啓
剛開始是沒有信息的,須要咱們添加一個索引模式,就按照咱們剛纔系統日誌測試的來,注意要選擇間隔,看你是天天仍是每小時,能夠本身調試
[logstash-system-log-132]-YYYY.MM.DD
若是發現頁面時間不同,配置ntp服務器,時間必定要全網同步,否則。。。。。
作到這裏,咱們的ELK三件套就算所有按照完成了,暫時功德圓滿,還有不少能夠玩,添加logstash的配置文件,測試Apache或者nginx,你想咋玩就咋玩,記住這是一個日誌審計平臺
Apache服務日誌
編輯配置/etc/logstash/conf.d/apache_log.conf
input { file {path => "/etc/httpd/logs/access_log" type => "access" start_position => "beginning"}
file { path => "/etc/httpd/logs/error_log" type => "error" start_position => "beginning" } }
output { if [type] == "access" { elasticsearch { hosts => ["10.0.0.133:9200"] index => "apache_access-%{+YYYY.MM.dd}" } }
if [type] == "error" { elasticsearch { hosts => ["10.0.0.133:9200"] index => "apache_error-%{+YYYY.MM.dd}" } } }
GAME OVER !!!!!! 碼字不易,各位看官加個關注吧,秒回關的那種