一、簡介
Elasticsearch是個基於Lucene實現的開源、分佈式、restful的全文本搜索引擎,此外他還是一個分佈式實時文檔存儲,其中每個文檔的每個filed均是可被索引的數據,且可被搜索,也是一個帶實時分析功能的搜索引擎,能夠擴展至數以百計的節點實時處理PB級別的數據。它的特點有:分佈式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。日誌主要包括系統日誌、應用程序日誌和安全日誌。系統運維和開發人員可以通過日誌瞭解服務器軟硬件信息、檢查配置過程中的錯誤及錯誤發生的原因。經常分析日誌可以瞭解服務器的負荷,性能安全性,從而及時採取措施糾正錯誤。
通常,日誌被分散的儲存不同的設備上。如果你管理數十上百臺服務器,你還在使用依次登錄每臺機器的傳統方法查閱日誌。這樣是不是感覺很繁瑣和效率低下。當務之急我們使用集中化的日誌管理,例如:開源的syslog,將所有服務器上的日誌收集彙總。集中化管理日誌後,日誌的統計和檢索又成爲一件比較麻煩的事情,一般我們使用grep、awk和wc等Linux命令能實現檢索和統計,但是對於要求更高的查詢、排序和統計等要求和龐大的機器數量依然使用這樣的方法難免有點力不從心。因此使用一款能夠自動實時收集日誌的工具則完美的解決我們的問題,ELK官網提供的開源解決方案有elasticsearch、logstash、kiabana。
ELK原理架構圖:
說明:在此架構圖中logstash agent負責將所有的應用服務日誌收集並彙報給elasticsearch cluster集羣中,而kibana則從ES集羣中抽取數據生成圖表,再返還給系統管理員。
二、ELK平臺搭建
①ES平臺是依賴於jdk的環境基礎上進行的,所以在安裝elasticsearch之前需安裝jdk開發環境。
②各個節點之間需做到時間同步,可使用時間服務器進行同步。
③各個節點之間能夠通過主機名見名知意,方便自己的操作。
安裝配置如下:
實驗環境 | 實驗所需軟件 |
CentOS7:(kernel-3.10.0-327.el7.x86_64) | elasticsearch-1.7.2.noarch.rpm |
Java: Openjdk version ”1.8.0_65″ | java-1.8.0-openjdk/openjdk-devel |
#本文重要通過rpm包安裝其環境極其軟件,可自行到相依的官網下載rpm或源碼包進行編譯安裝。
#安裝openjdk開發環境 yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel java-1.8.0-openjdk-headless #配置其環境變量 export JAVA_HOME=/usr source java.sh [root@node2 ~]# java -version openjdk version "1.8.0_65" OpenJDK Runtime Environment (build 1.8.0_65-b17) OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode) [root@node2 ~]# #安裝elasticsearch yum -y elasticsearch-1.7.2.noarch.rpm #編輯配置文件,不使用默認的cluster.name和node.name可根據自己業務的需求進行修改 cluster.name= alrenES node.name= "node2.alren.com" #啓動服務,查看其監聽的9300/tcp端口 systemctl start elasticsearch.service [root@node2 ~]# systemctl status elasticsearch.service ● elasticsearch.service - Elasticsearch Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; disabled; vendor preset: disabled) Active: active (running) since Mon 2016-12-05 21:05:47 CST; 19h ago Docs: http://www.elastic.co Main PID: 7143 (java) CGroup: /system.slice/elasticsearch.service └─7143 /bin/java -Xms256m -Xmx1g -Djava.awt.headless=true -XX... Dec 05 21:05:47 node2.alren.com systemd[1]: Started Elasticsearch. Dec 05 21:05:47 node2.alren.com systemd[1]: Starting Elasticsearch... [root@node2 ~]#
ES集羣組件:
Cluster:集羣的標識爲集羣名稱,默認爲elasticsearch,節點就是靠此名字來加入到哪個集羣中,一個節點只能屬於一個集羣。
Node:運行單個ES實例的主機即爲節點,用於存儲數據,參與集羣索引及搜索操作,節點的表示依靠節點名稱。
Shard:將索引切割成爲物理存儲組件,每個shard都是一個獨立且完整的索引,創建索引時,ES默認將其分隔爲5個shard,用戶也可以按需自行定義,但一旦創建則不可修改,同時會產生一個replica副本。
ES Cluster工作流程:
啓動服務時,elasticsearch會監聽在9300/tcp端口上,通過多播的方式查找同一類的集羣的其他節點,並與之建立通信。集羣中的所有節點會選舉一個主節點負責管理整個集羣狀態,以及在集羣範圍內決定shard的分佈方式,站在用戶的角度而言,每個節點均可接受並響應用戶的各類請求。
三、集羣各管理及其操作
常用的四類API:
①檢查集羣、節點、索引等健康狀態與否,以及獲取其相關的狀態
②管理集羣、節點、索引及元數據
③執行CRUD操作
④執行高級操作,例如paping,filetering等
使用curl -X命令查看其節點狀態信息
[root@node2 ~]# curl -X GET ' #?pretty則是顯示 { "status" : 200,#響應的狀態碼信息 "name" : "node2.alren.com", #節點名 "cluster_name" : "alrenES", #ES集羣名稱 "version" : { "number" : "1.7.2", #elasticsearch版本 "build_hash" : "e43676b1385b8125d647f593f7202acbd816e8ec", "build_timestamp" : "2015-09-14T09:49:53Z", "build_snapshot" : false, "lucene_version" : "4.10.4" }, "tagline" : "You Know, for Search" } [root@node2 ~]# curl -X GET #查看支持的API接口 =^.^= /_cat/allocation /_cat/shards /_cat/shards/{index} /_cat/master /_cat/nodes /_cat/indices /_cat/indices/{index} /_cat/segments /_cat/segments/{index} /_cat/count /_cat/count/{index} /_cat/recovery /_cat/recovery/{index} /_cat/health /_cat/pending_tasks /_cat/aliases /_cat/aliases/{alias} /_cat/thread_pool /_cat/plugins /_cat/fielddata /_cat/fielddata/{fields} [root@node2 ~]# curl -X GET #查看其主節點爲哪臺主機 c-iCqp3FQh27948gAsyKaw node3.alren.com 10.1.10.67 node3.alren.com [root@node2 ~]# curl -X GET #查看當前ES cluster集羣的所有節點 node2.alren.com 10.1.100.6 6 84 0.06 d m node2.alren.com node4.alren.com 10.1.100.7 4 69 0.15 d m node4.alren.com node3.alren.com 10.1.100.8 16 72 0.10 d * node3.alren.com [root@node2 ~]# curl -X GET ' #查看集羣狀態 { "cluster_name" : "alrenES", #集羣名稱 "status" : "green", #集羣健康狀態 "timed_out" : false, "number_of_nodes" : 3, #集羣總共的節點數量 "number_of_data_nodes" : 3, "active_primary_shards" : 8, "active_shards" : 16, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 0, "delayed_unassigned_shards" : 0, "number_of_pending_tasks" : 0, "number_of_in_flight_fetch" : 0 } [root@node2 ~]#
插件安裝的兩種方式:
給集羣節點安裝附加插件,可通插件擴展ES的功能,添加自定義的映射類型,自定義分析器,本地腳本,自定義發現方式。常用的插件有bigdesk,marvel,head,kopf等。
①直接解壓插件的壓縮包之或是插件放置於/usr/share/elasticsearch/plugins目錄下即可
②使用全路徑二進制腳本進行安裝,例如:/usr/share/elasticsearch/bin/plugin -i bigdesk -u ftp://uri/bigdesk.lastest.zip ,安裝完成之後可通過瀏覽器訪問。訪問的URL:http://uri:9200/_plugin/plugin_name
插件實例圖一:
插件實例圖二:
CRUD操作的相關API:增、刪、改、查
1、創建文檔:向索引中插入數據時將會自動創建索引
curl -X PUT 'http://localhost:9200/students/class1/1?pretty' -d '{ "name":"tom", "gender":"male", "age":21 }' #同理插入第二個則修改相應的值即可 curl -X PUT 'http://localhost:9200/students/class1/2?pretty' -d '{ "name":"jerry", "gender":"female", "age":21 }'
2、獲取文檔:查詢插入的內容
curl -X GET 'http://localhost:9200/students/class1/1?pretty'
3、更新文檔:PUT方法會直接覆蓋至原有的文檔信息,想要局部的更新使用_update
curl -X POST 'http://localhost:9200/students/class1/2/_update?pretty' -d '{ "doc":{"age":10} }'
4、刪除文檔及其索引
curl -X DELETE 'http://localhost:9200/students/class1/2/' curl -X DELETE 'http://localhost:9200/students'
5、查看當前索引
curl -X GET 'localhost:9200/_cat/indeces?v'
項目小實戰:
IP地址、軟件規劃:
IP地址 | 實驗所需軟件 | 環境部署 | 主機名 |
10.1.10.65 | logstash-1.5.4-1 redis | openjdk-1.8.0 | node1 |
10.1.10.66 | logstash-1.5.4-1 | openjdk-1.8.0 | node2
|
10.1.10.67 | elasticsearch-1.7.2 kibana-4.1.2 | openjdk-1.8.0 | node3 |
各個節點配置如下:
#node1需安裝openjdk環境及logstash、redis yum -y install java-1.8.0-openjdk-devel java-1.8.0-openjdk java-1.8.0-openjdk-headless yum -y install logstash-1.5.4-1.noarch.rpm yum -y install redis #node1配配置如下: 修改/etc/redis/redis.conf bind 0.0.0.0 修改/etc/logstash/conf.d/apache.conf input { file { path => ["/var/log/httpd/access_log"] type => "httpd_log" start_position => "beginning" } } filter { grok { match => {"message" => "%{COMBINEDAPACHELOG}"} } } output { redis { port => "6379" host => ["127.0.0.1"] data_type => "list" key => "logstash-httpd_log" } } #完成上訴步驟後,啓動服務 #啓動httpd服務,進行訪問,查看本機的redis是否存在數據 [root@node1 ~]# redis-cli 127.0.0.1:6379> llen logstash-httpd_log (integer) 72 127.0.0.1:6379> LINDEX logstash-httpd_log 0 "{\"message\":\"10.1.250.79 - - [08/Dec/2016:10:32:03 +0800] \\\"GET / HTTP/1.1\\\" 403 4897 \\\"-\\\" \\\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\\\"\",\"@version\":\"1\",\"@timestamp\":\"2016-12-08T02:32:04.430Z\",\"host\":\"node1.alren.com\",\"path\":\"/var/log/httpd/access_log\",\"type\":\"httpd_log\",\"clientip\":\"10.1.250.79\",\"ident\":\"-\",\"auth\":\"-\",\"timestamp\":\"08/Dec/2016:10:32:03 +0800\",\"verb\":\"GET\",\"request\":\"/\",\"httpversion\":\"1.1\",\"response\":\"403\",\"bytes\":\"4897\",\"referrer\":\"\\\"-\\\"\",\"agent\":\"\\\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\\\"\"}" 127.0.0.1:6379> LINDEX logstash-httpd_log 1 "{\"message\":\"10.1.250.79 - - [08/Dec/2016:10:32:03 +0800] \\\"GET /noindex/css/bootstrap.min.css HTTP/1.1\\\" 304 - \\\"http://10.1.10.65/\\\" \\\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\\\"\",\"@version\":\"1\",\"@timestamp\":\"2016-12-08T02:32:04.431Z\",\"host\":\"node1.alren.com\",\"path\":\"/var/log/httpd/access_log\",\"type\":\"httpd_log\",\"clientip\":\"10.1.250.79\",\"ident\":\"-\",\"auth\":\"-\",\"timestamp\":\"08/Dec/2016:10:32:03 +0800\",\"verb\":\"GET\",\"request\":\"/noindex/css/bootstrap.min.css\",\"httpversion\":\"1.1\",\"response\":\"304\",\"referrer\":\"\\\"http://10.1.10.65/\\\"\",\"agent\":\"\\\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\\\"\"}" 127.0.0.1:6379> LINDEX logstash-httpd_log 3 "{\"message\":\"10.1.250.79 - - [08/Dec/2016:10:32:03 +0800] \\\"GET /images/apache_pb.gif HTTP/1.1\\\" 304 - \\\"http://10.1.10.65/\\\" \\\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\\\"\",\"@version\":\"1\",\"@timestamp\":\"2016-12-08T02:32:04.431Z\",\"host\":\"node1.alren.com\",\"path\":\"/var/log/httpd/access_log\",\"type\":\"httpd_log\",\"clientip\":\"10.1.250.79\",\"ident\":\"-\",\"auth\":\"-\",\"timestamp\":\"08/Dec/2016:10:32:03 +0800\",\"verb\":\"GET\",\"request\":\"/images/apache_pb.gif\",\"httpversion\":\"1.1\",\"response\":\"304\",\"referrer\":\"\\\"http://10.1.10.65/\\\"\",\"agent\":\"\\\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\\\"\"}" ............. 127.0.0.1:6379> LINDEX logstash-httpd_log 71 "{\"message\":\"10.1.250.79 - - [08/Dec/2016:10:32:04 +0800] \\\"GET /noindex/css/fonts/Light/OpenSans-Light.ttf HTTP/1.1\\\" 404 240 \\\"http://10.1.10.65/noindex/css/open-sans.css\\\" \\\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\\\"\",\"@version\":\"1\",\"@timestamp\":\"2016-12-08T02:32:05.490Z\",\"host\":\"node1.alren.com\",\"path\":\"/var/log/httpd/access_log\",\"type\":\"httpd_log\",\"clientip\":\"10.1.250.79\",\"ident\":\"-\",\"auth\":\"-\",\"timestamp\":\"08/Dec/2016:10:32:04 +0800\",\"verb\":\"GET\",\"request\":\"/noindex/css/fonts/Light/OpenSans-Light.ttf\",\"httpversion\":\"1.1\",\"response\":\"404\",\"bytes\":\"240\",\"referrer\":\"\\\"http://10.1.10.65/noindex/css/open-sans.css\\\"\",\"agent\":\"\\\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\\\"\"}" 127.0.0.1:6379> #node2節點:從10.1.10.65中的redis取數據並能讀取出來到elasticsearch集羣中 編輯/etc/logstash/conf.d/server.conf input { redis { port => "6379" host => "10.1.10.65" data_type => "list" key => "logstash-httpd_log" } } output { elasticsearch { cluster => "logs" index => "logstash-%{+YYYY.MM.dd}" } } #測試是否能夠取得數據,使用logstash -f ./server.conf --configtest後查看node1上redis是否還存在數據 測試成功則使用:logstash -f ./server.conf & #node3上安裝配置elasticsearch和kibana yum -y install elasticsearch-1.7.2.noarch.rpm tar xf kibana-4.2.1.tar.gz -C /usr/local/ cd /usr/local/ ln -sv kibana-4.2.1 kibana #啓動服務 systemctl start elasticserach.service /usr/local/kibana/bin/kibana & #查看其集羣狀態及繪製圖表信息 { "status" : 200, "name" : "Havok", "cluster_name" : "elasticsearch", "version" : { "number" : "1.7.2", "build_hash" : "e43676b1385b8125d647f593f7202acbd816e8ec", "build_timestamp" : "2015-09-14T09:49:53Z", "build_snapshot" : false, "lucene_version" : "4.10.4" }, "tagline" : "You Know, for Search" }
實驗圖:
上訴爲不可用狀態,原因是logstash未連接至elasticsearch,elasticsearch未能從logstash中取得數據,如配置成功,將會出現create按鈕,接下來將是一些圖表上的操作就不過多解釋和介紹。
總結:ELK是一個高度插件化的日誌收集分析的軟件,很多功能需藉助其他輔助插件完成日誌收集,想學好elk只能多看官方文檔,文檔地址:https://www.elastic.co/guide/index.html,朋友們只能幫助你到這了,接下來的路還很長。