在平常運維工做中,對於系統和業務日誌的處理尤其重要。尤爲是分佈式架構,每一個服務都會有不少節點,若是要手工一個一個的去取日誌,運維怕是要累死。 java
簡單介紹:node
ELK 是 elasticsearch + logstash + kibana 三款開源軟件的簡稱。linux
elasticsearch:是個開源的分佈式搜索引擎,特色是:分佈式、配置簡單、自動發現、索引自動分片、索引副本機制、restful風格接口,多數據源,自動搜索負載等nginx
logstash:能夠對日誌進行收集、濾過、並將其存儲在 elasticsearch中git
kibana:能夠爲 elasticsearch提供友好的用戶交互界面,用戶能夠經過 kibana來分析、搜索甚至繪圖來分析數據。github
這裏介紹下目前使用比較多的架構:npm
ELK + filebeat bootstrap
Filebeat 是一個輕量級開源日誌文件數據收集器,能夠將它安裝到須要收集的節點上,它會將日誌輸送到 logstash 或 elasticsearchvim
有了 ELK 就能夠將分佈到多臺的日誌統一規劃起來。瀏覽器
網絡上有不少關於 ELK 的部署方案,參考了不少發現要不就是老版本的,要不就是不太完善,所以本身作下記錄。
注意:在安裝 ELK 的時候,這三個軟件的版本必須保持支持,不然出現各類bug
實驗拓撲圖:
實驗環境主機服務介紹:
本次實驗是收集 nginx 日誌,並存儲在 elasticsearch中。將 elasticsearch 和 kibana 安裝在同一主機上能夠避免沒必要要的網絡IO操做,直接本機交互。
(1)初始化工做
時間同步:
[root@192.168.118.14 ~]#ntpdate tiger.sina.com.cn
修改主機名:
[root@192.168.118.14 ~]#hostnamectl set-hostname node1 修改完主機名別忘記在 /etc/hosts 中申明 192.168.118.14 node1
修改文件打開最大數:
[root@192.168.118.14 ~]#vim /etc/security/limits.conf * soft nproc 655350 * hard nproc 655350 * soft nofile 655350 * hard nofile 655350 [root@192.168.118.14 ~]#ulimit -SHn 655350
(2)配置 java 環境
[root@192.168.118.14 /usr/local/src]#tar xf jdk-8u77-linux-x64.tar.gz -C /usr/local/ 在 /etc/profile 文件中追加 JAVA_HOME=/usr/local/jdk1.8.0_77 JAVA_BIN=$JAVA_HOME/bin PATH=$PATH:$JAVA_BIN CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME JAVA_BIN PATH CLASSPATH [root@192.168.118.14 /usr/local/src]#source /etc/profile [root@192.168.118.14 /usr/local/src]#ln -vs /usr/local/jdk1.8.0_77/bin/java /usr/bin/ [root@192.168.118.14 /usr/local/src]#java -version java version "1.8.0_77" Java(TM) SE Runtime Environment (build 1.8.0_77-b03) Java HotSpot(TM) 64-Bit Server VM (build 25.77-b03, mixed mode)
(3)安裝 elasticsearch
下載地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch
這裏下載的是 6.8 的 rpm 包
直接安裝:
[root@192.168.118.14 ~/ELK]#yum localinstall elasticsearch-6.8.2.rpm 修改配置文件以下: [root@192.168.118.14 ~/ELK]#egrep ^[a-z] /etc/elasticsearch/elasticsearch.yml cluster.name: super-cluster node.name: node1 path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch bootstrap.memory_lock: true network.host: 0.0.0.0 http.port: 9200 discovery.zen.ping.unicast.hosts: ["192.168.118.14"] http.cors.enabled: true http.cors.allow-origin: "*"
啓動
[root@192.168.118.14 ~/ELK]#systemctl enable elasticsearch ; systemctl start elasticsearch
首次啓動可能會啓動失敗,查看日誌:
[root@192.168.118.14 ~/ELK]#tail /var/log/elasticsearch/super-cluster.log … [1]: memory locking requested for elasticsearch process but memory is not locked …
如上報錯,須要修改啓動腳本:
[root@192.168.118.14 ~/ELK]#vim /lib/systemd/system/elasticsearch.service 在 [Service] 配置段添加: … LimitMEMLOCK=infinity … [root@192.168.118.14 ~/ELK]#systemctl daemon-reload [root@192.168.118.14 ~/ELK]#systemctl start elasticsearch
查看端口,若是 9200 和 9300 監聽,則說明 elasticsearch啓動成功。
驗證:
[root@192.168.118.14 ~/ELK]#curl http://localhost:9200/ { "name" : "node1", "cluster_name" : "super-cluster", "cluster_uuid" : "1FD-KmYMTVCzWVPI9vn8zw", "version" : { "number" : "6.8.2", "build_flavor" : "default", "build_type" : "rpm", "build_hash" : "b506955", "build_date" : "2019-07-24T15:24:41.545295Z", "build_snapshot" : false, "lucene_version" : "7.7.0", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search" }
到此,elasticsearch安裝成功。
這裏多安裝一個elasticsearch-head 用來調試和查看數據是很是方便的。
程序下載地址:https://github.com/mobz/elasticsearch-head
首先安裝依賴包
yum install git nodejs openssl-devel screen -y 克隆 elasticsearch-head項目 [root@192.168.118.14 ~]# git clone https://github.com/mobz/elasticsearch-head.git [root@192.168.118.14 ~]# cd elasticsearch-head/ 此時忽略phantomjs-prebuilt@2.1.16,執行命令以下 [root@node1 elasticsearch-head]# npm install phantomjs-prebuilt --ignore-scripts [root@node1 elasticsearch-head]# npm install …
這裏是一個很是緩慢的過程。
啓動 elasticsearch-head 服務
[root@192.168.118.14 ~]#cd elasticsearch-head/ [root@192.168.118.14 ~/elasticsearch-head]#screen [root@node1 elasticsearch-head]# npm run start Ctrl+a Ctrl+d 將進程放置到後臺,這裏不懂的查下 screen 命令,很好使。
查看端口 只要 9100 被監聽,說明啓動成功。
瀏覽器訪問:
妥了,安裝成功。經過 elasticsearch-head 能夠查看 elasticsearch 中的全部數據。目前就一個 node1 索引。若是要深刻學習 elasticsearch 推薦一本書《elasticsearch-the-definitive-guide-cn》 網上有 PDF 能夠下載。
接下來,安裝 kibana 。Kibana 和 elasticsearch安裝到同一臺主機的
Kibana 下載地址:https://www.elastic.co/cn/downloads/past-releases#kibana
直接rpm包安裝
[root@192.168.118.14 ~/ELK]#yum localinstall kibana-6.8.2-x86_64.rpm -y
修改配置文件:
這裏注意,若是將 kibana 端口修改成 80 ,這裏是須要修改kibana啓動用戶爲 root 由於普通用戶是不能啓動 1024 如下端口的。
修改啓動配置文件:
[root@192.168.118.14 ~]#vim /etc/systemd/system/kibana.service User=root Group=root 再次啓動服務 [root@192.168.118.14 ~]#systemctl daemon-reload [root@192.168.118.14 ~]#systemctl restart kibana
查看 80 端口若是被監聽就說明啓動成功。
根據規劃,logstash 應該被安裝到一臺獨立的主機上,logstash安裝很是簡單。
Logstash 下載地址:https://www.elastic.co/cn/downloads/past-releases#logstash
和上面同樣,初始化工做不要忘記,這裏就再也不描述了。
安裝 jdk 也和上面同樣的,jdk驗證:
[root@192.168.118.15 /usr/local/src]#java -version java version "1.8.0_77" Java(TM) SE Runtime Environment (build 1.8.0_77-b03) Java HotSpot(TM) 64-Bit Server VM (build 25.77-b03, mixed mode)
安裝 logstash
[root@192.168.118.15 ~]#yum localinstall logstash-6.8.2.rpm -y 將 logstash 命令添加到 PATH 環境變量中 [root@192.168.118.15 /etc/logstash]#vim /etc/profile.d/logstash.sh export PATH=/usr/share/logstash/bin:$PATH
Ok, 到這裏已經安裝完成,是否是很簡單。
驗證:
[root@192.168.118.15 ~]#logstash -e 'input { stdin {} } output { stdout{} }' 只要出現 Successfully started Logstash API endpoint {:port=>9600} 就表示啓動成功。 你好,中國 { "@version" => "1", "message" => "你好,中國", "host" => "logstash-node1", "@timestamp" => 2019-09-14T04:14:35.035Z
測試經過,logstash驗證成功。
Filebeat 下載地址:https://www.elastic.co/cn/downloads/past-releases#filebeat
首先安裝 nginx 直接yum安裝
[root@192.168.118.16 ~]#yum install nginx -y 啓動nginx [root@192.168.118.16 ~]#nginx
安裝 filebeat
[root@192.168.118.16 ~]#yum localinstall filebeat-6.8.2-x86_64.rpm -y 開啓nginx模塊 [root@192.168.118.16 ~]#cd /etc/filebeat/ [root@192.168.118.16 /etc/filebeat]#filebeat modules enable nginx Enabled nginx
修改 filebeat主配置文件:
[root@192.168.118.16 ~]#vim /etc/filebeat/filebeat.yml 註釋掉輸出到 elasticsearch #output.elasticsearch: # Array of hosts to connect to. #hosts: ["localhost:9200"] 開啓輸出到 logstash output.logstash: # The Logstash hosts hosts: ["192.168.118.16:5044"]
注意這裏的 hosts 要寫 logstash 主機的 IP
修改 nginx 模塊配置文件:
[root@192.168.118.16 ~]#vim /etc/filebeat/modules.d/nginx.yml
啓動 filebeat 服務
[root@192.168.118.16 ~]#systemctl start filebeat Filebeat 服務是沒有監聽端口的,只要狀態是 running 就表示啓動成功,能夠查看 filebeat 日誌 /var/log/filebeat/filebeat
到此,ELK + filebeat 已經部署完畢,接下來就能夠安裝需求來進行調整和收集數據,而這一塊的工做都集中在 logstash,所以 ELK 編寫 logstash 纔是難點。Logstash 配置語法,強力建議查看官方文檔,很是全面了。
這裏採用按部就班的方式展開,能夠先寫一個簡單的測試。
編寫一個將數據輸出到屏幕的配置文件:
[root@192.168.118.15 /etc/logstash/conf.d]#vim test.conf
Logstash 能夠根據配置文件來啓動,啓動方式以下:
[root@192.168.118.15 /etc/logstash/conf.d]#logstash -f test.conf 出現 Successfully started Logstash API endpoint 就表示啓動成功。
啓動成功後,咱們嘗試訪問 nginx 生成日誌數據。
日誌文件已經傳輸過來了,接下來就是把這些數據寫入到 elasticsearch 中。
繼續修改配置文件:
經過配置文件啓動 logstash
[root@192.168.118.15 /etc/logstash/conf.d]#logstash -f test.conf
嘗試訪問 nginx 查看 elasticsearch-head中是否有新的索引被建立出來。
如上圖,一個新的索引被建立出來,能夠經過 elasticsearch-head 查看該索引中的數據。
目前已經將日誌數據寫入到 elasticsearch中了, 而後經過 kibana 展現出來,瀏覽器訪問上面裝好的 kibana
設置完成,直接點擊 Discover
多訪問幾回nginx,查看日誌是否展現出來。
ok,到此, ELK + filebeat 獲取 nginx 日誌就完成了。雖然將日誌展現出來了, 可是這樣雜亂無章的日誌數據看着仍是很難受的,這就須要進一步的規整。
下一篇再寫若是更詳細的經過 logstash獲取nginx日誌數據,而後經過kibana展現更規整的數據及繪圖。