本文收錄在Linux運維企業架構實戰系列html
els:ElasticSearch,Logstash,Kibana,Beats前端
elk:ElasticSearch,Logstash,Kibanajava
ElasticSearch 是一個基於Lucene的搜索引擎,提供索引,搜索功能。它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用Java開發的,並做爲Apache許可條款下的開放源碼發佈,是當前流行的企業級搜索引擎。設計用於雲計算中,可以達到實時搜索,穩定,可靠,快速,安裝使用方便mysql
Logstash 是一個開源的服務器端數據處理流水線,它能夠同時從多個數據源獲取數據,並將其轉換爲最喜歡的"存儲"(Ours is Elasticsearch, naturally.)git
③ Beats:採集日誌信息(加上beats 就是els),GO開發的,因此高效、很快github
Filebeat:Log Filesweb
Metricbeat:Metricsredis
Packetbeat:Network Data
Winlogbeat:Windows Event Logs
Heartbeat:Uptime Monitoring
Kibana 讓你可視化你的Elasticsearch數據並導航Elastic Stack,因此你能夠作任何事情,從凌晨2:00分析爲何你獲得分頁,瞭解雨水可能對你的季度數字形成的影響。
實驗所須要的包(我用的是5.5.1版本),都放在個人網盤裏了,須要的私聊 https://pan.baidu.com/s/1c2An0Co
機器名稱 |
IP配置 |
服務角色 |
els |
192.168.1.101(私) 192.168.10.101(公) |
elasticsearch(搜索引擎) |
logstash |
192.168.1.102(私) 192.168.10.102(公) |
logstash(日誌處理) redis(緩衝隊列) |
filebeat
|
192.168.1.103(私) 192.168.10.103(公) |
filebeat(日誌收集) httpd/mysql(生成日誌) |
kibana |
192.168.1.104(私) 192.168.10.104(公) |
kibana(展現界面) |
② 修改主機名、hosts文件,確保節點直接能經過主機名連通
[root@els ~]# hostnamectl set-hostname els.along.com
[root@logstash ~]# hostnamectl set-hostname logstash.along.com
[root@filebeat ~]# hostnamectl set-hostname filebeat.along.com
[root@kibana ~]# hostnamectl set-hostname kibana.along.com
[root@els ~]# hostnamectl set-hostname 主機名
192.168.1.102 logstash.along.com
192.168.1.103 filebeat.along.com
192.168.1.104 kibana.along.com
[root@els ~]# ping filebeat.along.com
[root@els ~]# systemctl restart chronyd
Elasticsearch 是一個分佈式的 RESTful 風格的搜索和數據分析引擎,可以解決不斷涌現出的各類用例。做爲 Elastic Stack 的核心,它集中存儲您的數據,幫助您發現意料之中以及意料以外的狀況
[root@els ~]# yum install java-1.8.0-openjdk-devel -y
[root@els ~]# rpm -ivh elasticsearch-5.5.1.rpm
[root@els ~]# vim /etc/elasticsearch/jvm.options 修改分配的空間大小
注意:不要超過32G,若是空間大,多跑幾個實例,不要讓一個實例太大內存
[root@els ~]# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: alongels #集羣名字 node.name: els #節點名 path.data: /els/data #索引路徑 path.logs: /els/logs #日誌存儲路徑 network.host: 192.168.10.101 #對外通訊的地址,依次修改成本身機器對外的IP #http.port: 9200 #默認端口
[root@els ~]# mkdir -pv /els/{data,logs} && chown -R elasticsearch.elasticsearch /els/*
[root@els ~]# systemctl start elasticsearch.service
② [root@els ~]# curl 192.168.10.101:9200
[root@els ~]# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: alongels #集羣名字 node.name: els #節點名,依次修改成els2,els3 path.data: /els/data #索引路徑 path.logs: /els/logs #日誌存儲路徑 network.host: 192.168.10.101 #對外通訊的地址,依次修改成本身機器對外的IP #http.port: 9200 #默認端口 discovery.zen.ping.unicast.hosts: ["els", "els2","els3"] #發現方式,採用單播 discovery.zen.minimum_master_nodes: 2 #數量要大於集羣中節點的半數
[root@els ~]# mkdir -pv /els/{data,logs} && chown -R elasticsearch.elasticsearch /els/*
[root@els2 ~]# mkdir -pv /els/{data,logs} && chown -R elasticsearch.elasticsearch /els/*
[root@els3 ~]# mkdir -pv /els/{data,logs} && chown -R elasticsearch.elasticsearch /els/*
[root@els3 ~]# systemctl start elasticsearch.service
https://github.com/mobz/elasticsearch-head 這裏有github上的詳細步驟
[root@els local]$ yum -y install git
[root@els local]$ git clone git://github.com/mobz/elasticsearch-head.git
[root@els local]$ cd elasticsearch-head/
[root@els elasticsearch-head]$ yum -y install npm
[root@els elasticsearch-head]$ npm install
Error: Command failed: tar jxf /tmp/phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2
bunzip2 /tmp/phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2
tar -xvf /tmp/phantomjs/phantomjs-2.1.1-linux-x86_64.tar
再次執行[root@els elasticsearch-head]$ npm install
[root@els ~]$ vim /etc/elasticsearch/elasticsearch.yml
# ------------------------ Enable CORS in elasticsearch ------------------------- http.cors.enabled: true http.cors.allow-origin: "*" #授全部權限
① 重啓elasticsearch 服務,打開了9100 端口
[root@els ~]$ service elasticsearch restart
[root@els ~]# cd /usr/local/elasticsearch-head/
[root@els elasticsearch-head]# npm run start 前端運行
[root@els elasticsearch-head]# nohup npm run start & 後臺運行
[root@els elasticsearch-head]# jobs 查看後臺運行的任務
[1]+ Running nohup npm run start &
網頁訪問http://192.168.1.101:9100/
https://lucene.apache.org/core/ 下載地址
Apache Lucene 是一個徹底用Java編寫的高性能,全功能的文本搜索引擎庫。它幾乎適用於任何須要全文搜索的應用程序,特別是跨平臺的應用程序。
查看官方文檔 https://www.elastic.co/cn/products/logstash
① 官方介紹:Logstash is an open source data collection engine with real-time pipelining capabilities。簡單來講logstash就是一根具有實時數據傳輸能力的管道,負責將數據信息從管道的輸入端傳輸到管道的輸出端;與此同時這根管道還可讓你根據本身的需求在中間加上濾網,Logstash提供裏不少功能強大的濾網以知足你的各類應用場景。
② Logstash的事件(logstash將數據流中等每一條數據稱之爲一個event)處理流水線有三個主要角色完成:inputs –> filters –> outputs:
所謂的搜索模式就是像變量同樣,把用的較多的事先定義好,便於屢次引用
[root@centos7-1 conf.d]# rpm -ql logstash |grep pattern
[root@centos7-1 conf.d]# less /usr/share/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.1.1/patterns/grok-patterns
/usr/share/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.1.1/patterns
① 去官網下載對應版本的logstash ,我下載的是5.5.1版本
https://www.elastic.co/cn/downloads/logstash
[root@centos7-1 els]# rpm -ivh logstash-5.5.1.rpm
[root@centos7-1 els]# vim /etc/profile.d/logstash.sh
export PATH=$PATH:/usr/share/logstash/bin/
[root@centos7-1 els]# . /etc/profile.d/logstash.sh
[root@centos7-1 logstash]# cd /etc/logstash/conf.d/
[root@centos7-1 conf.d]# vim test.conf
input { stdin {} } output { stdout { codec => rubydebug } }
[root@centos7-1 conf.d]# logstash -f ./test.conf -t
[root@centos7-1 conf.d]# logstash -f ./test.conf
grok:拆分字段
date:修改時間格式
[root@centos7-1 ~]# yum install httpd
[root@centos7-1 ~]# systemctl start httpd
[root@centos7-1 ~]# vim /var/www/html/index.html
[root@centos7-1 ~]# for i in {1..20}; do echo "Test Page ${i}" > /var/www/html/test${i}.html; done
[root@centos7-1 ~]# for i in {1..200}; do j=$[$RANDOM%20+1]; curl http://192.168.1.102:80/test${j}.html; done
[root@centos7-1 conf.d]# vim test2.conf
input { file { path => ["/etc/httpd/logs/access_log"] start_position => "beginning" } filter { grok { #拆分message 字段 match => { #指定匹配哪一個字段 "message" => "%{COMBINEDAPACHELOG}" #引用定義好的搜索模式 } remove_field => "message" #刪除message 字段 } date { #改變時間格式 match => ["timestamp","dd/MMM/YYYY:H:m:s Z"] remove_field => "timestamp" #刪除原有的時間字段 } } output { stdout { codec => rubydebug } }
[root@centos7-1 conf.d]# logstash -f test2.conf -t
[root@centos7-1 conf.d]# logstash -f test2.conf
mutate:修改字段
① 編輯配置文件,因爲input、output仍是標準輸入輸出,就沒有貼出
[root@centos7-1 conf.d]# vim test3.conf
filter { grok { match => { "message" => "%{HTTPD_COMBINEDLOG}" } } date { match => ["timestamp","dd/MMM/YYYY:H:m:s Z"] } mutate { rename => { "agent" => "user_agent" } } }
[root@centos7-1 conf.d]# logstash -f test3.conf -t
[root@centos7-1 conf.d]# logstash -f test3.conf
geoip:利用這個模塊解析ip的地址,利於後邊kibana 的地理位置展現圖
網上下載數據庫,由於是記錄世界的IP 地址,因此常常有變更,能夠寫一個計劃任務,每隔一週去網上下載一次,解包,連接到maxmind 下
[root@centos7-1]# tar -xvf GeoLite2-City.tar.gz
[root@centos7-1]# mv GeoLite2-City_20170704/ /etc/logstash/
[root@centos7-1 logstash]# mv GeoLite2-City_20170704/ maxmind
[root@centos7-1 ~]# echo '112.168.1.102 - - [08/Feb/2018:15:28:53 +0800] "GET /test6.html HTTP/1.1" 200 12 "-" "curl/7.29.0"' >> /var/log/httpd/access_log
① 編輯配置文件,因爲input、output仍是標準輸入輸出,就沒有貼出
[root@centos7-1 conf.d]# vim tes4.conf
filter { grok { match => { "message" => "%{HTTPD_COMBINEDLOG}" } } geoip { source => "clientip" #哪一個源ip 字段,轉換爲地理位置 target => "geoip" #目標信息存儲時的健名 database => "/etc/logstash/maxmind/GeoLite2-City.mmdb" #數據庫路徑 } }
[root@centos7-1 conf.d]# logstash -f test4.conf -t
[root@centos7-1 conf.d]# logstash -f test4.conf
[root@centos7-1 ~]# echo '192.168.1.102 - - [08/Feb/2018:15:28:53 +0800] "GET /test6.html HTTP/1.1" 200 12 "-" "curl/7.29.0"' >> /var/log/httpd/access_log
[root@centos7-1 conf.d]# vim test5.conf
input { file { path => ["/var/log/httpd/access_log"] start_position => "beginning" } } filter { grok { match => { "message" => "%{HTTPD_COMBINEDLOG}" } } geoip { source => "clientip" target => "geoip" database => "/etc/logstash/maxmind/GeoLite2-City.mmdb" } } output { elasticsearch { hosts => ["http://192.168.10.101:9200/"] #主機 index => "logstash-%{+YYYY.MM.dd}" #索引 document_type => "apache_logs" #文檔類型標識,本身定義 } }
[root@logstash]# vim /etc/redis.conf
requirepass ilinux.io #加密碼,爲了安全運行
開啓redis
[root@centos7-1 conf.d]# systemctl start redis 打開6379 端口
[root@centos7-1 conf.d]# vim test6.conf
output { redis { batch => true #批量寫入 host => "192.168.10.102" #主機 password => "ilinux.io" #密碼 port => 6379 #端口 #db => 0 #默認就是0號庫 data_type => "list" #數據格式,列表 key => "apachelogs" #本身定義的鍵 } }
② [root@logstash]# logstash -f test6.conf
[root@centos7-1 ~]# redis-cli -a ilinux.io
127.0.0.1:6379> LLEN apachelogs
127.0.0.1:6379> LINDEX apachelogs 1
(4)注:logstash 開啓的方法:
① logstash 指令指定配置文件啓動
logstash -f test.conf
② systemctl start logstash 命令啓動
此命令啓動,要確保/etc/logstash/conf.d 目錄下沒有其餘多餘的配置文件。
Beats 平臺集合了多種單一用途數據採集器。這些採集器安裝後可用做輕量型代理,從成百上千或成千上萬臺機器向 Logstash 或 Elasticsearch 發送數據。
[root@centos7-1 ~]# rpm -ivh filebeat-5.5.1-x86_64.rpm
[root@filebeat ~]# vim /etc/filebeat/filebeat.yml
#================= Filebeat prospectors ===================== filebeat.prospectors: paths: - /var/log/httpd/*log #exclude_lines: ["^DBG"] 黑名單 #include_lines: ["^ERR", "^WARN"] 白名單 #-------------------------- Elasticsearch output ------------------------------ output.elasticsearch: # Array of hosts to connect to. hosts: ["192.168.10.101:9200"] #主機和端口 #protocol: "https" #若是是https #username: "elastic" #用戶,若是elasticsearch設置的有的話 #password: "changeme" #密碼
[root@centos7-1 filebeat]# systemctl start filebeat.service
[root@centos7-1 ~]# yum install httpd
[root@centos7-1 ~]# systemctl start httpd
[root@centos7-1 ~]# vim /var/www/html/index.html
[root@centos7-1 ~]# for i in {1..20}; do echo "Test Page ${i}" > /var/www/html/test${i}.html; done
[root@centos7-1 ~]# for i in {1..20}; do j=$[$RANDOM%20+1]; curl http://192.168.1.102:80/test${j}.html; done
[root@filebeat ~]# vim /etc/filebeat/filebeat.yml
filebeat.prospectors: - input_type: log paths: - /var/log/httpd/*log output.logstash: hosts: ["192.168.10.102:5044"]
[root@centos7-1 filebeat]# systemctl start filebeat.service
[root@logstash conf.d]# vim /etc/logstash/conf.d/apachelogs.conf
input { beats { port => 5044 } } filter { grok { match => { "message" => "%{HTTPD_COMBINEDLOG}" } } } output { elasticsearch { hosts => ["http://192.168.10.101:9200/"] index => "logstash-%{+YYYY.MM.dd}" document_type => "apache_logs" } }
[root@centos7-1 conf.d]# logstash -f apachelogs.conf -t 測試
[root@centos7-1 filebeat]# systemctl restart filebeat.service
[root@filebeat ~]# vim /etc/filebeat/filebeat.yml
filebeat.prospectors: - input_type: log paths: - /var/log/httpd/*log #----------------------------- Redis output -------------------------------- output.redis: hosts: ["192.168.10.102"] password: "ilinux.io" key: "httpdlogs" datatype: "list" db: 0 timeout: 5
[root@centos7-1 conf.d]# redis-cli -a ilinux.io 查詢有key值,有數據
[root@logstash conf.d]# vim /etc/logstash/conf.d/apachelogs.conf
input { redis { host => "192.168.10.102" port => "6379" password => "ilinux.io" data_type => "list" key => "httpdlogs" threads => 2 } } filter { grok { match => { "message" => "%{HTTPD_COMBINEDLOG}" } } date { match => ["timestamp","dd/MMM/YYYY:H:m:s Z"] remove_field => "timestamp" } } output { elasticsearch { hosts => ["http://192.168.10.101:9200/"] index => "logstash-%{+YYYY.MM.dd}" document_type => "apache_logs" } }
[root@filebeat ~]# systemctl start logstash
kibana 是您走進 Elastic Stack 的窗口,Kibana 讓您可以可視化 Elasticsearch 中的數據並操做Elastic Stack,所以您能夠在這裏解開任何疑問:例如,爲什麼會在凌晨 2:00 被傳呼,雨水會對季度數據形成怎樣的影響。
Kibana 讓您可以自由地選擇如何呈現您的數據。或許您一開始並不知道本身想要什麼。不過藉助Kibana 的交互式可視化,您能夠先從一個問題出發,看看可以從中發現些什麼。
Kibana 核心搭載了一批經典功能:柱狀圖、線狀圖、餅圖、環形圖,等等。它們充分利用了Elasticsearch 的聚合功能。
利用咱們的 Elastic Maps Services 來實現地理空間數據的可視化,或者發揮創意,在您本身的地圖上實現自定義位置數據的可視化。
您能夠利用 Timelion,對您 Elasticsearch 中的數據執行高級時間序列分析。您能夠利用功能強大、簡單易學的表達式來描述查詢、轉換和可視化。
憑藉搜索引擎的相關性功能,結合 graph 探索,揭示您 Elasticsearch 數據中極其常見的關係。
從官網上下載對應的版本https://www.elastic.co/cn/downloads/kibana
[root@kibana ~]#rpm -ivh kibana-5.5.1-x86_64.rpm
server.port: 5601 server.host: "0.0.0.0" server.name: "kibana.along.com" elasticsearch.url: "http://192.168.10.101:9200"
[root@kibana ~]# systemctl start kibana.service
(1)打開網頁 http://192.168.1.104:5601,選擇logstash 發送的日誌,就直接顯示效果了
我以餅狀圖爲例,建立top5 來源ip、top10 請求點擊頁面 的餅狀圖
選擇對什麼進行聚合圖形,我選擇對本身設置的terms 詞條進行聚合,再選擇clientip.keyword 的key鍵值,最後展現
(3)其餘字段均可進行設置,多種圖案,也可將多個圖形放在一塊兒展現
可參考http://blog.csdn.net/qq_23598037/article/details/79560639
有什麼問題,歡迎討論~