前言
ELK Stack 簡介
ELK 是三個開源軟件的縮寫,分別為:Elasticsearch钢颂、Logstash 以及 Kibana蜻韭,它們都是開源軟件蔑担。不過現(xiàn)在還新增了一個 Beats左电,它是一個輕量級的日志收集處理工具(Agent)廉侧,Beats 占用資源少,適合于在各個服務(wù)器上搜集日志后傳輸給 Logstash篓足,官方也推薦此工具段誊,目前由于原本的 ELK Stack 成員中加入了 Beats 工具所以已改名為 Elastic Stack。
Logstash 已經(jīng)逐漸被beats 替代了栈拖。按照官方說法:
Logstash adds powerful data parsing and transformation features, but usually isn’t required.
Elastic Stack 包含:
- Elasticsearch 是個開源分布式搜索引擎连舍,提供搜集、分析辱魁、存儲數(shù)據(jù)三大功能烟瞧。詳細(xì)可參考 Elasticsearch 權(quán)威指南
- Logstash 主要是用來日志的搜集诗鸭、分析染簇、過濾日志的工具,支持大量的數(shù)據(jù)獲取方式强岸。一般工作方式為 c/s 架構(gòu)锻弓,client 端安裝在需要收集日志的主機上,server 端負(fù)責(zé)將收到的各節(jié)點日志進行過濾蝌箍、修改等操作在一并發(fā)往 Elasticsearch 上去青灼。
- Kibana 也是一個開源和免費的工具,Kibana 可以為 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面妓盲,可以幫助匯總杂拨、分析和搜索重要數(shù)據(jù)日志。
- Beats 在這里是一個輕量級日志采集器悯衬,其實 Beats 家族有 6 個成員弹沽,早期的 ELK 架構(gòu)中使用 Logstash 收集、解析日志,但是 Logstash 對內(nèi)存策橘、cpu炸渡、io 等資源消耗比較高。相比 Logstash丽已,Beats 所占系統(tǒng)的 CPU 和內(nèi)存幾乎可以忽略不計蚌堵。
目前 Beats 包含六種工具:
- Packetbeat: 網(wǎng)絡(luò)數(shù)據(jù)(收集網(wǎng)絡(luò)流量數(shù)據(jù))
- Metricbeat: 指標(biāo)(收集系統(tǒng)、進程和文件系統(tǒng)級別的 CPU 和內(nèi)存使用情況等數(shù)據(jù))
- Filebeat: 日志文件(收集文件數(shù)據(jù))
- Winlogbeat: windows 事件日志(收集 Windows 事件日志數(shù)據(jù))
- Auditbeat:審計數(shù)據(jù)(收集審計日志)
- Heartbeat:運行時間監(jiān)控(收集系統(tǒng)運行時的數(shù)據(jù))
是什么沛婴?
Elasticsearch is a real-time, distributed storage, search, and analytics engine
Elasticsearch 是一個實時的分布式存儲吼畏、搜索、分析的引擎瘸味。
介紹那兒有幾個關(guān)鍵字:
- 實時
- 分布式
- 搜索
- 分析(通過聚合來實現(xiàn))
ES基于Apache Lucene(TM)的開源搜索引擎宫仗,是Lucene的集群版本。
為什么需要 Elasticsearch旁仿?
相對于傳統(tǒng)關(guān)系型數(shù)據(jù)庫藕夫,Elasticsearch的強大之處就是可以模糊查詢。
主要表現(xiàn)在 :
- Elasticsearch對模糊搜索非常擅長(搜索速度很快)
- 從Elasticsearch搜索到的數(shù)據(jù)可以根據(jù)評分過濾掉大部分的枯冈,只要返回評分高的給用戶就好了(原生就支持排序)
- 沒有那么準(zhǔn)確的關(guān)鍵字也能搜出相關(guān)的結(jié)果(能匹配有相關(guān)性的記錄)
Elasticsearch的術(shù)語
- Index:一個索引就是一個擁有相似特征的文檔的集合毅贮。相當(dāng)于數(shù)據(jù)庫的database 。
- Type:這個在新的Elasticsearch版本已經(jīng)廢除(在以前的Elasticsearch版本尘奏,一個Index下支持多個Type--有點類似于消息隊列一個topic下多個group的概念)
-
Document:ES是面向文檔(document oriented)的滩褥,這意味著它可以存儲整個對象或文檔(document)。然而它不僅僅是存儲炫加,還會索引(index)每個文檔的內(nèi)容使之可以被搜索瑰煎。在ES中,你可以對文檔(而非成行成列的數(shù)據(jù))進行索引俗孝、搜索酒甸、排序、過濾赋铝。
Document相當(dāng)于數(shù)據(jù)庫的一行記錄插勤。由于es存儲的數(shù)據(jù)是文檔型的,一條數(shù)據(jù)對應(yīng)一篇文檔即相當(dāng)于mysql數(shù)據(jù)庫中的一行數(shù)據(jù)row革骨, 一個文檔中可以有多個字段也就是mysql數(shù)據(jù)庫一行可以有多列农尖。一個文檔是一個可被索引的基礎(chǔ)信息單元。比如良哲,你可以擁有某一個客戶的文檔盛卡、某一個產(chǎn)品的一個文檔、某個訂單的一個文檔筑凫。文檔以JSON格式來表示滑沧,而JSON是一個到處存在的互聯(lián)網(wǎng)數(shù)據(jù)交互格式喇颁。 - Field:相當(dāng)于數(shù)據(jù)庫的Column的概念
- Mapping:相當(dāng)于數(shù)據(jù)庫的Schema的概念,定義 field 的類型嚎货。
- DSL:(Domain Specific Language特定領(lǐng)域語言)以JSON請求體的形式出現(xiàn)橘霎。 相當(dāng)于數(shù)據(jù)庫的SQL(給我們讀取Elasticsearch數(shù)據(jù)的API)
- shards and replicas:分片和復(fù)制
- segment:真實的寫入單位
- GET/PUT/POST/DELETE 分別類似與mysql中的select/update/delete
RDBMS(關(guān)系型數(shù)據(jù)庫) | ElasticSearch |
---|---|
Database | Index |
Row | Document |
Column | Field |
Schema | Mapping |
SQL | DSL |
相信大家看完上面的對比圖,對Elasticsearch的一些術(shù)語就不難理解了殖属。
一個Elasticsearch集群會有多個Elasticsearch節(jié)點姐叁,所謂節(jié)點實際上就是運行著Elasticsearch進程的機器。
在眾多的節(jié)點中洗显,其中會有一個Master Node
外潜,它主要負(fù)責(zé)維護索引元數(shù)據(jù)、負(fù)責(zé)切換主分片和副本分片身份等工作(后面會講到分片的概念)挠唆,如果主節(jié)點掛了处窥,會選舉出一個新的主節(jié)點。
Elasticsearch最外層的是Index(相當(dāng)于數(shù)據(jù)庫 表的概念)玄组;一個Index的數(shù)據(jù)我們可以分發(fā)到不同的Node上進行存儲滔驾,這個操作就叫做分片。
比如現(xiàn)在我集群里邊有4個節(jié)點俄讹,我現(xiàn)在有一個Index哆致,想將這個Index在4個節(jié)點上存儲,那我們可以設(shè)置為4個分片患膛。這4個分片的數(shù)據(jù)合起來就是Index的數(shù)據(jù)摊阀。
為什么要分片?原因也很簡單:
- 如果一個Index的數(shù)據(jù)量太大踪蹬,只有一個分片胞此,那只會在一個節(jié)點上存儲,隨著數(shù)據(jù)量的增長跃捣,一個節(jié)點未必能把一個Index存儲下來漱牵。
- 多個分片,在寫入或查詢的時候就可以并行操作(從各個節(jié)點中讀寫數(shù)據(jù)枝缔,提高吞吐量)
現(xiàn)在問題來了布疙,如果某個節(jié)點掛了蚊惯,那部分?jǐn)?shù)據(jù)就丟了嗎愿卸?顯然Elasticsearch也會想到這個問題,所以分片會有主分片和副本分片之分(為了實現(xiàn)高可用)
數(shù)據(jù)寫入的時候是寫到主分片截型,副本分片會復(fù)制主分片的數(shù)據(jù)趴荸,讀取的時候主分片和副本分片都可以讀。
Index需要分為多少個主分片和副本分片都是可以通過配置設(shè)置的
ES中節(jié)點的角色 Role
ES中節(jié)點分為四種類型:Node Roles
- 主節(jié)點 master節(jié)點
主要職責(zé)就是負(fù)責(zé)集群管理宦焦,如索引創(chuàng)建或刪除发钝,發(fā)現(xiàn)集群其它節(jié)點并確定那些分片分配到相應(yīng)的節(jié)點顿涣,默認(rèn)情況下任何一個節(jié)點都有可能被選舉為master節(jié)點,但是索引數(shù)據(jù)何搜索查詢等操作會占用大量CPU酝豪、內(nèi)存和IO資源涛碑,為了保證集群的穩(wěn)定,通常分離主節(jié)點和數(shù)據(jù)節(jié)點孵淘;
node.master: true
node.data: false
node.ingest: false
2)數(shù)據(jù)節(jié)點 data節(jié)點
數(shù)據(jù)節(jié)點主要是存儲索引數(shù)據(jù)蒲障,主要對文檔進行增刪改查操作,數(shù)據(jù)節(jié)點對CPU瘫证、內(nèi)存和IO要求較高揉阎;
node.master: false
node.data: true
node.ingest: false
3)負(fù)載均衡節(jié)點 client節(jié)點
當(dāng)一個節(jié)點既不配置為主節(jié)點也不配置為數(shù)據(jù)節(jié)點時,該節(jié)點只能處理路由請求背捌,處理搜索毙籽,分發(fā)索引操作;
node.master: false
node.data: false
node.ingest: false
4) 預(yù)處理節(jié)點 ingest節(jié)點
預(yù)處理節(jié)點在索引數(shù)據(jù)之前可以對數(shù)據(jù)做預(yù)處理毡庆,默認(rèn)所有的節(jié)點都支持ingest操作坑赡,但是也可以專門設(shè)置一個Ingest節(jié)點;
node.master: false
node.data: false
node.ingest: true
Elasticsearch更新和刪除
Elasticsearch的更新和刪除操作流程:
- 給對應(yīng)的
doc
記錄打上.del
標(biāo)識么抗,如果是刪除操作就打上delete
狀態(tài)垮衷,如果是更新操作就把原來的doc
標(biāo)志為delete
,然后重新新寫入一條數(shù)據(jù)
前面提到了乖坠,每隔1s會生成一個segement 文件搀突,那segement文件會越來越多越來越多。Elasticsearch會有一個merge任務(wù)熊泵,會將多個segement文件合并成一個segement文件仰迁。
在合并的過程中,會把帶有delete
狀態(tài)的doc
給物理刪除掉顽分。
Elasticsearch查詢
查詢我們最簡單的方式可以分為兩種:
- 根據(jù)ID查詢doc -- 類似傳統(tǒng)關(guān)系型數(shù)據(jù)庫
- 根據(jù)query(搜索詞)去查詢匹配的doc -- 這才是ES 的優(yōu)勢(全文檢索)
根據(jù)ID去查詢具體的doc的流程是:
- 檢索內(nèi)存的Translog文件
- 檢索硬盤的Translog文件
- 檢索硬盤的Segement文件
根據(jù)query去匹配doc的流程是:
- 同時去查詢內(nèi)存和硬盤的Segement文件
因為segement文件是每隔一秒才生成一次的
Elasticsearch查詢又分可以為三個階段:
- QUERY_AND_FETCH(查詢完就返回整個Doc內(nèi)容)
- QUERY_THEN_FETCH(先查詢出對應(yīng)的Doc id 徐许,然后再根據(jù)Doc id 匹配去對應(yīng)的文檔)
- DFS_QUERY_THEN_FETCH(先算分,再查詢)
- 「這里的分指的是 詞頻率和文檔的頻率(Term Frequency卒蘸、Document Frequency)眾所周知雌隅,出現(xiàn)頻率越高,相關(guān)性就更強」
一般我們用得最多的就是QUERY_THEN_FETCH缸沃,第一種查詢完就返回整個Doc內(nèi)容(QUERY_AND_FETCH)只適合于只需要查一個分片的請求恰起。
QUERY_THEN_FETCH總體的流程流程大概是:
- 客戶端請求發(fā)送到集群的某個節(jié)點上。集群上的每個節(jié)點都是coordinate node(協(xié)調(diào)節(jié)點)
- 然后協(xié)調(diào)節(jié)點將搜索的請求轉(zhuǎn)發(fā)到所有分片上(主分片和副本分片都行)
- 每個分片將自己搜索出的結(jié)果
(doc id)
返回給協(xié)調(diào)節(jié)點趾牧,由協(xié)調(diào)節(jié)點進行數(shù)據(jù)的合并检盼、排序、分頁等操作翘单,產(chǎn)出最終結(jié)果吨枉。 - 接著由協(xié)調(diào)節(jié)點根據(jù)
doc id
去各個節(jié)點上拉取實際的document
數(shù)據(jù)蹦渣,最終返回給客戶端。
Query Phase階段時節(jié)點做的事:
- 協(xié)調(diào)節(jié)點向目標(biāo)分片發(fā)送查詢的命令(轉(zhuǎn)發(fā)請求到主分片或者副本分片上)
- 數(shù)據(jù)節(jié)點(在每個分片內(nèi)做過濾貌亭、排序等等操作)柬唯,返回
doc id
給協(xié)調(diào)節(jié)點
Fetch Phase階段時節(jié)點做的是:
- 協(xié)調(diào)節(jié)點得到數(shù)據(jù)節(jié)點返回的
doc id
,對這些doc id
做聚合圃庭,然后將目標(biāo)數(shù)據(jù)分片發(fā)送抓取命令(希望拿到整個Doc記錄) - 數(shù)據(jù)節(jié)點按協(xié)調(diào)節(jié)點發(fā)送的
doc id
权逗,拉取實際需要的數(shù)據(jù)返回給協(xié)調(diào)節(jié)點
主流程我相信大家也不會太難理解,說白了就是:由于Elasticsearch是分布式的冤议,所以需要從各個節(jié)點都拉取對應(yīng)的數(shù)據(jù)斟薇,然后最終統(tǒng)一合成給客戶端
安裝
測試環(huán)境:VirtualBox,ubuntu16 虛機
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt-get install apt-transport-https
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list
sudo apt-get update && sudo apt-get install elasticsearch
當(dāng)前安裝的版本是7.9
Linux 源碼方式
從官網(wǎng)下載linux源碼包 https://www.elastic.co/downloads/elasticsearch
curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.2-linux-x86_64.tar.gz
tar -xzvf elasticsearch-7.9.2-linux-x86_64.tar.gz
cd elasticsearch-7.9.2
./bin/elasticsearch
配置
The config directory location defaults to /etc/elasticsearch
.
Elasticsearch has three configuration files:
-
elasticsearch.yml
for configuring Elasticsearch -
jvm.options
for configuring Elasticsearch JVM settings -
log4j2.properties
for configuring Elasticsearch logging