做者:玩世不恭的Coder
時間:2020-03-08
說明:原創不易,本文爲原創文章,未經容許不可轉載,轉載前請聯繫做者javascript
前言1、ELK系統的搭建Elasticsearch的安裝安裝kibana安裝logstash2、基於Logstash對Elasticsearch索引庫中數據的導入和導出使用logstash將es數據從索引庫中導出logstash對Elasticsearch索引庫中數據的導入3、安裝ik中文分詞器ik中文分詞器插件的安裝分詞結果測試4、Elasticsearch集羣的搭建建立集羣所須要的配置文件及數據文件,以便容器的映射建立elasticsearch容器並啓動所遇問題java
Elasticsearch是什麼?爲何每次學習一門技術都是英文的呢?真的是腦闊疼。既然它是英文的,咱們不妨藉助有道來初步的看看Elasticsearch
究竟是何方神聖,竟如此多嬌。其分爲elastic和search兩個獨立的單詞,咱們來無腦有道一波看看,獲得的解釋以下:node
從有道的解釋來看,咱們能夠簡單的對其理解爲:Elasticsearch是及其具備彈性的、靈活的、像鬆緊帶同樣的且可供搜尋檢索的一款工具。o(*≧▽≦)ツ┏━┓python
百度百科對其解釋以下:git
ElasticSearch是一個基於Lucene的搜索服務器。它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用Java語言開發的,並做爲Apache許可條款下的開放源碼發佈,是一種流行的企業級搜索引擎。ElasticSearch用於雲計算中,可以達到實時搜索,穩定,可靠,快速,安裝使用方便。官方客戶端在Java、.NET(C#)、PHP、Python、Apache、Groovy、Ruby和許多其餘語言中都是可用的。根據DB-Engines的排名顯示,Elasticsearch是最受歡迎的企業搜索引擎,其次是Apache Solr,也是基於Lucene。github
從如上信息咱們能夠得知,Elasticsearch是一款實時、分佈式存儲的搜索引擎,在實際開發過程當中,咱們經常會把數據放在Elasticsearch搜索引擎中,而後從引擎中去實際須要的數據。並且在實際搜索過程當中,咱們也會有許多的Api支持來對數據進行檢索,好比排序、條件查詢等,其中在Elasticsearch中最爲強大之處就是他的模糊檢索功能。講到這,可能有些Mysql經驗但沒接觸過Elasticsearch的朋友可能會有個疑問,Mysql大法不是無敵麼,其中的like
語句不能模糊查詢麼?where and
不能條件檢索麼?orderby
不能對數據進行排序麼?我隨隨便便就信手拈來一個Sql語句不就能實現業務的需求麼:web
select department_name, count(*) 員工個數
from departments d, employees e
where d.department_id = e.department_id
group by d.department_id
having count(*)>5
order by count(*) desc;
是這樣沒錯,以上SQL代碼的確可以實現實際需求,可是當咱們的業務逐漸變得複雜、龐大,咱們的用戶量愈來愈多,咱們就不得不站在用戶的角度來想一想了。試想一下,假設哪些淘寶er天天打開淘寶搜索本身想要的數據時都要等個幾十秒,那會是怎樣的一種畫面。又好比,在打開咱們常見文件來檢索咱們須要數據的時候,好比txt、word、excel,咱們通常都能迅速打開,那是由於這些文件佔用實際空間都過小,這些文件大多就幾kb,假設咱們打開一個以G爲單位的日誌文件,此時的系統還能像以往那樣正常麼?換言之,Elasticsearch採用的是索引搜索,可以具備強大的搜索能力,可以達到實時搜索,穩定,可靠,快速,安裝的效用。sql
另外,Elasticsearch在處理日誌的過程當中,其經常與數據收集和日誌解析引擎Logstash以及名爲Kibana的分析和可視化平臺配合使用,也就是常說的ELK
系統。文本將主要介紹如下幾個方面的內容docker
Elasticsearch是實時全文搜索和分析引擎,提供蒐集、分析、存儲數據三大功能;是一套開放REST和JAVA API等結構提供高效搜索功能,可擴展的分佈式系統。它構建於Apache Lucene搜索引擎庫之上。shell
Logstash是一個用來蒐集、分析、過濾日誌的工具。它支持幾乎任何類型的日誌,包括系統日誌、錯誤日誌和自定義應用程序日誌。它能夠從許多來源接收日誌,這些來源包括 syslog、消息傳遞(例如 RabbitMQ)和JMX,它可以以多種方式輸出數據,包括電子郵件、websockets和Elasticsearch。
1
Kibana是一個基於Web的圖形界面,用於搜索、分析和可視化存儲在 Elasticsearch指標中的日誌數據。它利用Elasticsearch的REST接口來檢索數據,不只容許用戶建立他們本身的數據的定製儀表板視圖,還容許他們以特殊的方式查詢和過濾數據
總結就是Elasticsearch用於搜索,Kibana用於可視化,Logstash用於蒐集。下面咱們來基於Docker來搭建一下ELK系統,關於Docker的安裝及基本使用,前面的文章已經有過記錄了,此處再也不過多的介紹。另外,值得注意的是這三者之間的版本關係,(若是使用其餘版本的工具,則按照以下方式搭建可能會產生其餘問題):
docker pull elasticsearch:5.6.8
這裏須要將http.host配置成0.0.0.0的受權對象,並將配置寫入config目錄下的elasticsearch.yml配置文件中
# 在centos本地建立配置文件,並配置
mkdir -p /resources/elasticsearch/config # 建立config目錄
mkdir -p /resources/elasticsearch/data # 建立data目錄
# 將http.host配置爲0.0.0.0的受權對象,將配置寫入config目錄下的elasticsearch.yml配置文件中
echo "http.host: 0.0.0.0" >> /resources/elasticsearch/config/elasticsearch.yml
首先須要建立容器並開機運行(single-node表示單節點模式,後面會介紹集羣方式下elasticsearch的搭建),而後將elasticsearch容器設置爲開機自啓動。穿件es容器時的參數介紹以下:
# 建立容器並開機運行(single-node表示單節點模式,後面會介紹集羣方式下elasticsearch的搭建)
# 注意:在docker中\表示換行
docker run --name elasticsearch -p 9200:9200 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms256m -Xmx256m" \
-v /resources/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /resources/elasticsearch/data:/usr/share/elasticsearch/data -d elasticsearch:5.6.8
# 參數介紹:
# --name:爲容器起一個別名
# -p:將容器的運行端口映射到本地端口
# -e "discovery.type=single-node":表示單節點模式下建立,後文將介紹集羣模式的搭建
# -v:表示將容器中的配置文件和data文件映射到上文本地所建立的文件,方便後面的配置
# 將elasticsearch容器設置爲開機自啓動
docker update new-elasticsearch --restart=always
這樣一來,咱們便安裝好elasticsearch了,咱們可使用curl
命令來測試一下:
# 使用curl來訪問elasticsearch的運行端口
curl localhost:9200
# 運行輸出結果以下則成功安裝
{
"name" : "XwmNOpR",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "yB3VNHxmQzevk1vXUQTkcg",
"version" : {
"number" : "5.6.8",
"build_hash" : "688ecce",
"build_date" : "2018-02-16T16:46:30.010Z",
"build_snapshot" : false,
"lucene_version" : "6.6.1"
},
"tagline" : "You Know, for Search"
}
固然了,咱們也可使用瀏覽器來對其進行訪問,訪問方式爲http://[ip]:9200
,端口爲虛擬機ip,一樣能夠獲得對應的結果,另外若是使用的是Aliyun或騰訊雲服務器,則須要在控制檯中配置相應的安全組,不然沒法訪問
# Docker拉取Kibana鏡像
docker pull kibana:5.6.8
# 建立容器kibana容器,對應的參數如上,另外須要指定elasticsearch的地址
docker run --name kibana -e ELASTICSEARCH_URL=http://[ip]:9200 -p 5601:5601 \
-d kibana:5.6.8
# 配置開機自啓動
docker update new-kibana --restart=always
安裝完成以後,咱們即可curl一下kibana的地址,或在瀏覽器訪問http://[ip]:5601
便可獲得對應的輸出:
[root@iZm5eei156c9h3hrdjpe77Z ~]# curl localhost:5601
<script>var hashRoute = '/app/kibana';
var defaultRoute = '/app/kibana';
var hash = window.location.hash;
if (hash.length) {
window.location = hashRoute + hash;
} else {
window.location = defaultRoute;
}</script>[root@iZm5eei156c9h3hrdjpe77Z ~]#
# 拉取鏡像
docker pull logstash
在/resources/logstash中建立logstash.conf文件,並使用vim來對其進行編輯,配置的過程以下:
# 在/resources/logstash中建立logstash.conf文件,並使用vim來對其進行編輯
mkdir /resources/logstash
# 使用vim編輯
vim logstash.conf
# 配置文件內容以下,更換爲本身Elasticsearch的ip便可
input {
tcp {
port => 4560
codec => json_lines
}
}
output{
elasticsearch {
hosts => ["[ip]:9200"]
index => "applog"
}
stdout { codec => rubydebug }
}
# 建立容器,這裏須要指明Elasticsearch來進行連接
docker run -d -p 4560:4560 \
-v /resources/logstash/logstash.conf:/etc/logstash.conf \
--link elasticsearch:elasticsearch \
--name logstash logstash \
logstash -f /etc/logstash.conf
# 開機自啓動
docker update new-logstash --restart=always
以上即是Logstash的安裝過程,咱們能夠進入Logstash容器內來簡單的使用一下。
進入Logstash容器,並cd到bin目錄
docker exec -it logstash /bin/bash
cd /usr/share/logstash/bin
執行logstash命令,注意:須要這裏須要指定--path.data參數,不然在運行的過程會出錯
# 注意:須要這裏須要指定--path.data參數,不然在運行的過程會出錯
logstash -e 'input { stdin { } } output { stdout {} }' --path.data=/root/
運行以後,咱們在控制檯輸入hello world,即會出現如下結果
應用需求:在192.168.220.201主機中的es中並無info索引庫,而192.168.220.202中的es有info索引庫,此時咱們能夠嘗試藉助logstash來先將skuinfo索引庫從192.168.220.202導出成一個json文件,而後將該文件藉助logstash導入到192.168.220.201的es索引庫中。這樣的需求該如何實現呢?
建立一個臨時的文件夾,用於保存導出的數據以及配置文件,以後使用vim來建立一個export.conf配置文件,並對其進行配置
mkdir /resources/mydata/logstash_temp
vim export.conf
export.conf文件的配置內容以下
# 將192.168.220.202 Elasticsearch中info索引庫導出爲一個info.json文件
input{
elasticsearch {
hosts => ["192.168.220.202:9200"] # 指定Elasticsearch的地址,該地址中含有目標數據
index => "info" # 指定須要導出的索引庫
size => 200 # 指定每次導出數據每批次的大小,注意不能設置太大,不然會出錯
scroll => "5m"
docinfo => false
}
}
output{
file {
path => "info.json" # 指定保存的數據路徑和json文件的名稱
}
}
使用docker cp
命令將該導出的配置文件複製的logstash容器的bin目錄中
# 將export.conf文件cp到logstash容器中
docker cp ./export.conf logstash:/usr/share/logstash/bin
進入logstash容器,並執行配置文件,注意:務必要指定path.data屬性,否則會報錯
# 進入logstash,而後執行配置文件
docker exec -it logstash /bin/bash
cd /usr/share/logstash/bin
./logstash -f ./export.conf --path.data=/root/ # 務必要指定path.data屬性,否則會報錯
執行完成以後便會在當前目錄下產生一個info.json文件,咱們將該數據文件導出到centos中
# 執行完成以後就會在當前目錄下產生一個info.json文件,將該文件導出到centos中
docker cp logstash:/usr/share/logstash/bin/info.json /resources/mydata/
便可完成將索引庫中的數據導出成一個json文件,該文件存在於/resources/mydata/info.json
# 1. 將192.168.220.202中的info.json文件使用xftp工具導入到windows本地
# 2. 將該文件經過xftp工具導入到192.168.220.201 /resources/mydata/logstash_temp中
cd /mydata/mysources/logstash_temp
# 使用vim對import.conf進行配置
vim import.conf
# 讀取json文件
input {
file {
# 設置json文件路徑,多個文件路徑可設置成數組[],模糊匹配用*
path => "/root/info.json"
start_position => "beginning"
# 設置編碼
codec => json {charset => "UTF-8"}
# 當存在多個文件的時候可以使用type指定輸入輸出路徑
type => "json_index"
}
}
# 過濾格式化數據
filter {
mutate{
#刪除無效的字段
remove_field => ["@version","message","host","path"]
}
# 新增timestamp字段,將@timestamp時間增長8小時
ruby { code => "event.set('timestamp', event.get('@timestamp').time.localtime + 8*60*60)" }
}
# 數據輸出到ES
output {
#日誌輸出格式,json_lines;rubydebug等
stdout {
codec => rubydebug
}
#輸出到es
if[type] == "json_index"{
#沒法解析的json不記錄到elasticsearch中
if "_jsonparsefailure" not in [tags] {
elasticsearch {
#es地址ip端口
hosts => "192.168.220.201:9200"
# 配置數據轉入到es中的
index => "info"
#類型
document_type => "info"
}
}
}
}
# 將import.conf文件和info.json文件導入到logstash容器中
docker cp ./import.conf logstash:/usr/share/logstash/bin # 導入conf配置文件
docker cp ./skuinfo.json logstash:/root/ # 導入json數據文件,導入的路徑注意與conf配置文件中的配置路徑保持一致
# 進入到logstash容器中,並執行logstash命令完成數據的導入
docker exec -it logstash /bin/bash
cd /usr/share/logstash/bin
./logstash -f ./import.conf --path.data=/root/
等待執行完成以後訪問192.168.220.201:5601便可訪問到info索引庫中的數據
坑一:咱們安裝ik分詞器的時候,通常是在github中來下載zip文件,而後傳送到centos中,最後再上傳到elasticserch容器中,可是github中標明的版本與實際版本根本不相同。另外一方面,在咱們下載不一樣版本的elasticsearch時,有的版本容器運行會出錯,有些正常。因此咱們之後咱們搭建elk的時候就同一安裝5.6.8版本(必定要注意)
坑二:咱們通常在github上下載zip文件(不管什麼文件)的時候會很是很是的慢(不是通常的慢),因此咱們之後在使用github來下載的時候能夠藉助gitee(碼雲)來下載,在碼雲中建立一個倉庫的時候,選擇導入已有的倉庫,而後將原github的git鏈接複製粘貼上去,最後create。一旦建立,咱們就能夠藉助碼雲中來間接下載github倉庫的任何文件,且下載的速度會大大加快
具體安裝過程及代碼示例以下:
ik分詞器連接:https://gitee.com/tianxingjian123/elasticsearch-analysis-ik
# ik分詞器連接:https://gitee.com/tianxingjian123/elasticsearch-analysis-ik
# 下載5.6.8的ik分詞器以後,咱們須要使用maven將其打包
cd C:\Users\M\Desktop\code-demo\elasticsearch-analysis-ik
mvn package -Pdist,native -DskipTests -Dtar
# 使用maven打包完成以後,便可生成一個target文件夾,裏面有./releases/elasticsearch-analysis-ik-5.6.8.zip
# 在虛擬機中建立一個ik文件夾
mkdir ik
# 以後使用xftp將該zip文件上傳到ik文件夾中,而後使用unzip命令解壓該zip文件,解壓以後刪除zip文件
unzip elasticsearch-analysis-ik-5.6.8.zip
rm -rf elasticsearch-analysis-ik-5.6.8.zip
# 以後使用docker將該ik文件夾傳到elasticsearch容器的plugins中
docker cp ./ik elasticsearch:/usr/share/elasticsearch/plugins
# 進入elasticsearch容器
docker exec -it new-elasticsearch /bin/bash
# 以後以下命令可查看是否成功上傳ik文件夾
root@78f36ce60b3f:/usr/share/elasticsearch# cd plugins/
root@78f36ce60b3f:/usr/share/elasticsearch/plugins# ls
ik
root@78f36ce60b3f:/usr/share/elasticsearch/plugins# cd ik
root@78f36ce60b3f:/usr/share/elasticsearch/plugins/ik# ls
commons-codec-1.9.jar httpclient-4.5.2.jar
commons-logging-1.2.jar httpcore-4.4.4.jar
config plugin-descriptor.properties
elasticsearch-analysis-ik-5.6.8.jar
root@78f36ce60b3f:/usr/share/elasticsearch/plugins/ik#
# 以後進入到bin目錄下,並查看已經安裝的ik分詞器插件
root@78f36ce60b3f:cd /usr/share/elasticsearch/bin
root@78f36ce60b3f:/usr/share/elasticsearch/bin# elasticsearch-plugin list
ik
以上操做完成以後,就算是完成了在Elasticsearch中引入ik中文分詞器插件了,注意:以上步驟務必須要徹底一致,不然會形成各類大大小小的問題。
# 打開chrom瀏覽器,訪問:http://192.168.220.201:5601/,若出現kibana界面,說明kibana安裝正常
# 進入kibana的Dev Tools界面,而後使用以下測試ik中文分詞器插件是否正常安裝
GET bank/_analyze
{
"text": "如今是大年三十凌晨一點三十分,有點冷,我寫完這篇文章就睡覺!",
"analyzer": "ik_smart"
}
運行以後,測試ik中文分詞結果以下,可見已經完成了對中文句子的分詞
在每一次搭建的時候都須要注意要確保data目錄下爲空,不然在實際運行過程當中會出錯
mkdir /mydata
cd /mydata
mkdir elasticsearch1
cd elasticsearch1
mkdir data # 注意要確保data目錄下爲空,不然在實際運行過程當中會出錯
mkdir config
cd conf
vim elasticsearch.yml
# elasticsearch.yml文件配置信息以下
elasticsearch.yml文件的配置信息以下,注意須要配置一下幾點:
# 開啓跨域,爲了讓es-head能夠訪問,此處須要額外安裝header插件
http.cors.enabled: true
http.cors.allow-origin: "*"
# 集羣的名稱(同樣)
cluster.name: elasticsearch
# 節點的名稱(不同,根據別名來配置)
node.name: es1
# 指定該節點是否有資格被選舉成爲master節點,默認是true,es是默認集羣中的第一臺機器爲master,若是這臺機掛了就會從新選舉master
node.master: true
# 容許該節點存儲數據(默認開啓)
node.data: true
# 容許任何ip訪問
network.host: 0.0.0.0
# 經過這個ip列表進行節點發現,我這裏配置的是各個容器的ip
discovery.zen.ping.unicast.hosts: ["192.168.220.200:9300","192.168.220.200:9301","192.168.220.200:9302"]
#若是沒有這種設置,遭受網絡故障的集羣就有可能將集羣分紅兩個獨立的集羣 – 致使腦裂 - 這將致使數據丟失
discovery.zen.minimum_master_nodes: 2
第一個elasticsearch配置文件建立好後,同理建立其餘兩個節點
# 配置es2
cd /mydata
cp -r ./elasticsearch1 ./elasticsearch2
# 將其中的conf/elasticsearch.yml中配置修改一處信息
node.name=es2
# 配置es3
cd /mydata
cp -r ./elasticsearch1 ./elasticsearch3
# 將其中的conf/elasticsearch.yml中配置修改一處信息
node.name=es3
# 建立es1容器並啓動
docker run --name es1 -p 9200:9200 -p 9300:9300 \
-e ES_JAVA_OPTS="-Xms256m -Xmx256m" \
-v /mydata/elasticsearch1/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch1/data:/usr/share/elasticsearch/data -d elasticsearch:5.6.8
# 引入ik分詞器
docker cp ./ik es1:/usr/share/elasticsearch/plugins
# 建立es2容器並啓動
docker run --name es2 -p 9201:9200 -p 9301:9300 \
-e ES_JAVA_OPTS="-Xms256m -Xmx256m" \
-v /mydata/elasticsearch2/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch2/data:/usr/share/elasticsearch/data -d elasticsearch:5.6.8
# 建立es3容器並啓動
docker run --name es3 -p 9202:9200 -p 9302:9300 \
-e ES_JAVA_OPTS="-Xms256m -Xmx256m" \
-v /mydata/elasticsearch3/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch3/data:/usr/share/elasticsearch/data -d elasticsearch:5.6.8
至此,完成以上操做便可實現了Elasticsearch集羣的搭建
http://192.168.220.200:9200、http://192.168.220.200:920一、http://192.168.220.200:9202
,便可發現已經搭建完成,並顯示了各個es節點的對應信息。http://192.168.220.200:9200/_cat/nodes
可查看集羣節點。http://192.168.220.200:9200//_cat/health
查看健康情況(green,yellow、red)vim /etc/sysctl.conf
# 添加以下一條配置
vm.max_map_count=655360
# 退出後重啓配置
sysctl -p
運行以上命令以後,可能會發現當前可用配置只有50多,並且當咱們訪問http://192.168.220.200:9200的時候也會發現請求失敗這個時候咱們打開對應虛擬機的設置,將內存設置3GB便可,不一下子從新進入虛擬機,使用free -m命令便可發現此時內存還剩1000多可用
# 實例化以上三個es容器以後,查看當前可用內存
free -m
# 運行以上命令以後,可能會發現當前可用配置只有50多,並且當咱們訪問http://192.168.220.200:9200的時候也會發現請求失敗這個時候咱們打開對應虛擬機的設置,將內存設置3GB便可,不一下子從新進入虛擬機,使用free -m命令便可發現此時內存還剩1000多可用
# 完成上述配置以後,咱們重啓三個es容器
docker restart es1 es2 es3 || docker start es1 es2 es3
# 等待容器重啓以後,使用chrom瀏覽器訪問es
http://192.168.220.200:9200
http://192.168.220.200:9201
http://192.168.220.200:9202
# 可發現已經搭建完成,且顯示了各個es節點的對應信息
# 在kibana的dev tools下查看集羣節點
GET /_cat/nodes
# 查看健康情況(green,yellow、red)
GET /_cat/health