文檔
- elasticsearch是面向文檔的剪芍,文檔是所有可搜索數(shù)據(jù)的最小單位
- 日志文件中的日志項
- 一本電影的具體信息/一張唱片的詳細(xì)信息
- mp3播放器里面的一首歌/一篇pdf文檔中的具體內(nèi)容
- 文檔會被序列化成json格式,保存在elasticsearch中
- json對象由字段組成
- 每個字段都有對應(yīng)的字段類型(字符串睬辐,數(shù)值疗垛,布爾,日期硫朦,二進(jìn)制贷腕,范圍類型)
- 每個文檔都有一個unique id
- 你可以自己制定id
- 或者通過elasticsearch自動生成
json文檔
json文檔
- 一篇文檔包含了一系列的字段,類似數(shù)據(jù)庫中的一條記錄
- json文檔咬展,格式靈活泽裳,不需要預(yù)先定義格式
- 字段的類型可以指定或者通過elasticsearch自動推算
- 支持?jǐn)?shù)組,支持嵌套
上篇通過csv文件裝換的數(shù)據(jù)
{
"@version" => "1",
"id" => "177939",
"genre" => [
[0] "Animation",
[1] "Romance"
],
"year" => 2017,
"title" => "The Night Is Short, Walk on Girl"
}
文檔的元數(shù)據(jù)
文檔的元數(shù)據(jù)
- 元數(shù)據(jù)破婆,用于標(biāo)注文檔的相關(guān)信息
- _index 文檔所屬的索引名
- _type 文檔所屬的類型名
- _id 文檔唯一id
- _source 文檔的原始json數(shù)據(jù)
- _all 整合所有字段內(nèi)容到該字段涮总,已被廢除
- _version 文檔的版本信息
- _score 相關(guān)性打分
索引
索引
- index 索引是文檔的容器,是一類文檔的結(jié)合
- index提現(xiàn)了邏輯空間的概念:每個索引都有自己的mapping定義祷舀,用戶定義包含的文檔的字段名和字段類型
- shard體現(xiàn)了物理空間的概念:索引中的數(shù)據(jù)分散在shard上
- 索引的mapping和settings
- mapping定義文檔字段的類型
- setting定義不同的數(shù)據(jù)分布
索引的不同語義
elasticsearch集群中
- 名詞 一個elasticsearch集群中瀑梗,可以創(chuàng)建很多個不同的索引
- 動詞 保存一個文檔到elasticsearch中的過程也叫索引
- 名詞 一個b樹索引烹笔,一個倒排索引
type
- 7.0之前,一個index可以設(shè)置多個types
- 6.0開始抛丽,type已經(jīng)被拋棄谤职,7.0開始,一個索引只能創(chuàng)建一個type亿鲜,_doc
- 傳統(tǒng)關(guān)系型數(shù)據(jù)庫和elasticsearch的區(qū)別
- elasticsearch - schemaless/相關(guān)性/高性能全文搜索
- rdms - 事務(wù)性/join
抽象和類比
rdbms(關(guān)系型數(shù)據(jù)庫) | elasticsearch |
---|---|
table | index(type) |
row | document |
column | filed |
schema | mapping |
sql | dsl |
提供了rest-api 容易被各種語言調(diào)用
rest-api
一些基本的api
- indeces
- 創(chuàng)建index
- put movies
- 查看所有的index
- _cat/indices
- 創(chuàng)建index
kibana應(yīng)用
kibana應(yīng)用-索引管理
index相關(guān)api
#查看索引相關(guān)信息
GET kibana_sample_data_ecommerce
#查看索引的文檔總數(shù)
GET kibana_sample_data_ecommerce/_count
#查看前10條文檔允蜈,了解文檔格式
POST kibana_sample_data_ecommerce/_search
{
}
#_cat indices API
#查看indices
GET /_cat/indices/kibana*?v&s=index
#查看狀態(tài)為綠的索引
GET /_cat/indices?v&health=green
#按照文檔個數(shù)排序
GET /_cat/indices?v&s=docs.count:desc
#查看具體的字段
GET /_cat/indices/kibana*?pri&v&h=health,index,pri,rep,docs.count,mt
#How much memory is used per index?
GET /_cat/indices?v&h=i,tm&s=tm:desc
節(jié)點,集群蒿柳,分片以及副本
分布式系統(tǒng)的可用性和拓展性
- 高可用性
- 服務(wù)可用性 - 允許有節(jié)點停止服務(wù)
- 數(shù)據(jù)可用性 - 部分節(jié)點丟失饶套,不會丟失數(shù)據(jù)
- 可拓展性
- 請求量提升,數(shù)據(jù)的不斷增長(將數(shù)據(jù)分布到所有節(jié)點上)
分布式特性
- elasticsearch的分布式架構(gòu)的好處
- 存儲的水平擴容
- 提高系統(tǒng)的可用性垒探,部分節(jié)點停止服務(wù)妓蛮,整個集群的服務(wù)不受影響
- elasticsearch的分布式架構(gòu)
- 不同集群通過不同的名字區(qū)分,默認(rèn)名字“elasticsearch”
- 通過配置文件修改叛复,或者在命令行中 -E cluster.name=cutie進(jìn)行設(shè)定
- 一個集群可以有一個或者多個節(jié)點
節(jié)點
- 節(jié)點是一個elasticsearch的實例
- 本質(zhì)上是一個java進(jìn)程
- 一臺機器上可以運行多個elasticsearch進(jìn)程仔引,但是生產(chǎn)環(huán)境一般建議一臺機器上只運行一個elasticsearch實例
- 每一個節(jié)點都有名字,通過配置文件配置褐奥,或者啟動的時候 -E node.name=node1指定
- 每一個節(jié)點在啟動之后會分配一個uid咖耘,保存在data目錄下
master-eligible nodes 和 master node
- 每個節(jié)點啟動后,默認(rèn)就是一個master eligible節(jié)點
- 可以設(shè)置node.master:false禁止
- master-eligible節(jié)點可以參加選主流程撬码,成為master節(jié)點
- 當(dāng)?shù)匾粋€節(jié)點啟動的時候儿倒,它會將自己選舉成master節(jié)點
- 每個節(jié)點上都保存了集群的狀態(tài),只有master節(jié)點才能修改集群的狀態(tài)信息
- 集群狀態(tài)(cluster state)呜笑,維護了一個集群中必要的信息
- 所有的節(jié)點信息
- 所有的索引和與其相關(guān)的mapping和setting信息
- 分片的路由信息
- 任意加點都能修改信息會導(dǎo)致數(shù)據(jù)的不一致性
- 集群狀態(tài)(cluster state)呜笑,維護了一個集群中必要的信息
data node (數(shù)據(jù))和 coordinating node (協(xié)調(diào))
- data node
- 可以保存數(shù)據(jù)的節(jié)點夫否,叫做data node,負(fù)責(zé)保存分片數(shù)據(jù)叫胁。在數(shù)據(jù)拓展起到了至關(guān)重要的作用
- coordinating node
- 負(fù)責(zé)接受client的請求凰慈,將請求分發(fā)到合適的節(jié)點,最終把結(jié)果匯集到一起
- 每個節(jié)點默認(rèn)都起到了coordinating node的職責(zé)
其他的節(jié)點類型
- hot & warm node (冷熱節(jié)點)
- 不同硬件配置的data node驼鹅,用來實現(xiàn)hot & warm 架構(gòu)微谓,降低集群成本
- machine learning node
- 負(fù)責(zé)跑機器學(xué)習(xí)的job,用來做異常檢測
- tribe node
- 5.3開始使用corss cluster search输钩,tribe node 鏈接到不同的elasticsearch集群豺型,并且支持將這些集群當(dāng)成一個單獨的集群處理
配置節(jié)點類型
在elasticsearch.yml中配置
-
開發(fā)環(huán)境
中一個節(jié)點可以承擔(dān)多種角色 -
生產(chǎn)環(huán)境中
應(yīng)該設(shè)置單一的角色的節(jié)點(dedicated node)
節(jié)點類型 | 配置參數(shù) | 默認(rèn)值 |
---|---|---|
master eligible | node.master | true |
data | node.data | true |
ingest | node.ingest | true |
coordinating onlu | 無 | 每個節(jié)點默認(rèn)都是coordinating節(jié)點,設(shè)置其他類型全部為false |
machine learning | node.ml | true(需要enable x-pack) |
分片(primary shard & replica shard)
- 主分片买乃,用戶解決數(shù)據(jù)水平拓展的問題姻氨。通過主分片,可以將數(shù)據(jù)分布到集群內(nèi)的所有節(jié)點之上
- 一個分片是一個運行的lucene實例
- 主分片數(shù)在索引創(chuàng)建時指定剪验,后續(xù)不允許修改肴焊,除非reindex
- 副本前联,用以解決數(shù)據(jù)高可用的問題。分片是主分片的拷貝
- 副本分片數(shù)可以動態(tài)調(diào)整
- 增加副本數(shù)抖韩,還可以在一定程度上提高服務(wù)的可用性(讀取的吞吐)
- 一個三節(jié)點的集群中蛀恩,blogs索引的分片分部情況
- 思考:增加一個節(jié)點活改大主分片數(shù)對系統(tǒng)的影響?
分片示例
分片的設(shè)定
- 對于生產(chǎn)環(huán)境中分片的設(shè)定茂浮,需要提前做好容量規(guī)劃
- 分片數(shù)設(shè)置過小
- 導(dǎo)致后續(xù)無法增加節(jié)點實現(xiàn)水平拓展
- 單個分片的數(shù)據(jù)量太大双谆,導(dǎo)致數(shù)據(jù)重新分配耗時
- 分票數(shù)設(shè)置過大,7.0開始席揽,默認(rèn)主分片設(shè)置為1顽馋,解決了over-sharding的問題
- 影響搜索結(jié)果的相關(guān)性打分,影響統(tǒng)計結(jié)果的準(zhǔn)確性
- 單個節(jié)點上過多的分片幌羞,會導(dǎo)致資源的浪費寸谜,同時也會影響性能
查看集群的健康狀況
健康狀態(tài)
- green - 主分片和副本都正常分配
- yellow - 主分片全部正常分配,有副本分片未能正常分配
- red - 有主分片未能分配
- 如:服務(wù)器的磁盤容量超過85%時属桦,去創(chuàng)建了一個新的索引
demo
get _cluster/health
get _cat/nodes
get _cat/shards
get _cat/nodes?v
GET /_nodes/es7_01,es7_02
GET /_cat/nodes?v
GET /_cat/nodes?v&h=id,ip,port,v,m
GET _cluster/health
GET _cluster/health?level=shards
GET /_cluster/health/kibana_sample_data_ecommerce,kibana_sample_data_flights
GET /_cluster/health/kibana_sample_data_flights?level=shards
#### cluster state
The cluster state API allows access to metadata representing the state of the whole cluster. This includes information such as
GET /_cluster/state
#cluster get settings
GET /_cluster/settings
GET /_cluster/settings?include_defaults=true
GET _cat/shards
GET _cat/shards?h=index,shard,prirep,state,unassigned.reason