ELK+kafka+filebeat企業內部日誌分析系統
ELK+kafka+filebeat企業內部日誌分析系統
elk:日誌蒐集平臺
ELK由ElasticSearch、Logstash和Kiabana三個開源工具組成:
1、元件介紹
1、Elasticsearch:
ElasticSearch是一個基於Lucene的開源分散式搜尋伺服器。
只搜尋和分析日誌
特點:分散式,零配置,自動發現,索引自動分片,索引副本機制等
。它提供了一個分散式多使用者能力的全文搜尋引擎。Elasticsearch是用Java開發的,並作為Apache許可條款下的開放原始碼釋出,設計用於雲計算中,能夠達到實時搜尋,穩定,可靠,快速,安裝使用方便。 在elasticsearch中,所有節點的資料是均等的。
2、Logstash:
Logstash是一個完全開源工具,可以對你的日誌進行收集、過濾、分析,並將其儲存供以後使用
只收集和過濾日誌,和改格式
簡單來說logstash就是一根具備實時資料傳輸能力的管道,負責將資料資訊從管道的輸入端傳輸到管道的輸出端;與此同時這根管道還可以讓你根據自己的需求在中間加上濾網,Logstash提供裡很多功能強大的濾網以滿足你的各種應用場景。
② Logstash的事件(logstash將資料流中等每一條資料稱之為一個event)處理流水線有三個主要角色完成:inputs –> filters –> outputs:
logstash整個工作流分為三個階段:輸入、過濾、輸出。每個階段都有強大的外掛提供支援
:
Input 必須,負責產生事件(Inputs generate events),常用的外掛有
file 從檔案系統收集資料
syslog 從syslog日誌收集資料
redis 從redis收集日誌
beats 從beats family收集日誌(如:Filebeats)
Filter常用的外掛有, 可選,負責資料處理與轉換(filters modify )
grok是logstash中最常用的日誌解釋和結構化外掛。:grok是一種採用組合多個預定義的正則表示式,用來匹配分割文字並對映到關鍵字的工具。
mutate 支援事件的變換,例如重新命名、移除、替換、修改等
drop 完全丟棄事件
clone 克隆事件
output 輸出,必須,負責資料輸出(outputs ship elsewhere),常用的外掛有
elasticsearch 把資料輸出到elasticsearch
file 把資料輸出到普通的檔案
3、Kibana:
Kibana 是一個基於瀏覽器頁面的Elasticsearch前端展示工具,也是一個開源和免費的工具,Kibana可以為 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 介面,可以幫你彙總、分析和搜尋重要資料日誌。
2、環境介紹
安裝軟體主機名IP地址系統版本
Elasticsearch/mes-1-zk192。168。246。234centos7。4——3Gzookeeper/kafka/Logstashes-2-zk-log192。168。246。231centos7。4——2Ghead/Kibanaes-3-head-kib-zk-File192。168。246。235centos7。4——-2G
所有機器關閉防火牆,selinux
3、版本說明
Elasticsearch: 6。5。4 #https://artifacts。elastic。co/downloads/elasticsearch/elasticsearch-6。5。4。tar。gz
Logstash: 6。5。4 #https://artifacts。elastic。co/downloads/logstash/logstash-6。5。4。tar。gz
Kibana: 6。5。4 #https://artifacts。elastic。co/downloads/kibana/kibana-6。5。4-linux-x86_64。tar。gz
Kafka: 2。11-2。1 #https://archive。apache。org/dist/kafka/2。1。0/kafka_2。11-2。1。0。tgz
Filebeat: 6。5。4
相應的版本最好下載對應的外掛
相關地址:
官網地址:https://www。elastic。co
官網搭建:
https://www。
elastic。co/guide/index。
html
實施部署
1、 Elasticsearch部署
Elasticsearch最關鍵的就是提供強大的索引能力。
Elasticsearch索引的精髓:一切設計都是為了提高搜尋的效能
Elasticsearch優勢
1。橫向可擴充套件性:只需要增加伺服器,做一點兒配置,啟動一下Elasticsearch就可以併入叢集。
2。分片機制提供更好的分佈性:同一個索引分成多個分片, 分而治之的方式可提升處理效率。
3。高可用:提供複製( replica) 機制,一個分片可以設定多個複製,使得某臺伺服器在宕機的情況下,叢集仍舊可以照常執行,並會把伺服器宕機丟失的資料資訊複製恢復到其他可用節點上。
4。使用簡單:共需一條命令就可以下載檔案,然後很快就能搭建一一個站內搜尋引擎。
Elasticsearch儲存結構
Elasticsearch是檔案儲存,Elasticsearch是面向文件型資料庫,一條資料在這裡就是一個文件
系統型別:Centos7。5 節點IP:172。16。246。234 軟體版本:jdk-8u191-linux-x64。tar。gz、elasticsearch-6。5。4。tar。gz 示例節點:172。16。246。234
1、安裝配置jdk8
ES執行依賴jdk8 ——-三臺機器都操作,先上傳jdk1。8
[root@mes-1 ~]# tar xzf jdk-8u191-linux-x64。tar。gz -C /usr/local/
[root@mes-1 ~]# cd /usr/local/
[root@mes-1 local]# mv jdk1。8。0_191/ java
[root@mes-1 local]# echo ‘
JAVA_HOME=/usr/local/java
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH
’ >>/etc/profile
[root@mes-1 ~]# source /etc/profile
2、安裝配置ES----只在第一臺操作操作下面的部分
(1)建立執行ES的普通使用者
[root@mes-1 ~]# useradd elsearch
[root@mes-1 ~]# echo “123456” | passwd ——stdin “elsearch”
(2)安裝配置ES
[root@mes-1 ~]# tar xzf elasticsearch-6。5。4。tar。gz -C /usr/local/
[root@mes-1 ~]# cd /usr/local/elasticsearch-6。5。4/config/
[root@mes-1 config]# ls
elasticsearch。yml log4j2。properties roles。yml users_roles
jvm。options role_mapping。yml users
[root@mes-1 config]# cp elasticsearch。yml elasticsearch。yml。bak
[root@mes-1 config]# vim elasticsearch。yml ——找個地方新增如下內容
cluster。name: elk
node。name: elk01
node。master: true
node。data: true
path。data: /data/elasticsearch/data
path。logs: /data/elasticsearch/logs
bootstrap。memory_lock: false
bootstrap。system_call_filter: false
network。host: 0。0。0。0
http。port: 9200
#discovery。zen。ping。unicast。hosts: [“192。168。246。234”, “192。168。246。231”,“192。168。246。235”]
#discovery。zen。minimum_master_nodes: 2
#discovery。zen。ping_timeout: 150s
#discovery。zen。fd。ping_retries: 10
#client。transport。ping_timeout: 60s
http。cors。enabled: true
http。cors。allow-origin: “*”
配置項含義:
cluster。name 叢集名稱,各節點配成相同的叢集名稱。
node。name 節點名稱,各節點配置不同。
node。master 指示某個節點是否符合成為主節點的條件。
node。data 指示節點是否為資料節點。資料節點包含並管理索引的一部分。
path。data 資料儲存目錄。
path。logs 日誌儲存目錄。
bootstrap。memory_lock
bootstrap。system_call_filter
network。host 繫結節點IP。
http。port 埠。
discovery。zen。ping。unicast。hosts 提供其他 Elasticsearch 服務節點的單點廣播發現功能。
discovery。zen。minimum_master_nodes 叢集中可工作的具有Master節點資格的最小數量,具有master資格的節點的數量。
discovery。zen。ping_timeout 節點在發現過程中的等待時間。
discovery。zen。fd。ping_retries 節點發現重試次數。
http。cors。enabled 用於允許head外掛訪問ES。
http。cors。allow-origin 允許的源地址。
(3)設定JVM堆大小
[root@mes-1 config]# vim jvm。options ——將
-Xms1g ——修改成 -Xms2g
-Xmx1g ——修改成 -Xms2g
或者:
推薦設定為4G,請注意下面的說明:
sed -i ‘s/-Xms1g/-Xms4g/’ /usr/local/elasticsearch-6。5。4/config/jvm。options
sed -i ‘s/-Xmx1g/-Xmx4g/’ /usr/local/elasticsearch-6。5。4/config/jvm。options
注意: 確保堆記憶體最小值(Xms)與最大值(Xmx)的大小相同,防止程式在執行時改變堆記憶體大小。 堆記憶體大小不要超過系統記憶體的50%
(4)建立ES資料及日誌儲存目錄
[root@mes-1 ~]# mkdir -p /data/elasticsearch/data (/data/elasticsearch)
[root@mes-1 ~]# mkdir -p /data/elasticsearch/logs (/log/elasticsearch)
(5)修改安裝目錄及儲存目錄許可權
[root@mes-1 ~]# chown -R elsearch:elsearch /data/elasticsearch
[root@mes-1 ~]# chown -R elsearch:elsearch /usr/local/elasticsearch-6。5。4
3、系統最佳化
(1)增加最大檔案開啟數
永久生效方法: echo “* - nofile 65536” >> /etc/security/limits。conf
(2)增加最大程序數
[root@mes-1 ~]# vim /etc/security/limits。conf ——-在檔案最後面新增如下內容
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
更多的引數調整可以直接用這個
(3)增加最大記憶體對映數
[root@mes-1 ~]# vim /etc/sysctl。conf ——-新增如下
vm。max_map_count=262144
vm。swappiness=0
[root@mes-1 ~]# sysctl -p
啟動如果報下列錯誤
memory locking requested for elasticsearch process but memory is not locked
elasticsearch。yml檔案
bootstrap。memory_lock : false
/etc/sysctl。conf檔案
vm。swappiness=0
錯誤:
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
意思是elasticsearch使用者擁有的客串建檔案描述的許可權太低,知道需要65536個
解決:
切換到root使用者下面,
vim /etc/security/limits。conf
在最後新增
* hard nofile 65536
* hard nofile 65536
重新啟動elasticsearch,還是無效?
必須重新登入啟動elasticsearch的賬戶才可以,例如我的賬戶名是elasticsearch,退出重新登入。
另外*也可以換為啟動elasticsearch的賬戶也可以,* 代表所有,其實比較不合適
啟動還會遇到另外一個問題,就是
max virtual memory areas vm。max_map_count [65530] is too low, increase to at least [262144]
意思是:elasticsearch使用者擁有的記憶體許可權太小了,至少需要262114。這個比較簡單,也不需要重啟,直接執行
# sysctl -w vm。max_map_count=262144
就可以了
4、啟動ES
[root@mes-1 ~]# su - elsearch
Last login: Sat Aug 3 19:48:59 CST 2019 on pts/0
[root@mes-1 ~]$ cd /usr/local/elasticsearch-6。5。4/
[root@mes-1 elasticsearch-6。5。4]$ 。/bin/elasticsearch #先啟動看看報錯不,需要多等一會
終止之後
[root@mes-1 elasticsearch-6。5。4]$ nohup 。/bin/elasticsearch & #放後臺啟動
[1] 11462
nohup: ignoring input and appending output to ‘nohup。out’
[root@mes-1 elasticsearch-6。5。4]$ tail -f nohup。out #看一下是否啟動
或者:
su - elsearch -c “cd /usr/local/elasticsearch-6。5。4 && nohup bin/elasticsearch &”
測試:瀏覽器訪問http://172。16。246。234:9200
9200與9300埠號的區別
9300埠: ES節點之間通訊使用,是TCP協議埠號,ES叢集之間通訊埠號。
9200埠: ES節點和外部通訊使用,暴露介面埠號。瀏覽器訪問時使用
5.安裝配置head監控外掛(Web前端)----只需要安裝一臺就可以了。192.168.246.235
(1)安裝node
[root@es-3-head-kib ~]# wget https://npm。taobao。org/mirrors/node/latest-v4。x/node-v4。4。7-linux-x64。tar。gz
[root@es-3-head-kib ~]# tar -zxf node-v4。4。7-linux-x64。tar。gz –C /usr/local
[root@es-3-head-kib ~]# vim /etc/profile #新增如下變數
NODE_HOME=/usr/local/node-v4。4。7-linux-x64
PATH=$NODE_HOME/bin:$PATH
export NODE_HOME PATH
[root@es-3-head-kib ~]# source /etc/profile
[root@es-3-head-kib ~]# node ——version #檢查node版本號
v4。4。7
(2)下載head外掛
[root@es-3-head-kib ~]# wget https://github。com/mobz/elasticsearch-head/archive/master。zip
[root@es-3-head-kib ~]# cp master。zip /usr/local/
[root@es-3-head-kib ~]# unzip -d /usr/local/ master。zip
[root@es-3-head-kib ~]# cd /usr/local
或者
unzip –d /usr/local elasticsearch-head-master。zip
(3)安裝grunt
[root@es-3-head-kib ~]# cd elasticsearch-head-master/
[root@mes-3-head-kib elasticsearch-head-master]# npm config set registry https://registry。npm。taobao。org #更換一個映象,如果不更換下載會很慢
[root@mes-3-head-kib elasticsearch-head-master]# npm install -g grunt-cli #時間會很長
[root@es-3-head-kib elasticsearch-head-master]# grunt ——version #檢查grunt版本號
(4)修改head原始碼
[root@es-3-head-kib elasticsearch-head-master]# vim /usr/local/elasticsearch-head-master/Gruntfile。js (95左右)
新增hostname,注意在上一行末尾新增逗號,hostname 不需要新增逗號 [root@es-3-head-kib elasticsearch-head-master]# vim /usr/local/elasticsearch-head-master/_site/app。js (4359左右)
如果在一臺機器上面可以不修改下面的操作。保持原來的就可以了
如果是叢集需要修改如下資訊:
原本是http://localhost:9200 ,如果head和ES不在同一個節點,注意修改成ES的IP地址
(5)下載head必要的檔案
[root@es-3-head-kib ~]# wget https://github。com/Medium/phantomjs/releases/download/v2。1。1/phantomjs-2。1。1-linux-x86_64。tar。bz2
[root@es-3-head-kib ~]# yum -y install bzip2
[root@es-3-head-kib ~]# tar -jxf phantomjs-2。1。1-linux-x86_64。tar。bz2 -C /tmp/ #解壓
(6)執行head
[root@es-3-head-kib ~]# cd /usr/local/elasticsearch-head-master/
[root@es-3-head-kib elasticsearch-head-master]# npm config set registry https://registry。npm。taobao。org #先執行這條命令更換一個映象
[root@es-3-head-kib elasticsearch-head-master]# npm install
。。。
grunt-contrib-jasmine@1。0。3 node_modules/grunt-contrib-jasmine
├── sprintf-js@1。0。3
├── lodash@2。4。2
├── es5-shim@4。5。13
├── chalk@1。1。3 (escape-string-regexp@1。0。5, supports-color@2。0。0, ansi-styles@2。2。1, strip-ansi@3。0。1, has-ansi@2。0。0)
├── jasmine-core@2。99。1
├── rimraf@2。6。3 (glob@7。1。4)
└── grunt-lib-phantomjs@1。1。0 (eventemitter2@0。4。14, semver@5。7。0, temporary@0。0。8, phan
[root@es-3-head-kib elasticsearch-head-master]# nohup grunt server &
(7)測試
訪問http://172。16。246。235:9100
叢集中節點的分類
主節點:首先要將節點設定為候選主節點,候選主節點的設定方法是設定node。mater為true,預設情況下,node。mater和node。data的值都為true。在叢集啟動後各個節點會在候選節點中選舉一個主節點。主節點負責建立索引、刪除索引、分配分片、追蹤叢集中的節點狀態等工作。
資料節點:負責資料的儲存和相關具體操作,比如搜尋。所以,資料節點對機器配置要求比較高,首先需要有足夠的磁碟空間來儲存資料,其次資料操作對系統CPU、Memory和IO的效能消耗都很大。通常隨著叢集的擴大,需要增加更多的資料節點來提高可用性。
客戶端節點:負責請求的分發和彙總,本身並不儲存資料。從而更好的實現負載均衡。
協調節點:這是一個節點的角色,不管是主節點、資料節點還是客戶端節點,只要請求是由哪個節點進行分發和彙總,那麼該節點就是承擔了協調節點的角色。協調節點對處理器和執行記憶體要求比較高,客戶端節點只能作為協調節點。
分片
主分片(Primary Shard):是elasticsearch的最小儲存單元,一個index中的資料通常會儲存在多個分片中。預設情況下,elasticsearch會為每個index分為5個分片。分片並不是越多越好,雖然分片查詢時並行的,但是請求的分發和結果的合併都需要消耗時間和效能的,所以在資料量比較少的情況下,分片太多反而會降低效率。分片在建立index的時候就已經分配好,並且無法修改。
複製分片(Replica Shard):主要是進行資料冗餘來提高系統的可靠性。
叢集狀態
Red,表示有主分片沒有分配,某些資料不可用。
Yellow,表示主分片都已分配,資料都可用,但是有複製分片沒有分配。
Green,表示主分片和複製分片都已分配,一切正常。
2、 Kibana部署
系統型別:Centos7。5 節點IP:192。168。246。235 D 軟體版本:nginx-1。14。2、kibana-6。5。4-linux-x86_64。tar。gz
1. 安裝配置Kibana
(1)安裝
[root@es-3-head-kib ~]# tar zvxf kibana-6。5。4-linux-x86_64。tar。gz -C /usr/local/
(2)配置
[root@es-3-head-kib ~]# cd /usr/local/kibana-6。5。4-linux-x86_64/config/
[root@es-3-head-kib config]# vim kibana。yml
server。port: 5601
server。host: “192。168。246。235”
elasticsearch。url: “http://192。168。246。234:9200”
kibana。index: “。kibana”
配置項含義:
server。port kibana服務埠,預設5601
server。host kibana主機IP地址,預設localhost
elasticsearch。url 用來做查詢的ES節點的URL,預設http://localhost:9200
kibana。index kibana在Elasticsearch中使用索引來儲存儲存
dashboards,預設。kibana
其他配置項可參考:
https://www。
elastic。co/guide/en/kib
ana/6。5/settings。html
(3)啟動
[root@es-3-head-kib config]# cd 。。
[root@es-3-head-kib kibana-6。5。4-linux-x86_64]# nohup 。/bin/kibana &
[1] 12054
[root@es-3-head-kib kibana-6。5。4-linux-x86_64]# nohup: ignoring input and appending output to ‘nohup。out’
2. 安裝配置Nginx反向代理
(1)配置YUM源:
[root@es-3-head-kib ~]# rpm -ivh
http://
nginx。org/packages/cent
os/7/noarch/RPMS/nginx-release-centos-7-0。el7。ngx。noarch。rpm
(2)安裝:
[root@es-3-head-kib ~]# yum install -y nginx 注意:httpd-tools用於生成nginx認證訪問的使用者密碼檔案
(3)配置反向代理
[root@es-3-head-kib ~]# cd /etc/nginx/conf。d/
[root@es-3-head-kib conf。d]# cp default。conf nginx。conf
[root@es-3-head-kib conf。d]# mv default。conf default。conf。bak
[root@es-3-head-kib conf。d]# vim nginx。conf
[root@es-3-head-kib conf。d]# cat nginx。conf
server {
listen 80;
server_name 192。168。246。235;
#charset koi8-r;
# access_log /var/log/nginx/host。access。log main;
# access_log off;
location / {
proxy_pass http://192。168。246。235:5601;
proxy_set_header Host $host:5601;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Via “nginx”;
}
location /head/{
proxy_pass http://192。168。246。235:9100;
proxy_set_header Host $host:9100;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Via “nginx”;
}
}
(4)配置nginx
1。將原來的log_format註釋掉,新增json格式的配置資訊,如下:
[root@es-3-head-kib conf。d]# vim /etc/nginx/nginx。conf
log_format json ‘{“@timestamp”:“$time_iso8601”,’
‘“@version”:“1”,’
‘“client”:“$remote_addr”,’
‘“url”:“$uri”,’
‘“status”:“$status”,’
‘“domain”:“$host”,’
‘“host”:“$server_addr”,’
‘“size”:$body_bytes_sent,’
‘“responsetime”:$request_time,’
‘“referer”: “$http_referer”,’
‘“ua”: “$http_user_agent”’
‘}’;
2。引用定義的json格式的日誌:
access_log /var/log/nginx/access_json。log json;
(5)啟動nginx
root@es-3-head-kib ~]# systemctl start nginx
瀏覽器訪問http://192。168。246。235 剛開始沒有任何資料,會提示你建立新的索引。