日誌分析工具ELK(一)

1、ELK介紹

1.1 elasticsearch

1.1.1 elasticsearch介紹

ElasticSearch是一個基於Lucene的搜索服務器。它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用Java開發的,並做爲Apache許可條款下的開放源碼發佈,是第二流行的企業搜索引擎。設計用於雲計算中,可以達到實時搜索,穩定,可靠,快速,安裝使用方便。java

1.1.2 elasticsearch幾個重要術語

  • Ÿ   NRT

elasticsearch是一個近似實時的搜索平臺,從索引文檔到可搜索有些延遲,一般爲1秒。node

  • Ÿ   集羣

集羣就是一個或多個節點存儲數據,其中一個節點爲主節點,這個主節點是能夠經過選舉產生的,並提供跨節點的聯合索引和搜索的功能。集羣有一個惟一性標示的名字,默認是elasticsearch,集羣名字很重要,每一個節點是基於集羣名字加入到其集羣中的。所以,確保在不一樣環境中使用不一樣的集羣名字。一個集羣能夠只有一個節點。強烈建議在配置elasticsearch時,配置成集羣模式。linux

  • Ÿ   節點

節點就是一臺單一的服務器,是集羣的一部分,存儲數據並參與集羣的索引和搜索功能。像集羣同樣,節點也是經過名字來標識,默認是在節點啓動時隨機分配的字符名。固然啦,你能夠本身定義。該名字也蠻重要的,在集羣中用於識別服務器對應的節點。
節點能夠經過指定集羣名字來加入到集羣中。默認狀況下,每一個節點被設置成加入到elasticsearch集羣。若是啓動了多個節點,假設能自動發現對方,他們將會自動組建一個名爲elasticsearch的集羣。nginx

  • Ÿ   索引

索引是有幾分類似屬性的一系列文檔的集合。如nginx日誌索引、syslog索引等等。索引是由名字標識,名字必須所有小寫。這個名字用來進行索引、搜索、更新和刪除文檔的操做。
索引相對於關係型數據庫的庫。git

  • Ÿ   類型

在一個索引中,能夠定義一個或多個類型。類型是一個邏輯類別仍是分區徹底取決於你。一般狀況下,一個類型被定於成具備一組共同字段的文檔。如ttlsa運維生成時間全部的數據存入在一個單一的名爲logstash-ttlsa的索引中,同時,定義了用戶數據類型,帖子數據類型和評論類型。
類型相對於關係型數據庫的表。github

  • Ÿ   文檔

文檔是信息的基本單元,能夠被索引的。文檔是以JSON格式表現的。
在類型中,能夠根據需求存儲多個文檔。
雖然一個文檔在物理上位於一個索引,實際上一個文檔必須在一個索引內被索引和分配一個類型。
文檔相對於關係型數據庫的列。web

分片和副本數據庫

在實際狀況下,索引存儲的數據可能超過單個節點的硬件限制。如一個十億文檔需1TB空間可能不適合存儲在單個節點的磁盤上,或者從單個節點搜索請求太慢了。爲了解決這個問題,elasticsearch提供將索引分紅多個分片的功能。當在建立索引時,能夠定義想要分片的數量。每個分片就是一個全功能的獨立的索引,能夠位於集羣中任何節點上。
分片的兩個最主要緣由:
a、水平分割擴展,增大存儲量
b、分佈式並行跨分片操做,提升性能和吞吐量
分佈式分片的機制和搜索請求的文檔如何彙總徹底是有elasticsearch控制的,這些對用戶而言是透明的。
網絡問題等等其它問題能夠在任什麼時候候不期而至,爲了健壯性,強烈建議要有一個故障切換機制,不管何種故障以防止分片或者節點不可用。
爲此,elasticsearch讓咱們將索引分片複製一份或多份,稱之爲分片副本或副本。
副本也有兩個最主要緣由:
高可用性,以應對分片或者節點故障。出於這個緣由,分片副本要在不一樣的節點上。
提供性能,增大吞吐量,搜索能夠並行在全部副本上執行。
總之,每個索引能夠被分紅多個分片。索引也能夠有0個或多個副本。複製後,每一個索引都有主分片(母分片)和複製分片(複製於母分片)。分片和副本數量能夠在每一個索引被建立時定義。索引建立後,能夠在任什麼時候候動態的更改副本數量,可是,不能改變分片數。
默認狀況下,elasticsearch爲每一個索引分片5個主分片和1個副本,這就意味着集羣至少須要2個節點。索引將會有5個主分片和5個副本(1個完整副本),每一個索引總共有10個分片。
每一個elasticsearch分片是一個Lucene索引。一個單個Lucene索引有最大的文檔數LUCENE-5843, 文檔數限制爲2147483519(MAX_VALUE – 128)。 可經過_cat/shards來監控分片大小。bootstrap

1.2 logstash

1.2.1 logstash 介紹

LogStash由JRuby語言編寫,基於消息(message-based)的簡單架構,並運行在Java虛擬機(JVM)上。不一樣於分離的代理端(agent)或主機端(server),LogStash可配置單一的代理端(agent)與其它開源軟件結合,以實現不一樣的功能。vim

1.2.2 logStash的四大組件

Ÿ   Shipper:發送事件(events)至LogStash;一般,遠程代理端(agent)只須要運行這個組件便可;

Ÿ   Broker and Indexer:接收並索引化事件;

Ÿ   Search and Storage:容許對事件進行搜索和存儲;

Ÿ   Web Interface:基於Web的展現界面
正是因爲以上組件在LogStash架構中可獨立部署,才提供了更好的集羣擴展性。

1.2.2 LogStash主機分類

  • Ÿ   代理主機(agent host):做爲事件的傳遞者(shipper),將各類日誌數據發送至中心主機;只需運行Logstash 代理(agent)程序;
  • Ÿ   中心主機(central host):可運行包括中間轉發器(Broker)、索引器(Indexer)、搜索和存儲器(Search and Storage)、Web界面端(Web Interface)在內的各個組件,以實現對日誌數據的接收、處理和存儲。

1.3 kibana

Kibana 也是一個開源和免費的工具,他能夠幫助您彙總、分析和搜索重要數據日誌並提供友好的web界面。他能夠爲 Logstash 和 ElasticSearch 提供的日誌分析的 Web 界面

2、使用ELK必要性(解決運維痛點)

  • Ÿ   開發人員不能登陸線上服務器查看詳細日誌
  • Ÿ   各個系統都有日誌,日至數據分散難以查找
  • Ÿ   日誌數據量大,查詢速度慢,或者數據不夠實時

3、elk部署之環境準備

3.1 機器準備

準備兩臺機器,如下是其中一臺作爲master的機器

[root@linux-node1 ~]# cat /etc/redhat-release 
CentOS Linux release 7.0.1406 (Core) 
[root@linux-node1 ~]# uname -a
Linux linux-node1.example.com 3.10.0-123.el7.x86_64 #1 SMP Mon Jun 30 12:09:22 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
[root@linux-node1 ~]# tail -2 /etc/hosts
192.168.230.128 linux-node1 linux-node1.example.com
192.168.230.129 linux-node2 linux-node2.example.com
[root@linux-node1 ~]# ifconfig eth0|awk -F '[ :]+' 'NR==2{print $3}'
192.168.230.128
[root@linux-node1~]# systemctl stop firewalld
[root@linux-node1~]# getenforce 0
Disabled
[root@linux-node1~ /]#  systemctl disable firewalld.service

時間同步

echo "#time sync by zsq at $(date +%F)" >> /var/spool/cron/root
echo "*/5 * * * * /usr/sbin/ntpdate time.nist.gov &>/dev/null" >>/var/spool/cron/root

重啓crond

/sbin/service crond restart

理想實踐是給2G內存,我這裏給1.5G,elasticsearch作集羣還須要一臺相同的配置

[root@linux-node1 ~]# free -m
             total       used       free     shared    buffers     cached
Mem:146751894880142

最佳實踐cpu給2顆

[root@linux-node1 ~]# cat /proc/cpuinfo |grep"physical id"|sort|uniq|wc -l
2

須要有java環境

[root@linux-node1 ~]# yum -y install java
[root@linux-node1 ~]# java -version
openjdk version "1.8.0_111"
OpenJDK Runtime Environment (build 1.8.0_111-b15)
OpenJDK 64-Bit Server VM (build 25.111-b15, mixed mode)

配置epel yum源

下載並安裝EPEL

wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
 rpm -ivh epel-release-latest-7.noarch.rpm

3.3 elk準備環境

3.3.1 elasticsearch安裝

下載並安裝GPG key

[root@linux-node2 ~]# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch

添加yum倉庫

[root@linux-node1 ~]# vim /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1

安裝elasticsearch

yum install -y elasticsearch

安裝太慢直接用rpm包

root@linux-node1 ~]# rpm -ivh elasticsearch-2.4.3.rpm
Preparing...                          ################################# [100%]
Creating elasticsearch group... OK
Creating elasticsearch user... OK
Updating / installing...
   1:elasticsearch-2.4.3-1            ################################# [100%]
### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd
 sudo systemctl daemon-reload
 sudo systemctl enable elasticsearch.service
### You can start elasticsearch service by executing
sudo systemctl start elasticsearch.service

再執行開機啓動

systemctl daemon-reload
systemctl enable elasticsearch.service

啓動

systemctl start elasticsearch.service

4、管理配置elasticsearch

4.1 管理linux-node1的elasticsearch

修改elasticsearch配置文件,並受權

[root@linux-node1 ~]#  grep -n '^[a-Z]' /etc/elasticsearch/elasticsearch.yml
17:cluster.name: check-cluster  #集羣節點
23:node.name: linux-node1   #節點名字
33:path.data: /data/es-data  #數據路徑
37:path.logs: /var/log/elasticsearch/ #自身log
43:bootstrap.memory_lock: true #是否鎖定內存
54:network.host: 0.0.0.0 #默認是全部網段
58:http.port: 9200 #端口

[root@linux-node1 ~]# mkdir -p /data/es-data
[root@linux-node1 ~]# chown elasticsearch.elasticsearch /data/es-data/

啓動elasticsearch 

[root@linux-node1 ~]# systemctl start elasticsearch

檢查

[root@linux-node1 ~]# netstat -ntpl|grep 9200
tcp6       0      0 :::9200                 :::*                    LISTEN      2042/java

訪問:

 

4.2 Elasticsearch插件

1.安裝Elasticsearch集羣管理插件

[root@linux-node1 ~]# /usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head

-> Installing mobz/elasticsearch-head...

Trying https://github.com/mobz/elasticsearch-head/archive/master.zip ...

Downloading ..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................DONE

Verifying https://github.com/mobz/elasticsearch-head/archive/master.zip checksums if available ...

NOTE: Unable to verify checksum for downloaded plugin (unable to find .sha1 or .md5 file to verify)

Installed head into /usr/share/elasticsearch/plugins/head

 

訪問head集羣插件:http://ES_IP:9200/_plugin/head/

 

寫點數據, 寫一個/index-demo/test的索引,方法post,點擊提交請求

{
 "user": "oldboy",
 "mesg": "hello world"
}

 

get提交id,id就是右邊提示的_id信息,查詢到_soure裏的內容

 

若是刪除用delete刪除

部署第二臺,集羣部署

[root@linux-node2 /]# java -version
openjdk version "1.8.0_111"
OpenJDK Runtime Environment (build 1.8.0_111-b15)
OpenJDK 64-Bit Server VM (build 25.111-b15, mixed mode)
[root@linux-node2 /]# rz -E
rz waiting to receive.
[root@linux-node2 /]# rpm -ivh elasticsearch-2.4.3.rpm 
warning: elasticsearch-2.4.3.rpm: Header V4 RSA/SHA1 Signature, key ID d88e42b4: NOKEY
Preparing...                          ################################# [100%]
Creating elasticsearch group... OK
Creating elasticsearch user... OK
Updating / installing...
   1:elasticsearch-2.4.3-1            ################################# [100%]
### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd
 sudo systemctl daemon-reload
 sudo systemctl enable elasticsearch.service
### You can start elasticsearch service by executing
 sudo systemctl start elasticsearch.service
[root@linux-node2 /]# systemctl daemon-reload
[root@linux-node2 /]#  systemctl enable elasticsearch.service
Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.
[root@linux-node2 /]# systemctl start elasticsearch.service
[root@linux-node2 /]# netstat -ntpl|grep "9200"
tcp6       0      0 127.0.0.1:9200          :::*                    LISTEN      2546/java           
tcp6       0      0 ::1:9200                :::*                    LISTEN      2546/java  

[root@linux-node2 data]# grep -n '^[a-Z]' /etc/elasticsearch/elasticsearch.yml
17:cluster.name: check-cluster
23:node.name: linux-node2
33:path.data: /data/es-data
37:path.logs: /var/log/elasticsearch/
43:bootstrap.memory_lock: true
54:network.host: 0.0.0.0
58:http.port: 9200

[root@linux-node2 ~]# mkdir -p /data/es-data
[root@linux-node2 ~]# chown elasticsearch.elasticsearch /data/es-data/

啓動elasticsearch 

[root@linux-node2 ~]# systemctl start elasticsearch

檢查

[root@linux-node2 ~]# netstat -ntpl|grep 9200
tcp6       0      0 :::9200                 :::*                    LISTEN      2042/java

瀏覽器訪問

 

查看日誌,/etc/security/limits.conf,配置文件須要追加內容# allow user 'elasticsearch' mlockall

下的兩行

[2017-01-03 20:56:02,486][WARN ][bootstrap                ] These can be adjusted by modifying /etc/security/limits.conf, for example: 
    # allow user 'elasticsearch' mlockall
    elasticsearch soft memlock unlimited
    elasticsearch hard memlock unlimited

瀏覽器下訪問,點擊概覽,已經有一臺集羣節點,要稍微等會,添加另一臺

經過組播進行通訊,會經過cluster進行查找,若是沒法經過組播查詢,修改爲單播便可,配置文件中指定,圖中的有*號表明主節點

# Pass an initial list of hosts to perform discovery when new node is started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
discovery.zen.ping.unicast.hosts: ["192.168.230.128", "192.168.230.129"]#把同一集羣的節點添加到這裏,方便它們互相認識

 

在瀏覽器中查看分片信息,一個索引默認被分紅了5個分片,每份數據被分紅了五個分片(能夠調節分片數量),外圍帶綠色框的爲主分片,不帶框的爲副本分片,主分片丟失,副本分片會複製一份成爲主分片,起到了高可用的做用,主副分片也可使用負載均衡加快查詢速度,可是若是主副本分片都丟失,則索引就是完全丟失。

4.3.安裝kopf監控插件

[root@linux-node1 /]# /usr/share/elasticsearch/bin/plugin install lmenezes/elasticsearch-kopf

訪問kopf監控插件:http://ES_IP:9200/_plugin/kopf

從下圖能夠看出節點的負載,cpu適應狀況,java對內存的使用(heap usage),磁盤使用,啓動時間

 

另外一個監控插件bigdesk很強大,可是bigdesk目前還不支持2.1!!!安裝bigdesk的方法以下

/usr/share/elasticsearch/bin/plugin install lukas-vlcek/bigdesk

4.4.node間組播通訊和分片

當第一個節點啓動,它會組播發現其餘節點,發現集羣名字同樣的時候,就會自動加入集羣。隨便一個節點都是能夠鏈接的,並非主節點才能夠鏈接,鏈接的節點起到的做用只是彙總信息展現

 

最初能夠自定義設置分片的個數,分片一旦設置好,就不能夠改變。主分片和副本分片都丟失,數據即丟失,沒法恢復,能夠將無用索引刪除。有些老索引或者不經常使用的索引須要按期刪除,不然會致使es資源剩餘有限,佔用磁盤大,搜索慢等。若是暫時不想刪除有些索引,能夠在插件中關閉索引,就不會佔用內存了。

相關文章
相關標籤/搜索