elk系列1之入門安裝與基本操作

preface

我們每天都要查看服務器的日志,一方面是為了開發的同事翻找日志,另一方面是巡檢服務器查看日志,而隨著服務器數量以及越來越多的業務上線,日志越來越多,人肉運維相當痛苦了,此時,參考現在非常流行的日志分析工具,搭建了一套ELK日志分析系統。下面就說說ELK,ELK安裝過程以及如何使用。

了解它

ELK全稱其實三個軟件組合而成的,ElasticSearch + Logstash + Kibana。

  • logstash負責收集日志的。
  • elasticsearch用來存儲和搜索日志的。
  • kibana用來web界面顯示日志的。
    所以ELK指定就是上面三個軟件的縮寫。企業通用的架構圖如下:
    image

我們這套架構講究了松耦合關系和緩沖關系,logstash與elasticsearch中間加了個redis,避免當elasticsearch宕機后,logstash的日志便會無法寫入日志,容易導致日志丟失。同時也起到一個緩沖的作用,避免日志量過大導致elasticsearch服務器扛不住。
廢話不多說,我們現在就開始開工吧。

安裝它

我們采用簡單的yum形式安裝,由于elasticsearch和logstash是java開發的,所以需要安裝java的環境。

iphostname角色
192.168.141.3linux-node1es+k+log
192.168.141.4linux-node2es+log
  • 以上系統都是CentOs6.6系統。
  • hostname和hosts文件解析必須一一對應。
  • max_open_file必須改掉,改為65535。
  • 各個服務器關閉selinux,iptables,以及NTP同步。
安裝java環境

node1和node2同時操作安裝java:

[root@linux-node1 ~]# yum -y install java
[root@linux-node1 ~]# java -version
openjdk version "1.8.0_111"
安裝elasticsearch

可以參考官網的安裝手冊:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/_installation.html

[root@linux-node1 ~]# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch  # 首先安裝yum源的公鑰。
[root@linux-node1 ~]# cat /etc/yum.repos.d/elasticsearch.repo
[elasticsearch]
name=Elasticsearch
baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1[root@linux-node1 ~]# yum -y install -y elasticsearch
安裝logstash
[root@linux-node1 ~]# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
[root@linux-node1 ~]# cat /etc/yum.repos.d/logstash.repo
[logstash-2.3]
name=Logstash repository for 2.3.x packages
baseurl=https://packages.elastic.co/logstash/2.3/centos
gpgcheck=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1[root@linux-node1 ~]# yum -y install logstash
安裝kibana

Kibana 是為 Elasticsearch 設計的開源分析和可視化平臺。可以使用 Kibana 來搜索,查看存儲在 Elasticsearch 索引中的數據并與之交互。可以很容易實現高級的數據分析和可視化,以圖表的形式展現出來。

[root@linux-node1 ~]# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
[root@linux-node1 ~]# cat /etc/yum.repos.d/kibana.repo
[kibana-4.5]
name=Kibana repository for 4.5.x packages
baseurl=http://packages.elastic.co/kibana/4.5/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1[root@linux-node1 ~]# yum -y install kibana

配置他們

我們通過yum安裝了elk,下面就開始配置他們。

配置elasticsearch

先看看配置文件:

[root@linux-node1 ~]# rpm -ql elasticsearch
/etc/elasticsearch
/etc/elasticsearch/elasticsearch.yml   # 主配置文件
.....[root@linux-node1 ~]# cd /etc/elasticsearch/
[root@linux-node1 elasticsearch]# ls
elasticsearch.yml  logging.yml  scripts
[root@linux-node1 bin]# grep -v ^# /etc/elasticsearch/elasticsearch.yml
cluster.name: myes      # 集群名字
node.name: linux-node1    # 節點名字
path.data: /data/es-data/
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true   # 是否鎖定內存
network.host: 192.168.141.3
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.141.3", "192.168.141.4"]    #廣播方式,用來發現同一個集群下的節點,這里寫的是單播 加上去,這樣方便雙方互相認識。[root@linux-node1 ~]# grep elas /etc/passwd
elasticsearch:x:496:491:elasticsearch user:/home/elasticsearch:/sbin/nologin
[root@linux-node1 ~]# mkdir /data/es-data/  -p
[root@linux-node1 ~]# chown -R elasticsearch.  /data/es-data/    # 因為使用elkstaticsearch用戶啟動的,所以必須為這個用戶授權給data目錄
[root@linux-node1 ~]# /etc/init.d/elasticsearch start
正在啟動 elasticsearch:                                   [確定]

這里說下elasticsearch的加入集群的模式。我們發現在配置文件里有這2行,組播和單播模式:

# Pass an initial list of hosts to perform discovery when new node is started:
discovery.zen.ping.unicast.hosts: ["host1", "host2"]     # 單播的形式
# Prevent the "split brain" by configuring the majority of nodes (total number of nodes / 2 + 1):
discovery.zen.minimum_master_nodes: 3     # 組播形式,數量是總數量除以2后加1
elkstaticsearch 模塊的使用
[root@linux-node1 ~]# curl -i XGET "http://192.168.141.3:9200/_count?"   #統計當前的信息
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Content-Length: 59{"count":0,"_shards":{"total":0,"successful":0,"failed":0}}
安裝其他模塊:
[root@linux-node1 elasticsearch]# /usr/share/elasticsearch/bin/plugin install  mobz/elasticsearch-head
[root@linux-node1 elasticsearch]# /usr/share/elasticsearch/bin/plugin   install --verbose lmenezes/elasticsearch-kopf    # 安裝這個模塊
然后我們訪問這個模塊

在瀏覽器輸入http://192.168.141.3:9200/_plugin/head/就可以看到這個主節點的信息了。

當一臺主分片服務器宕機后,主節點認定為故障后,那么這宕機的服務器信息分片就丟失了,此時主節點先去判斷這個宕機節點丟失了哪些信息,然后從剩余的副節點服務器中選舉一個當作主分片服務器,再把這臺剛選舉出來的主分片服務器復制給信息其他的副分片節點。比如副本節點3臺服務器,那么選舉一臺為主分片服務器后,就copy 2份到其他副本節點服務器。

當進行數據查詢的時候,比如我們當前連接到192.168.141.4上,我們查詢的數據不在192.168.141.4上,而是在192.168.141.3上,那么192.168.141.4服務器就會去從其他服務器獲取信息后匯總到自身,然后返回給你。In short,就是你連接上了哪臺服務器,就會對你負責。

在訪問head模塊首頁的時候,我們發發現概覽里面的節點信息,字體是黑粗體那就是主分片,細的為備份分片,在一般情況下,主副分片不在同一臺服務器上。我們再看節點名稱的右邊的顏色,黃色表示警告,綠色表示健康,紅色表示不健康,可能有分片丟失。

image

我們還可以使用剛才安裝的kopf模塊瀏覽器輸入http://192.168.141.137:9200/_plugin/kopf/#!/rest

添加elasticsearch集群:

所有節點通過集群名字來判斷是否同一個集群的,所有集群中,都會進行選取一個主節點,那就是master節點,主節點負責管理集群的狀態,那什么是負責管理 集群的狀態呢?比如說數據塊分片,分片的數量以及主副分片都是由主節點決定的。
從用戶的角度來看,我們不需要關心哪個是主節點,只需要連接就可以了,因為所有操作都是由elasticsearch完成的。我們需要查詢數據不需要經過主節點進行轉發,寫入數據也一樣,直接寫入node2上,然后node2再copy到其他節點上。

我們在開啟一臺虛擬機,然后安裝上elasticsearch,配置文件從我們第一臺elasticsearch復制過去,然后修改部分內容:

確保node2節點也有java環境

[root@linux-node2 elasticsearch]# chown -R elasticsearch.elasticsearch /data/es-data/
[root@linux-node2 elasticsearch]# mkdir -p /data/es-data
[root@linux-node2 ~]# grep -v ^# /etc/elasticsearch/elasticsearch.yml
cluster.name: myes      # 集群名字
node.name: linux-node2    # 節點名字
path.data: /data/es-data/
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true   # 是否鎖定內存
network.host: 192.168.141.4
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.141.3", "192.168.141.4"]     # 把同一集群的服務器IP寫到這里,方便他們互相認識。

啟動服務:

[root@localhost elasticsearch]# service elasticsearch start
正在啟動 elasticsearch:                                   [確定]

然后我們再次訪問head模塊:
http://192.168.141.3:9200/_plugin/head/ 發現有2個node。

獲取集群監控狀態:

關于集群監控狀態的,我們可以查看官網的集群API:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/cluster-health.html#request-params

[root@sql1 elasticsearch]# curl -XGET 'http://192.168.141.3:9200/_cluster/health?pretty=true'
{"cluster_name" : "myes","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
}
更多模塊請參考:

https://www.elastic.co/guide/en/elasticsearch/guide/current/_cat_api.html

接下來介紹logstash

logstash有input和output,從input進入的數據然后從output出來,同時可對這個數據流進行filter。如下圖所示:
866977-20161209213939007-1971504190.png

更多資料,參考官網:https://www.elastic.co/guide/en/logstash/2.3/advanced-pipeline.html

拿個命令簡單說下:

采用yum安裝,默認的路徑在/opt/logstash/。logstash命令就在/opt/logstash/bin/logstash

[root@linux-node1 bin]# ./logstash -e "input { stdin{} } output { stdout{} }"   # 這個命令執行畢竟長,因為在等待jvm的啟動。Settings: Default pipeline workers: 2
Pipeline main started
2016-09-04T11:51:40.968Z sql1.com hello   # 輸入什么回復什么,同時加上時間戳
how are you
2016-09-04T11:51:49.579Z sql1.com how are you

來一個rbuby格式的內容,先說下在logstash里面=>表示等號。

[root@linux-node1 bin]# ./logstash -e "input { stdin{} } output { stdout{ codec => rubydebug} }"
Settings: Default pipeline workers: 2
Pipeline main started
hello
{"message" => "hello","@version" => "1","@timestamp" => "2016-09-04T11:53:21.030Z","host" => "sql1.com"
}
how are you
{"message" => "how are you","@version" => "1","@timestamp" => "2016-09-04T11:53:25.710Z","host" => "sql1.com"

logstash寫入elasticsearch

首先參考官網質料:https://www.elastic.co/guide/en/logstash/2.3/plugins-outputs-elasticsearch.html
我們通過命令行模式把logstash的內容輸入到elasticsearch中。

[root@linux-node1 bin]#  ./logstash -e "input { stdin{} } output { elasticsearch { hosts => ['192.168.141.3:9200'] index => 'logstash-%{+YYYY.MM.DD}'} }"
Settings: Default pipeline workers: 2
Pipeline main started
hello
goodnight
i don't know

然后訪問web流量器訪問head模塊:
image

我們簡單看看logstash的配置文件,配置文件放在/etc/logstash/下面:
output{elasticsearch {          # 表示使用elasticsearch來作為outputhosts => ["192.168.141.4:9200"]      #hosts表示elasticsearch的主機,因為是列表,所以使用[]號,主機要雙引號括起來,因為是要字符串類型。index => "logstash-%{+YYYY.MM.dd}"     #索引,表示使用時間戳作為索引值。}stdout{codec => rubydebug   }
}

需要說明的是,這個每一行是事件,為什么要叫做事件,因為我們可以把配置寫成一行。
這個配置的流程是這樣的:
事件 -> input -> codec -> filter -> codec -> output
codec的意思是編碼的意思,可以指定數據格式,比如可以指定為json。

通過logstash配置文件來配置日志的輸入與輸出以及filter

我們先看看官網的資料:https://www.elastic.co/guide/en/logstash/2.3/plugins-inputs-file.html

我們需要注意兩個參數:

參數名作用
type指定類型,自定義,方便后邊output進行 if[type] 匹配
start_position表示從哪里開始讀取文件,默認是從文件結尾開始,
sincedb_path數據庫文件,用來記錄當前監控下的文件的位置,這樣知道上回讀在哪里了。這個必須是文件路徑,而不是目錄路徑。默認是寫在$HOME/.sincedb*
path指定日志文件路徑,可以是數組,表示同時寫入多個文件。類似于這樣的格式

kibana

kibana是專門為elasticsearch設計的可視化平臺。logstash和kibana兩者沒有任何關系。我們在192.168.141.3上安裝它。
下面就配置下它

[root@linux-node1 ~]# grep -v ^# /opt/kibana/config/kibana.yml
server.port: 5601         # 監聽的端口
elasticsearch.url: "http://192.168.141.3:9200"    # 訪問elasticsearch的地址。
kibana.index: ".kibana"           # 存儲索引是在elasticsearch里面,把elasticsearch作為它的數據存儲介質。

下面就啟動它:

[root@linux-node1 ~]# service kibana start
kibana started

查看端口是否真正存在:

[root@linux-node1 ~]# netstat -lnpt |grep 5601
tcp        0      0 0.0.0.0:5601                0.0.0.0:*                   LISTEN      31759/node     #5601已經在

接下來訪問kibana,訪問地址是http://192.168.141.3:5601,接下來簡單的配置它:
image
如果沒有問題,kibana匹配成功了,那么就點擊 ==create== 這個按鈕,然后我們去搜索下日志:
下面這個圖,右上角有個時間匹配選項,我們可以根據自己的需求來選擇。
image

再說下怎么去控制自己想要顯示的列,或者隱藏不想顯示的列

image

logstash 用if對output進行條件匹配

我們在使用logstash-input的時候,會有多個輸入源,不同的輸入源對應不同的輸出,那么如何保證輸入源和輸出是一一對應的,這個時候我們就需要使用if條件去做判斷了。
從配置logstash的文件入手:

[root@linux-node1 logstash]# vim /etc/logstash/conf.d/file.conf
input{file {path => ["/var/log/messages","/var/log/secure"]type => "system-log"     #定義type類型,方便下面通過if去匹配判斷start_position => "beginning"}file {path => "/var/log/elasticsearch/myes.log"type => "es-log"}
}filter{
}output{if [type] == "system-log"{     #通過if[type]來對input 的type類型來判斷,匹配才走下面的內容elasticsearch {hosts => ["192.168.141.4:9200"]    # elasticsearch服務器地址index => "system-log-%{+YYYY.MM.dd}"     # 索引}}if [type] == "es-log" {elasticsearch {hosts => ["192.168.141.4:9200"]index => "es-log-%{+YYYY.MM.dd}"}}
}
[root@linux-node1 conf.d]#  /opt/logstash/bin/logstash -f /etc/logstash/conf.d/file.conf 
[root@linux-node1 logstash]# service elasticsearch restart       # 最好重啟elasticsearch,不然的話訪問head模塊顯示不了我們剛剛配置的數據,我就因為沒有重啟所以看不到。
Stopping elasticsearch:                                    [  OK  ]
Starting elasticsearch:                                    [  OK  ]

此時我們查看http://192.168.141.3:9200/_plugin/head/,就可以看到多出一個日志了。名字為es-log。然后再在kibana里面添加這個日志。具體操作如下圖所示:
image
image

這里說說kibana日志搜索的語法,如下圖所示

由于網頁太小了,麻煩親們放大網頁看圖中我手敲的內容。
image
image

轉載于:https://www.cnblogs.com/liaojiafa/p/6139752.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373336.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373336.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373336.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java 7 –反編譯項目硬幣

大家好,該是從2012年開始寫作的時候了。正如您在其他博客中可能已經看到的那樣,有一些更改可以使您使用Java編程時的開發人員生活變得更加輕松:Diamond運算符,Switchs中的Strings,嘗試使用資源,多次捕獲等 …

git安裝后找不見版本_無法安裝最新版本的Gitlab

這個問題不是代碼,而是Gitlab的安裝.我現在試圖安裝Gitlab幾天沒有成功.實際上,很久以前,他們提出了使用wget的方法非常好,但由于我們必須使用Curl的方法,所以不可能比下載更進一步.在Ubuntu 14.04機器上,以下命令有效:curl https://packages.gitlab.com/install/re…

在Excel表里面插入背景圖

工作中我們會經常用到MS Excel,通常我們打開MS Excel,里面的工作表都是空白單調的背景。當然了,MS Excel可以在工作簿里面插入背景圖片。那么問題來了,如果你沒有安裝Microsoft Office,該如何在Excel文件里面插入好看的…

Java 7:復制和移動文件和目錄

這篇文章是我關于Java 7 java.nio.file軟件包的系列文章的繼續,這次涵蓋了文件的復制和移動以及完整的目錄樹。 如果您曾經對Java缺少copy和move方法感到沮喪,那么請繼續閱讀,以免麻煩。 涵蓋范圍中包括非常有用的Files.walkFileTree方法。 但…

java 五子棋項目_Java項目如何實現五子棋小游戲

Java項目如何實現五子棋小游戲發布時間:2020-07-21 14:53:06來源:億速云閱讀:77作者:小豬小編這次要給大家分享的是Java項目如何實現五子棋小游戲,文章內容豐富,感興趣的小伙伴可以來了解一下,希…

Java中多線程的使用!!

簡介: 1.要了解多線程,首先我們得先了解進程和線程。那么什么是進程?進程就是一個正在運行的程序分配內存讓應用程序能夠運行的叫做進程。那么什么又是線程呢?線程:在一個程序中,負責代碼的執行&#xff0c…

java pkcs1轉pkcs8_pkcs1與pkcs8格式RSA私鑰互相轉換

1、PKCS1私鑰生成openssl genrsa -out private.key 1024private.key文件內容如下:-----BEGIN RSA PRIVATE KEY-----MIICXQIBAAKBgQDREk3uy4x9i4a16OYOYEp5Ir2f16lsmUHB2HjGDlxkU0ju9YApyeZlUXb191ZkxJ2vx2vKppN4gKLDy5r7JMTpwch1CNvceySX6DiM4lwTAnUEZiBYgNBNrKINEt…

嵌入式碼頭,Vaadin和焊接

當我開發Web應用程序時,我希望能夠從Eclipse快速啟動它們,而不必依賴各種重量級的tomcat或glassfish插件。 因此,我通常要做的只是創建一個可以直接從Eclipse運行的基于Java的簡單啟動器。 該啟動器會在幾秒鐘內啟動,因此使開發工…

創建真機調試證書(蘋果開發者平臺各個選項對應的含義)

創建真機調試證書(蘋果開發者平臺各個選項對應的含義) 原文地址:http://jingyan.baidu.com/article/ff411625b8141312e48237a7.html轉載于:https://www.cnblogs.com/siasyl/p/5340593.html

gl.vertexAtteib3f P42 講數據傳給location參數指定的attribute變量

參數  location  指定將要修改的attribute變量存儲位置 v0  指定填充attribute變量第一個分量的值 v1  指定填充attribute變量第二個分量的值 v2  指定填充attribute變量第三個分量的值 var VSHADER_SOURCE attribute vec4 a_Position;\n void main(){\n gl_Posit…

將Spring集成到舊版應用程序中

所有Spring開發人員喜歡做的事情之一就是將Spring塞入他們正在工作的任何應用程序中–這是我生活中的罪惡感之一:您看到一些代碼,認為它是垃圾,因為它包含幾個眾所周知的反模式,然后想想如果這個應用程序是Spring應用程序會多么酷…

java自己實現ioc_springioc原理、springmvc項目分析、自己實現IOC

從一個面試題開始:你自己實現IOC容器的話,保存bean你會使用什么數據結構來保存呢?現在的很多開發人員(甚至3年以上的)不一定能回答這問題,為什么會這樣呢?這個跟現在springboot現在已經高度成熟了,很多配置…

實現兩級下拉框的聯動

1.實現兩級下拉框的聯動。 功能&#xff1a;實現點擊年級下拉框&#xff0c;加載對應科目的下拉框。 第一步&#xff1a;首先要加載年級下拉框中的數據。 01.在GradeDAL層&#xff08;數據訪問層&#xff09;寫一個方法&#xff0c;查詢所有年級的信息。 /// <summary>//…

System.nanoTime()背后是什么?

在Java世界中&#xff0c;對System.nanoTime&#xff08;&#xff09;的理解非常好。 總有一些人說它是快速&#xff0c;可靠的&#xff0c;并且在可能的情況下&#xff0c;應該使用它代替System.currentTimemillis&#xff08;&#xff09;進行計時。 總的來說&#xff0c;他絕…

python連接SQL Server取多個結果集:Pymssql模塊

基本的用法可以參考&#xff1a;python連接SQL Server&#xff1a;Pymssql模塊 和上一篇文章中的代碼&#xff0c;只取一個結果集不同&#xff0c;這次會一次運行2個sql語句&#xff0c;然后分別取出2個結果集&#xff0c;打印輸出。 代碼中有詳細的注釋&#xff0c;一看就明白…

狀態不屬于代碼

Web應用程序中的“狀態”是什么&#xff1f; 它就是要存儲的數據&#xff08;無論目的地是什么—內存&#xff0c;數據庫&#xff0c;文件系統&#xff09;。 應用程序本身不得在代碼中存儲任何狀態。 這意味著您的類應僅包含帶有無狀態對象的字段。 換句話說&#xff0c;在程序…

Xen安全架構sHype/ACM策略配置圖文教程

實驗要求 1. 熟悉Xen虛擬化平臺部署&#xff1b; 2. Xen sHype/ACM安全架構中的Simple TE和Chinese Wall策略及事實上現機制的分析與驗證。 第1章 Xen環境部署 1.1 版本號選擇 因為Ubuntu使用廣泛。軟件包易于下載。我們選擇Ubuntu系統進行Xen部署…

Python 辨異 —— __init__ 與 __new__

__init__ 更多的作用是初始化屬性&#xff0c;__new__ 進行的是創建對象&#xff0c;顯然 __new__ 要早于 __init__ 發生。 考慮一個繼承自 tuple 的類&#xff0c;顯然在 __init__ 無法對其成員進行修改&#xff1b; class Edge(tuple):def __new__(cls, e1, e2):return tuple…

java彈出虛擬鍵盤_JS實現電腦虛擬鍵盤的操作

本文實例為大家分享了JS實現電腦虛擬鍵盤的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下需求&#xff1a;1.當輸入框光標聚焦時&#xff0c;電腦虛擬鍵盤彈出2.在輸入框輸入內容時&#xff0c;鍵盤跟著變化具體實現代碼如下&#xff1a;Html部分&#xff1a;電腦鍵…

Apache Mahout:入門

最近&#xff0c;我有一個有趣的問題要解決&#xff1a;如何使用自動化對不同來源的文本進行分類&#xff1f; 前一段時間&#xff0c;我讀到一個有關該項目以及許多其他文本分析工作的項目– Apache Mahout 。 盡管它不是一個非常成熟的版本&#xff08;當前版本為0.4 &#x…