一、ELK簡介
1、環境的困境
- 開發人員不能登錄線上服務器查看詳細日誌
- 各個系統都有日誌,日誌數據分散難以查找
- 日誌數據量大,查詢速度慢,數據不夠實時
2、ELK Stack解決方案
ElasticSearch+LogStash+Kibana=ELK Stack
官方文檔地址:elastic.co
ElasticSearch
LogStash
Kibana
3、認識ElasticSearch
ElasticSearch是一個基於Lucene的搜索服務器。它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTfulweb接口。ElasticSearch是用Java開發的,並作爲Apache許可條款下的開放源碼發佈,是當前流行的企業級搜索引擎。設計用於雲計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。構建在全文檢索開源軟件Lucene之上的Elasticsearch,不僅能對海量規模的數據完成分佈式索引與檢索,還能提供數據聚合分析。據國際權威的數據庫產品評測機構DBEngines的統計,在2016年1月,Elasticsearch已超過Solr等,成爲排名第一的搜索引擎類應用
**概括:**基於Restful標準的高擴展高可用的實時數據分析的全文搜索工具
4、ElasticSearch的基本概念
(1)Index
類似於mysql數據庫中的database
(2)Type
類似於mysql數據庫中的table表,es中可以在Index中建立type(table),通過mapping進行映射。
(3)Document
由於es存儲的數據是文檔型的,一條數據對應一篇文檔即相當於mysql數據庫中的一行數據row,一個文檔中可以有多個字段也就是mysql數據庫一行可以有多列。
(4)Field
es中一個文檔中對應的多個列與mysql數據庫中每一列對應
(5)Mapping
可以理解爲mysql或者solr中對應的schema,只不過有些時候es中的mapping增加了動態識別功能,感覺很強大的樣子,其實實際生產環境上不建議使用,最好還是開始制定好了對應的schema爲主。
(6)indexed
就是名義上的建立索引。mysql中一般會對經常使用的列增加相應的索引用於提高查詢速度,而在es中默認都是會加上索引的,除非你特殊制定不建立索引只是進行存儲用於展示,這個需要看你具體的需求和業務進行設定了。
(7)Query DSL
類似於mysql的sql語句,只不過在es中是使用的json格式的查詢語句,專業術語就叫:QueryDSL。
GET/PUT/POST/DELETE分別類似與mysql中的select/update/delete…
5、Elasticsearch的架構
Gateway層
es用來存儲索引文件的一個文件系統且它支持很多類型,例如:本地磁盤、共享存儲(做snapshot的時候需要用到)、hadoop的hdfs分佈式存儲、亞馬遜的S3。它的主要職責是用來對數據進行長持久化以及整個集羣重啓之後可以通過gateway重新恢復數據。
Distributed Lucene Directory
Gateway上層就是一個lucene的分佈式框架,lucene是做檢索的,但是它是一個單機的搜索引擎,像這種es分佈式搜索引擎系統,雖然底層用lucene,但是需要在每個節點上都運行lucene進行相應的索引、查詢以及更新,所以需要做成一個分佈式的運行框架來滿足業務的需要。
四大模塊組件
districted lucene directory之上就是一些es的模塊,Index Module是索引模塊,就是對數據建立索引也就是通常所說的建立一些倒排索引等;Search Module是搜索模塊,就是對數據進行查詢搜索;Mapping模塊是數據映射與解析模塊,就是你的數據的每個字段可以根據你建立的表結構通過mapping進行映射解析,如果你沒有建立表結構,es就會根據你的數據類型推測你的數據結構之後自己生成一個mapping,然後都是根據這個mapping進行解析你的數據;River模塊在es2.0之後應該是被取消了,它的意思表示是第三方插件,例如可以通過一些自定義的腳本將傳統的數據庫(mysql)等數據源通過格式化轉換後直接同步到es集羣裏,這個river大部分是自己寫的,寫出來的東西質量參差不齊,將這些東西集成到es中會引發很多內部bug,嚴重影響了es的正常應用,所以在es2.0之後考慮將其去掉。
Discovery、Script
es4大模塊組件之上有 Discovery模塊:es是一個集羣包含很多節點,很多節點需要互相發現對方,然後組成一個集羣包括選主的,這些es都是用的discovery模塊,默認使用的是 Zen,也可是使用EC2;es查詢還可以支撐多種script即腳本語言,包括mvel、js、python等等。
Transport協議層
再上一層就是es的通訊接口Transport,支持的也比較多:Thrift、Memcached以及Http,默認的是http,JMX就是java的一個遠程監控管理框架,因爲es是通過java實現的。
RESTful接口層
最上層就是es暴露給我們的訪問接口,官方推薦的方案就是這種Restful接口,直接發送http請求,方便後續使用nginx做代理、分發包括可能後續會做權限的管理,通過http很容易做這方面的管理。如果使用java客戶端它是直接調用api,在做負載均衡以及權限管理還是不太好做。
6、RESTfull API
一種軟件架構風格、設計風格,而不是標準,只是提供了一組設計原則和約束條件。它主要用於客戶端和服務器交互類的軟件。基於這個風格設計的軟件可以更簡潔,更有層次,更易於實現緩存等機制。在目前主流的三種Web服務交互方案中,REST相比於SOAP(Simple Object Access protocol,簡單對象訪問協議)以及XML-RPC更加簡單明瞭
(Representational State Transfer意思是:表述性狀態傳遞)
它使用典型的HTTP方法,諸如GET,POST.DELETE,PUT來實現資源的獲取,添加,修改,刪除等操作。即通過HTTP動詞來實現資源的狀態扭轉
複製代碼
GET 用來獲取資源
POST 用來新建資源(也可以用於更新資源)
PUT 用來更新資源
DELETE 用來刪除資源
7、CRUL命令
以命令的方式執行HTTP協議的請求
GET/POST/PUT/DELETE
示例:
訪問一個網頁
curl www.baidu.com
curl -o tt.html www.baidu.com
顯示響應的頭信息
curl -i www.baidu.com
顯示一次HTTP請求的通信過程
curl -v www.baidu.com
執行GET/POST/PUT/DELETE操作
curl -X GET/POST/PUT/DELETE url
8、CentOS7下安裝ElasticSearch6.2.4
(1)配置JDK環境
配置環境變量
export JAVA_HOME="/opt/jdk1.8.0_144"
export PATH="$JAVA_HOME/bin:$PATH"
export CLASSPATH=".:$JAVA_HOME/lib"
(2)安裝ElasticSearch6.2.4
下載地址:https://www.elastic.co/cn/downloads/elasticsearch
啓動報錯:
解決方式:
bin/elasticsearch -Des.insecure.allow.root=true
或者修改bin/elasticsearch,加上ES_JAVA_OPTS屬性:
ES_JAVA_OPTS="-Des.insecure.allow.root=true"
再次啓動:
這是出於系統安全考慮設置的條件。由於ElasticSearch可以接收用戶輸入的腳本並且執行,爲了系統安全考 慮,建議創建一個單獨的用戶用來運行ElasticSearch。
創建用戶組和用戶:
groupadd esgroup
useradd esuser -g esgroup -p espassword
更改elasticsearch文件夾及內部文件的所屬用戶及組:
cd /opt
chown -R esuser:esgroup elasticsearch-6.2.4
切換用戶並運行:
su esuser
./bin/elasticsearch
再次啓動顯示已殺死:
需要調整JVM的內存大小:
vi bin/elasticsearch
ES_JAVA_OPTS="-Xms512m -Xmx512m"
再次啓動:啓動成功
如果顯示如下類似信息:
[INFO ][o.e.c.r.a.DiskThresholdMonitor] [ZAds5FP] low disk watermark [85%] exceeded on [ZAds5FPeTY-ZUKjXd7HJKA]
[ZAds5FP][/opt/elasticsearch-6.2.4/data/nodes/0] free: 1.2gb[14.2%], r
eplicas will not be assigned to this node
需要清理磁盤空間。
後臺運行:
./bin/elasticsearch -d
測試連接:
curl 127.0.0.1:9200
會看到以下JSON數據:
[root@localhost ~]# curl 127.0.0.1:9200
{
"name" : "rBrMTNx",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "-noR5DxFRsyvAFvAzxl07g",
"version" : {
"number" : "5.1.1",
"build_hash" : "5395e21",
"build_date" : "2016-12-06T12:36:15.409Z",
"build_snapshot" : false,
"lucene_version" : "6.3.0"
},
"tagline" : "You Know, for Search"
}
實現遠程訪問:
需要對config/elasticsearch.yml進行 配置:
network.host: 192.168.25.131
再次啓動報錯:
處理第一個錯誤:
vim /etc/security/limits.conf //文件最後加入
esuser soft nofile 65536
esuser hard nofile 65536
esuser soft nproc 4096
esuser hard nproc 4096
處理第二個錯誤:
進入limits.d目錄下修改配置文件。
vim /etc/security/limits.d/20-nproc.conf
修改爲 esuser soft nproc 4096
處理第三個錯誤:
vim /etc/sysctl.conf
vm.max_map_count=655360
執行以下命令生效:
sysctl -p
關閉防火牆:
systemctl stop firewalld.service
再次啓動成功!
9、安裝Head插件
Head是elasticsearch的集羣管理工具,可以用於數據的瀏覽和查詢
(1)elasticsearch-head是一款開源軟件,被託管在github上面,所以如果我們要使用它,必須先安裝git,通過git獲取elasticsearch-head
(2)運行elasticsearch-head會用到grunt,而grunt需要npm包管理器,所以nodejs是必須要安裝的
(3)elasticsearch5.0之後,elasticsearch-head不做爲插件放在其plugins目錄下了。
使用git拷貝elasticsearch-head到本地
cd /usr/local/
git clone git://github.com/mobz/elasticsearch-head.git
(4)安裝elasticsearch-head依賴包
[root@localhost local]# npm install -g grunt-cli
[root@localhost _site]# cd /usr/local/elasticsearch-head/
[root@localhost elasticsearch-head]# cnpm install
(5)修改Gruntfile.js
[root@localhost _site]# cd /usr/local/elasticsearch-head/
[root@localhost elasticsearch-head]# vi Gruntfile.js
在connect–>server–>options下面添加:hostname:’*’,允許所有IP可以訪問
(6)修改elasticsearch-head默認連接地址
[root@localhost elasticsearch-head]# cd /usr/local/elasticsearch-head/_site/
[root@localhost _site]# vi app.js
將this.base_uri = this.config.base_uri || this.prefs.get(“app-base_uri”) || “http://localhost:9200”;中的localhost修改成你es的服務器地址
(7)配置elasticsearch允許跨域訪問
打開elasticsearch的配置文件elasticsearch.yml,在文件末尾追加下面兩行代碼即可:
http.cors.enabled: true
http.cors.allow-origin: "*"
(8)打開9100端口
[root@localhost elasticsearch-head]# firewall-cmd --zone=public --add-port=9100/tcp --permanent
重啓防火牆
[root@localhost elasticsearch-head]# firewall-cmd --reload
(9)啓動elasticsearch
(10)啓動elasticsearch-head
[root@localhost _site]# cd /usr/local/elasticsearch-head/
[root@localhost elasticsearch-head]# node_modules/grunt/bin/grunt server
(11)訪問elasticsearch-head
關閉防火牆:systemctl stop firewalld.service
瀏覽器輸入網址:http://192.168.25.131:9100/
10、安裝Kibana
Kibana是一個針對Elasticsearch的開源分析及可視化平臺,使用Kibana可以查詢、查看並與存儲在ES索引的數據進行交互操作,使用Kibana能執行高級的數據分析,並能以圖表、表格和地圖的形式查看數據
(1)下載Kibana
https://www.elastic.co/downloads/kibana
(2)把下載好的壓縮包拷貝到/soft目錄下
(3)解壓縮,並把解壓後的目錄移動到/user/local/kibana
(4)編輯kibana配置文件
[root@localhost /]# vi /usr/local/kibana/config/kibana.yml
將server.host,elasticsearch.url修改成所在服務器的ip地址
(5)開啓5601端口
Kibana的默認端口是5601
開啓防火牆:systemctl start firewalld.service
開啓5601端口:firewall-cmd --permanent --zone=public --add-port=5601/tcp
重啓防火牆:firewall-cmd –reload
(6)啓動Kibana
[root@localhost /]# /usr/local/kibana/bin/kibana
瀏覽器訪問:http://192.168.25.131:5601
11、安裝中文分詞器
(1)下載中文分詞器
https://github.com/medcl/elasticsearch-analysis-ik
下載elasticsearch-analysis-ik-master.zip
(2)解壓elasticsearch-analysis-ik-master.zip
unzip elasticsearch-analysis-ik-master.zip
(3)進入elasticsearch-analysis-ik-master,編譯源碼
mvn clean install -Dmaven.test.skip=true
(4)在es的plugins文件夾下創建目錄ik
(5)將編譯後生成的elasticsearch-analysis-ik-版本.zip移動到ik下,並解壓
(6)解壓後的內容移動到ik目錄下