Elasticsearch日志分析系統
作者:尹正傑
版權聲明:原創作品,謝絕轉載!否則將追究法律責任。
一.什么是Elasticsearch
一個采用Restful API標准的高擴展性的和高可用性的實時數據分析的全文搜索工具。高擴展性體現在Elasticsearch添加節點非常簡單,基本新的節點無需做復雜的配置,接入Elasticsearch的集群就可以了,自動會被發現;高可用體現在Elasticsearch它是分布式的,每個節點它都有備份,所以down一兩個節點不會出現任何問題的;實時數據分析體現在Elasticsearch它是試試的搜索平台,同時它支持PB級的這種大數據的搜索能力,從索引的一個文檔到這個文檔能被搜索到的時間只有一個輕微的延遲,通常是一秒,所以說它的實時性是非常高的。Elasticsearch是基於P2P的系統。它首先通過廣播的機制訊早存在的節點,然后再通過這個多播協議來進行節點間的通信,同時也支持點對點的交互。
二.Elasticsearch的主要概念
1 Node(節點): 2 單個的裝有Elasticsearch服務並且提供故障轉移和擴展的服務器。 3 Cluster(集群): 4 一個集群就是由一個或多個node組織在一起,共同工作,共同分享整個數據具有負載均衡功能的集群。 5 Document(文檔): 6 一個文檔是可以被索引的基礎信息單元。 7 Index(索引): 8 索引就是一個擁有幾分相似特征的文檔的集合。 9 Type(類型): 10 一個索引中,你可以定義一種或多種類型。 11 Field(列): 12 Field是Elasticsearchd的最小單位,相當於數據的某一列。 13 Shards(分片): 14 Elasticsearch將索引分成若干份,每個部門就是一個shard。 15 Replicas(復制): 16 Replicas是索引一份或多份拷貝。
三.Elasticsearch對應數據庫的關系

我們知道Elasticsearch是NSQL,是非關系型數據庫,它的Index對應關系型數據庫(如MySQL)的Database,Type類型對應的就是Table,Document對應的就是Row,而Filed對應的就是Column等等。
四.Elasticsearch架構

這幅圖我們先從下往上看,底層是Gateway,這個gateway就是Elasticsearch支持的索引數據的存儲格式。當這個Elasticsearch關閉再啟動的時候,它就會從這個gateway里面多去索引數據。圖中我們可以清晰的看到它支持的一些格式,有本地的Loacal FileSystem。還有分布式的Sharad FileSeystem,當然還支持當前比較流行的Hadoop HDFS還有一些亞馬遜的S3等等。
那么接下來Gateway上面這層就是Lucene的框架。這個Elasticsearch就是基於Lucene這個框架而寫的。而Lucene又是基於JAVA語言編寫的,也就是說如果我們想要安裝es,肯定是需要安裝Java虛擬機的,而對於不同的版本對於Java的版本要求也不一致,比如目前最新版本的5.6.x系列要求最低Java版本就是1.8以上喲~
而在Lucene在往上就是這個Elasticsearch對數據的加工處理方式了。我們可以看到有創建index的模塊,還有搜索的模塊以及mapping(定義索引下面type字段的處理規則,比如說索引如何建立,還有索引數據類型等等。相當於這個關系型數據庫里的schema。)和River(它是一個運行在Elasticsearch集群內部的一個插件,主要就是用來從外部獲取異構數據,然后在Elasticsearch里創建索引,常見的插件有RabbitMQ River還有Twitter River)模塊。
再往上一層的第一塊就是Elasticsearch自動發現節點的機制(Discovery),這個Zen是用來實現節點自動發現,還有Master節點選取用的。加入Master出現了故障,不能工作了,那么其他的這個節點會自動選舉,然后產生一個新的Master。Scripting這塊區域是Elasticsearch的腳本執行功能。有了這個功能就可以很方便對查詢出來的數據進行加工處理,它支持mvel,js,python,Etc這樣的腳本類型。那么最右邊的這個3rd Plugins,它的意思說Elasticsearch支持安裝很多第三方的插件(比如:中文分詞,狀態監控這樣的插件等等,插件安裝也非常簡單)。因為Elasticsearch的社區支持力度是比較大的,所以說會有很多種插件提供給用戶使用。這樣就會讓Elasticsearch使用的就更加的簡單方便。
再往上一層就是正數第二次就是Elasticsearch的交互方式了。外面可以看到有三種協議,Thrift,Memcached和HTTP,默認Elasticsearch是用HTTP協議傳輸的。
最頂層就是Elasticsearch的API支持ID模式了,目前RESTFul這樣的API接口的標准是非常流行的,所以說Elasticsearch也采用了這種標准,Elasticsearch可以支持JAVA語言,同時JAVA語言也是對Elasticsearch支持度最好的語言。因為Lucenn也是用JAVA開發的。通過JAVA當前最流行的這種開發語言,可以很好的開發處一套工具去管理和操作這個Elasticsearch。
五.對比Elasticsearch與Solr
當前采用Elasticsearch這個搜索引擎的公司特別多,包括有名的Adobe,ebay,微軟,Facebook,orange,Mozilla等等。同比跟Elasticsearch這樣同性質的工具也有很多,比如說solr和splunk等等。下面有一張2015年8月的搜索引起排行榜:

我們可以看到Solr排行是第一的,當這個Elasticsearch也是名列前茅,處於第二代位置,它的使用率還是挺高的。Solr和Elasticsearch都是全文搜索比較火的引擎,他們有什么區別呢?
Elasticsearch側重實時數據分析,solr在這一方面是遠不及Elasticsearch的。當然,Solr支持文本格式比Elasticsearch多:比如:html,pdf,word,excel,cvs等等。而Elasticsearch只支持json的格式。所以大家在選擇工具的同時,也要根據自己項目的情況去選擇。這樣才有利於我們項目的開展。
Elasticsearch的官網地址:https://www.elastic.co/products/elasticsearch
六.什么是RESTFul
我們知道Elasticsearch是完全基於RESTFul設計風格的全文搜索引擎,包括我們現在接觸到的很多開源軟件,其實很多都是基於RESTFul這種風格的。現在很流行鄧凱元軟件(架構),比如Openstack,它也是RESTFul風格的。接下來我們就了解一下RESTFul基本知識。
API:
Application Programming Interface的縮寫,中文意思就是應用程序接口;一個程序有了API之后,程序員和運維人員就能更加方便的通過命令或者是程序去調用和使用它,使用接口其實就是通過這個接口,獲取或者修改一些數據。
XML:
可擴展標記語言,是一種程序與程序之間傳輸數據的標記語言;它的內容都是由標簽組成的,非常有規律,閱讀起來也非常的簡潔明了。但是XML也有不少缺點,第一,XML文件格式比較龐大復雜,輸出占用帶寬;第二,服務端和客戶端都要花費大量的代碼去解析XML,而且解析這個XML會花費資源和時間;第三,不同瀏覽器之間解析XML的方式不一致,需要重復並寫很多代碼,代碼多不容易維護等等。
但是隨着互聯網的技術(比如微博和微信技術)的不斷發展,用戶對web應用的交互就越來越多了,因此數據交互也越來越頻繁,如果數據形式還是以XML的話,那就會非常的復雜和花費時間。所以
XML慢慢開始就廢棄了,隨之替代它的是另外一種更方便簡潔的數據形式,即JSON。
JSON:
英文JavaScript object notation的縮寫,它是一種新型的輕量級數據交換格式;它有很多優點,第一,數據格式比較簡單,易於閱讀,易於讀寫;第二,格式是壓縮的,占用帶寬比較小;第三,易於解析;第四,支持很多種玉玉,包括C,C++,JAVA,Perl,PHP,Python等等(當前流行玉玉都支持);第五點,JSON數據直接能為服務端的代碼(程序)使用,能簡化服務端以及客戶端的代碼開發量,這樣就利於維護。正是因為這些優點,加上現在這種JS前端技術的不斷發展,出現了很多前端JS的一些框架。比如說AngularJS和ExrtJS等等。有了這些成熟的JS框架工具,那么這前端和后端的開發都已經完全分離了。所以JSON這種數據交換方式就在web開發界被慢慢普及了。
使用JSON的人越來越多,大家都希望遵循一種風格去設計程序,RESTFul(Representational State Transfer)這種風格就孕育而生了。其實,REST這個詞很早就提出來了,在2000年的時候,這個概念有Apache基金會的第一人主席Roy Fielding,在他的博士論文中第五章就提到過REST這個概念。REST是英文單詞Representational State Transfer的縮寫,中文意思是“表現層狀態轉化”,我們可以把它拆分理解,“表現層”它指的是“資源表現層”,這里的資源就是指網絡上的信息(比如說,一段文本,一張圖片,一個小電影什么的),那么每一個資源它在網絡上都有全球唯一標識(URI)。所以說我們把資源具體呈現出來的這種形式叫做表現層。我們知道Elasticsearch默認是使用http協議的,而http又是一種無狀態(服務端它不會去記錄客戶端的所有信息和操作,數據的狀態它只保存在服務端)的協議,因此,如果這個客戶端想要操作這個服務器,必須要通過某些方法(GET,POST,PUT,DELETE),通過這些方法,才能讓服務器發生狀態轉化,而這種轉化需要建立在“表現層”之上的。所以我們稱之為表現層狀態轉化。
七.安裝Elasticsearch
Elasticsearch官方文檔地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/docs.html
1.操作環境
1 [root@yinzhengjie ~]# cat /etc/redhat-release 2 CentOS release 6.6 (Final) 3 [root@yinzhengjie ~]# 4 [root@yinzhengjie ~]# uname -r 5 2.6.32-504.el6.x86_64 6 [root@yinzhengjie ~]# 7 [root@yinzhengjie ~]# uname -m 8 x86_64 9 [root@yinzhengjie ~]#
2.安裝jdk,配置JAVA環境變量
a>.下載Java虛擬機

b>.卸載舊版本的JAVA
1 [root@yinzhengjie jdk]# java -version ----->檢查當前版本 2 java version "1.7.0_65" ------>當前版本是1.7 3 OpenJDK Runtime Environment (rhel-2.5.1.2.el6_5-x86_64 u65-b17) 4 OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode) 5 [root@yinzhengjie jdk]# 6 [root@yinzhengjie jdk]# yum -y groupremove java* ------>卸載相關Java組件 7 [root@yinzhengjie jdk]# java -version ------>再次查看當前Java版本 8 java version "1.5.0" ------->當前版本是1.5 9 gij (GNU libgcj) version 4.4.7 20120313 (Red Hat 4.4.7-18) 10 11 Copyright (C) 2007 Free Software Foundation, Inc. 12 This is free software; see the source for copying conditions. There is NO 13 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 14 [root@yinzhengjie jdk]# 15 [root@yinzhengjie jdk]# yum -y remove java* 16 [root@yinzhengjie jdk]# java -version ------->再次查看Java版本應該報錯說明卸載成功。 17 -bash: /usr/bin/java: 沒有那個文件或目錄 18 [root@yinzhengjie jdk]#
c>.安裝Java
1 [root@yinzhengjie ~]# mkdir -pv /yinzhengjie/application/jdk && cd /yinzhengjie/application/jdk 2 [root@yinzhengjie jdk]# yum -y install lrzsz 3 [root@yinzhengjie jdk]# rz ------>上傳我們已經下載的文件 4 rz waiting to receive. 5 zmodem trl+C ȡ 6 7 100% 185289 KB 960 KB/s 00:03:13 0 Errorsr.gz... 8 9 [root@yinzhengjie jdk]# ll 10 總用量 185300 11 -rw-r--r--+ 1 root root 189736377 10月 29 21:45 jdk-8u151-linux-x64.tar.gz 12 [root@yinzhengjie jdk]# 13 [root@yinzhengjie jdk]# tar xf jdk-8u151-linux-x64.tar.gz 14 [root@yinzhengjie jdk1.8.0_151]# tail -6 /etc/profile 15 #ADD BY YINZHENGJIE 16 export JAVA_HOME=/yinzhengjie/application/jdk/jdk1.8.0_151 17 export JAVA_BIN=/yinzhengjie/application/jdk/jdk1.8.0_151/bin 18 export PATH=$PATH:$JAVA_HOME/bin 19 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 20 export JAVA_HOME JAVA_BIN PATH CLASSPATH 21 [root@yinzhengjie jdk1.8.0_151]# 22 [root@yinzhengjie jdk1.8.0_151]# source /etc/profile ------->重新讀取該配置文件 23 [root@yinzhengjie jdk1.8.0_151]# java -version -------->再一次的檢查當前JAVA版本 24 java version "1.8.0_151" ------->當前版本為1.8版本,表示安裝成功。 25 Java(TM) SE Runtime Environment (build 1.8.0_151-b12) 26 Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode) 27 [root@yinzhengjie jdk1.8.0_151]#
3.安裝Elasticsearch
a>.下載elasticsearch軟件包

b>.源碼安裝並運行Elasticsearch
1 [root@yinzhengjie ~]# mkdir -pv /yinzhengjie/application/elasticsearch && cd /yinzhengjie/application/elasticsearch 2 [root@yinzhengjie elasticsearch]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.3.tar.gz 3 [root@yinzhengjie elasticsearch]# rz 4 rz waiting to receive. 5 zmodem trl+C ȡ 6 7 100% 32982 KB 1221 KB/s 00:00:27 0 Errorsr.gz... 8 9 [root@yinzhengjie elasticsearch]# tar xf elasticsearch-5.6.3.tar.gz 10 [root@yinzhengjie elasticsearch]# useradd yinzhengjie 11 [root@yinzhengjie elasticsearch]# chown yinzhengjie:yinzhengjie elasticsearch-5.6.3 -R 12 [root@yinzhengjie elasticsearch]# cd elasticsearch-5.6.3/bin/ 13 [root@yinzhengjie bin]# su yinzhengjie 14 [yinzhengjie@yinzhengjie bin]$ ./elasticsearch -d ------>用非root用戶在后台運行 15 [root@yinzhengjie ~]# lsof -i:9200 ------>查看服務是否正常啟動 16 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME 17 java 5543 yinzhengjie 137u IPv6 35018 0t0 TCP localhost:wap-wsp (LISTEN) 18 java 5543 yinzhengjie 138u IPv6 35019 0t0 TCP localhost:wap-wsp (LISTEN) 19 [root@yinzhengjie ~]# 20 [yinzhengjie@yinzhengjie bin]$ exit 21 exit 22 [root@yinzhengjie bin]# 23 [root@yinzhengjie bin]# 24 [root@yinzhengjie bin]# ps -ef | grep elasticsearch | grep -v grep 25 501 5786 1 4 21:29 pts/0 00:00:17 /yinzhengjie/application/jdk/jdk1.8.0_151/bin/java -Xms2g -Xmx2g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+AlwaysPreTouch -server -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -Djdk.io.permissionsUseCanonicalPath=true -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Dlog4j.skipJansi=true -XX:+HeapDumpOnOutOfMemoryError -Des.path.home=/yinzhengjie/application/elasticsearch/elasticsearch-5.6.3 -cp /yinzhengjie/application/elasticsearch/elasticsearch-5.6.3/lib/* org.elasticsearch.bootstrap.Elasticsearch -d 26 [root@yinzhengjie bin]# 27 [root@yinzhengjie bin]# curl 127.0.0.1:9200 ------->用curl命令驗證安裝的es是否可用。 28 { 29 "name" : "uJy1--c", 30 "cluster_name" : "elasticsearch", 31 "cluster_uuid" : "mQ8mfu3bQQGdo-jSECJQhQ", 32 "version" : { 33 "number" : "5.6.3", 34 "build_hash" : "1a2f265", 35 "build_date" : "2017-10-06T20:33:39.012Z", 36 "build_snapshot" : false, 37 "lucene_version" : "6.6.1" 38 }, 39 "tagline" : "You Know, for Search" 40 } 41 [root@yinzhengjie bin]#
d>.rpm安裝並運行Elasticsearch
1 [root@yinzhengjie ~]# mkdir -pv /yinzhengjie/application/elasticsearch && cd /yinzhengjie/application/elasticsearch 2 [root@yinzhengjie elasticsearch]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.3.rpm 3 [root@yinzhengjie elasticsearch]# rpm --install elasticsearch-5.6.3.rpm 4 [root@yinzhengjie elasticsearch]# 5 [root@yinzhengjie elasticsearch]# ln -s `which java` /sbin/java ----->需要手動做一個軟連接 6 [root@yinzhengjie elasticsearch]# service elasticsearch start ----->做好連接之后可用啟動服務 7 [root@yinzhengjie elasticsearch]# 8 [root@yinzhengjie elasticsearch]# lsof -i:9200 ------->檢查服務是否正常啟動 9 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME 10 java 3074 elasticsearch 135u IPv6 29720 0t0 TCP localhost:wap-wsp (LISTEN) 11 java 3074 elasticsearch 137u IPv6 29722 0t0 TCP localhost:wap-wsp (LISTEN) 12 [root@yinzhengjie elasticsearch]# 13 [root@yinzhengjie elasticsearch]# curl 127.0.0.1:9200 ------->驗證是否按照成功 14 { 15 "name" : "BAzujhz", 16 "cluster_name" : "elasticsearch", 17 "cluster_uuid" : "7jz3RzqdTiS--VoQADAE5g", 18 "version" : { 19 "number" : "5.6.3", 20 "build_hash" : "1a2f265", 21 "build_date" : "2017-10-06T20:33:39.012Z", 22 "build_snapshot" : false, 23 "lucene_version" : "6.6.1" 24 }, 25 "tagline" : "You Know, for Search" 26 } 27 [root@yinzhengjie elasticsearch]#
e>.目錄結構說明(以下是源碼安裝的目錄結構作為說明)
1 [root@yinzhengjie elasticsearch-5.6.3]# ll 2 total 244 3 drwxr-xr-x. 2 yinzhengjie yinzhengjie 4096 Oct 30 05:11 bin -------->運行elasticsearch實例和管理插件的一些腳本; 4 drwxr-xr-x. 3 yinzhengjie yinzhengjie 4096 Oct 30 05:07 config --------->配置文件路徑,包含elasticsearch.yml文件,注意RPM安裝的存放位置應該是/etc/elasticsearch這個目錄; 5 drwxrwxr-x. 3 yinzhengjie yinzhengjie 4096 Oct 30 05:07 data --------->在每個索引/碎片的數據文件的位置,可以有多個目錄; 6 drwxr-xr-x. 2 yinzhengjie yinzhengjie 4096 Oct 6 13:35 lib ---------->elasticsearch使用的庫; 7 -rw-r--r--. 1 yinzhengjie yinzhengjie 11358 Oct 6 13:32 LICENSE.txt 8 drwxr-xr-x. 2 yinzhengjie yinzhengjie 4096 Oct 30 05:06 logs ---------->存放日志的文件夾,注意如果是RPM方式安裝的話應該在/var/log/elasticsearch這個目錄里面,官網文檔是有說明的。 9 drwxr-xr-x. 13 yinzhengjie yinzhengjie 4096 Oct 6 13:35 modules 10 -rw-r--r--. 1 yinzhengjie yinzhengjie 194187 Oct 6 13:34 NOTICE.txt 11 drwxr-xr-x. 2 yinzhengjie yinzhengjie 4096 Oct 6 13:35 plugins --------->存放已經安裝的插件的存放位置 12 -rw-r--r--. 1 yinzhengjie yinzhengjie 9549 Oct 6 13:32 README.textile 13 [root@yinzhengjie elasticsearch-5.6.3]#
八.Elasticsearch相關插件。
elasticsearch支持很多插件,本篇文章只介紹兩個常用插件,即Head插件和Bigdesk插件。除了這兩個插件,
elasticsearch還支持很多的插件,如果想了解的童鞋可自行上網搜索。(使勁戳我)
1.Head插件安裝
a>.Head插件介紹
head插件是一個elasticsearch的集群管理工具,它是完全由html5編寫的獨立網頁程序。GitHub地址:https://github.com/mobz/elasticsearch-head。
b>.安裝head插件
2.Bigdesk插件安裝