ElasticSearch
elasticsearch簡介
elasticsearch是一個基于Lucene庫的分布式凌唬,支持多租戶的全文搜索引擎并齐,也是數(shù)據(jù)分析引擎。
elasticsearch是由java開發(fā)實現(xiàn)的客税。
elasticsearch提供了REST接口和JSON文檔况褪,可以被任何編程語言調(diào)用
elasticsearch可以進行近實時搜索和分析任何類型的數(shù)據(jù),無論是結(jié)構(gòu)化數(shù)據(jù)更耻,半結(jié)構(gòu)化數(shù)據(jù)测垛,非結(jié)構(gòu)化數(shù)據(jù)。elasticsearch都可以高效地進行存儲和快速搜索秧均。
高性能食侮,高可用(數(shù)據(jù),服務(wù))目胡,可水平擴展锯七,易用
支持不同節(jié)點類型
elasticsearch的應(yīng)用場景
在應(yīng)用程序或網(wǎng)站上添加搜索功能
存儲和分析日志、指標和安全事件數(shù)據(jù)
使用機器學習來實時自動建模數(shù)據(jù)的行為
使用Elasticsearch作為存儲引擎來自動化業(yè)務(wù)工作流
使用Elasticsearch作為地理信息系統(tǒng)(GIS)管理誉己、集成和分析空間信息
使用Elasticsearch作為生物信息學研究工具存儲和處理遺傳數(shù)據(jù)
elasticsearch家族
elasticsearch的生態(tài)圈
logstash和beats
用于數(shù)據(jù)抓取elasticsearch
用于數(shù)據(jù)的存儲起胰,分析,計算kibana
用于數(shù)據(jù)可視化x-pack
主要是商業(yè)用途巫延,如安全效五,監(jiān)控,告警炉峰,圖查詢畏妖,機器學習等。
logstash
簡介
開源的服務(wù)端數(shù)據(jù)處理管道疼阔,支持從不同來源采集數(shù)據(jù)戒劫,轉(zhuǎn)換數(shù)據(jù),并將數(shù)據(jù)發(fā)送到不同的存儲庫中婆廊。
最初用于日志的采集和處理迅细。
特性
實時解析和轉(zhuǎn)換數(shù)據(jù)
-
可擴展
- 支持200多個插件(日志,數(shù)據(jù)庫淘邻,Arcsigh茵典,Netflow)
-
可靠性,安全性
logstash會通過持久化隊列來保證至少將運行中的事件送達一次
數(shù)據(jù)傳輸加密
監(jiān)控
kibana
簡介
Kiwi fruit + Banana
數(shù)據(jù)可視化工具宾舅,幫助用戶解開對數(shù)據(jù)的任何疑問
基于Logstash的工具
Beats層主要負責收集數(shù)據(jù)统阿,可以直接存儲到elastic search彩倚,也可以交給logstash進行解析過濾等處理操作,再存儲到elastic search扶平,elasticsearch就是存儲引擎帆离,提供api用于搜索數(shù)據(jù),分析數(shù)據(jù)等操作结澄,kibana與elasticsearch進行可視化交互哥谷。
elasticsearch的基本概念
Document
elasticsearch是面向document的,document是一個可被索引的基礎(chǔ)信息單元
-
document會被序列化成json格式麻献,保存在elasticsearch中
json對象由字段(field)組成
每個字段都有對應(yīng)的字段類型们妥,如:字符串/數(shù)值/布爾/日期/二進制/范圍類型
json文檔,格式靈活赎瑰,不需要預(yù)先定義格式
字段類型可以指定或者通過elasticsearch自動推算
支持數(shù)據(jù)王悍,支持嵌套json
-
每個document都有一個unique id
可以自己指定id
elasticsearch自動生成
Document MetaData
"_index" : "movies",
"_type" : "_doc",
"_id" : "37475",
"_score" : 1.0,
"_source" : {
"genre" : [
"Drama"
],
"id" : "37475",
"year" : 2005,
"title" : "Unfinished Life, An",
"@version" : "1"
}
}
document metaData主要用于標注文檔的相關(guān)信息
_index: document所屬的index
_type: document所屬的type破镰,現(xiàn)基本都為
_doc
_id: document unique id
_source: json文檔內(nèi)容
@version: document version
_score: 相關(guān)性打分
Index
index是document的容器餐曼,是一類document的結(jié)合
每個索引都有自己的mapping定義,用于定義包含的文檔的字段名和字段類型
索引中的數(shù)據(jù)分散在Shard上鲜漩,可以通過setting定義不同的數(shù)據(jù)分布
// index settings
{
"settings":
{
"index":
{
"creation_date": "1624690171977",
"number_of_shards": "1",
"number_of_replicas": "1",
"uuid": "HqFyAwvOQ8Ctfwy7Cbwz-A",
"version":
{
"created": "7090299"
},
"provided_name": "movies"
}
}
}
// index mapping
{
"mappings": {
"_doc": {
"properties": {
"@version": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"genre": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"id": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"year": {
"type": "long"
}
}
}
}
}
Type
在一個索引中源譬,你可以定義一種或多種類型。一個類型是你的索引的一個邏輯上的分類/分區(qū)孕似,其語義完全由你來定踩娘。通常,會為具有一組相同字段的文檔定義一個類型喉祭。比如說养渴,我們假設(shè)你運營一個博客平臺 并且將你所有的數(shù)據(jù)存儲到一個索引中。在這個索引中泛烙,你可以為用戶數(shù)據(jù)定義一個類型理卑,為博客數(shù)據(jù)定義另一個類型,當然蔽氨,也可以為評論數(shù)據(jù)定義另一個類型藐唠。
需要注意的是:
在7.0之前,一個index可以設(shè)置多個types
6.0開始鹉究,Type已經(jīng)被Deprecated宇立。7.0開始,一個索引只能創(chuàng)建一個Type -
_doc
8.0將會被徹底被廢棄
Cluster
一個elasticsearch集群就是由一個或多個節(jié)點組織在一起自赔, 它們共同持有你全部的數(shù)據(jù)妈嘹, 并一起提供索引和搜索功能。
一個集群由一個唯一的名字標識绍妨, 這個名字默認就是“elasticsearch”蟋滴。 不同的集群通過不同的名字來區(qū)分染厅,可以通過配置文件修改,也可以在啟動命令行中加上
-E cluster.name=es_demo
進行指定津函。-
保證了系統(tǒng)的高可用性
服務(wù)高可用:允許有節(jié)點停止服務(wù)
數(shù)據(jù)高可用:部分節(jié)點丟失肖粮,也不會丟失數(shù)據(jù)
-
擴展性
請求量/數(shù)據(jù)的不斷增長(將數(shù)據(jù)分布到所有節(jié)點上)
水平擴展,增加節(jié)點尔苦,節(jié)點可以通過指定某個集群的名字涩馆,來加入這個集群
-
集群的狀態(tài):
Green
- Shard & Replica都正常分配Yellow
- Shard全部正常分配,Replica未能正常分配允坚。Red
- 有Shard未能正常分配魂那,例如當服務(wù)器的磁盤容量超過了85%時,去創(chuàng)建了一個新的索引稠项。
# 查看集群狀態(tài)
curl -i http://192.168.0.41:9200/_cluster/health
"cluster_name": "es_demo",
"status": "yellow",
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 7,
"active_shards": 7,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 1,
"delayed_unassigned_shards": 0,
"number_of_pending_tasks": 0,
"number_of_in_flight_fetch": 0,
"task_max_waiting_in_queue_millis": 0,
"active_shards_percent_as_number": 87.5
}
Node
節(jié)點是一個elasticsearch實例涯雅,其本質(zhì)也是一個java進程,一臺服務(wù)器上可以運行多個elasticsearch進程展运,通過修改port活逆,可以實現(xiàn),但是生產(chǎn)環(huán)境一般建議一臺機器上只運行一個elasticsearch實例拗胜。
每個節(jié)點都有名字蔗候,通過配置文件配置,或者啟動的時候在命令行中加上
-E node.name=node1
指定每個節(jié)點在啟動后埂软,會分配一個unique id,保存在data目錄下锈遥。
-
節(jié)點的分類有很多,不同的節(jié)點類型都有著不同的作用勘畔。
master node & master-eligible node
data node & coordinating node
Hot & warm node
machine learning node
tribe node
開發(fā)環(huán)境中一個節(jié)點可以承擔多個角色所灸,但是在生產(chǎn)環(huán)境中,應(yīng)該設(shè)置單一的角色節(jié)點(dedicated node)
節(jié)點類型 | 配置參數(shù) | 默認值 |
---|---|---|
master-eligible node | node.master | true |
data node | node.data | true |
ingest | node.ingest | true |
coordinating only | 無 | 每個節(jié)點默認都是coordinating node炫七。設(shè)置其他類型全部為false爬立。 |
machine learning | node.ml | true(enable x-pack) |
Master Node & Master-eligible Nodes
每個節(jié)點啟動后,默認就是一個master eligible node诉字∨吵ⅲ可以通過配置文件設(shè)置
node.master: false
禁止。master eligible node 可以參加選主流程壤圃,成為master node陵霉。
當?shù)谝粋€節(jié)點啟動的時候,它會將自己選舉成master node伍绳。
-
每個node上都保存了集群的狀態(tài)踊挠,只有master node才能修改集群的狀態(tài)信息
-
cluster state,維護了一個集群中的必要信息
所有的node信息
所有的索引和其相關(guān)的mapping與setting信息
分片的路由信息
任意節(jié)點都能修改信息會導(dǎo)致數(shù)據(jù)的不一致性
-
Data Node & Coordinating Node
可以保存數(shù)據(jù)的節(jié)點,叫做data node效床。負責保存分片數(shù)據(jù)睹酌,在數(shù)據(jù)擴展上起到了至關(guān)重要的作用。
Coordinating node負責接受client的請求剩檀,將請求分發(fā)到合適的節(jié)點憋沿,最終把結(jié)果匯集到一起。
每個節(jié)點默認都起到了coordinating node的職責沪猴。
Hot & Warm Node
- 不同硬件配置的data node辐啄,可以用來實現(xiàn)hot & warm架構(gòu),降低集群部署的成本运嗜。
Machine Learning Node
- 負責跑ml的job壶辜,用來做異常檢測。
Tribe Node
- Tribe node 連接到不同的es集群担租,并且支持將這個集群當成一個獨立的集群處理砸民。
Shard & Replica
-
Shard,用于解決數(shù)據(jù)水平擴展的問題奋救。通過分片岭参,可以將數(shù)據(jù)分布到集群內(nèi)的所有節(jié)點上。
一個分片是一個運行的lucene的實例
分片數(shù)在索引創(chuàng)建的時候通過
number_of_shards
指定菠镇,后續(xù)不允許修改冗荸,除非reindex
-
Replica承璃,用于解決數(shù)據(jù)高可用的問題利耍,是分片的拷貝。
Replica數(shù)可以動態(tài)調(diào)整盔粹,通過
number_of_replicas
指定增加replica隘梨,還可以在一定程度上提高服務(wù)的高可用性。
-
對于生產(chǎn)環(huán)境中的分片的設(shè)定舷嗡,需要提前做好容量規(guī)劃
-
分片數(shù)設(shè)置的過小
導(dǎo)致后續(xù)無法增加節(jié)點實現(xiàn)水平擴展
單個分片的數(shù)據(jù)量太大轴猎,導(dǎo)致數(shù)據(jù)重新分配耗時。
-
分片數(shù)設(shè)置的過大进萄,默認主分片設(shè)置成1捻脖,解決了over-sharding的問題
影響搜索結(jié)果的相關(guān)性打分,影響統(tǒng)計結(jié)果的準確性中鼠。
單個節(jié)點上過多的分片可婶,會導(dǎo)致資源的浪費,同時也會影響性能援雇。
-
elasticsearch vs rdbms
RDBMS | ElasticSearch |
---|---|
Table | Index |
Row | Document |
Column | Field |
Schema | Mapping |
SQL | DSL |
elasticsearch高性能的全文檢索矛渴,不支持事務(wù),不支持JOIN