ElasticSearch 底層讀寫原理
? 寫請求是寫入 primary shard,然后同步給所有的 replica shard;讀請求可以從 primary shard 或 replica shard 讀取,采用的是隨機(jī)輪詢算法。
1、ES寫入數(shù)據(jù)的過程
1.選擇任意一個(gè)DataNode發(fā)送請求,例如:node2。此時(shí),node2就成為一個(gè)coordinating node(協(xié)調(diào)節(jié)點(diǎn))
2.計(jì)算得到文檔要寫入的分片 shard = hash(routing) % number_of_primary_shards
routing 是一個(gè)可變值,默認(rèn)是文檔的 _id
3.coordinating node會進(jìn)行路由,將請求轉(zhuǎn)發(fā)給對應(yīng)的primary shard所在的DataNode(假設(shè)primary shard在node1、replica shard在node2)
4.node1節(jié)點(diǎn)上的Primary Shard處理請求,寫入數(shù)據(jù)到索引庫中,并將數(shù)據(jù)同步到Replica shard
5.Primary Shard和Replica Shard都保存好了文檔,返回client.
注意:es路由分片規(guī)則是 shard = hash(routing) % number_of_primary_shards,其中number_of_primary_shards為分片數(shù)。
2、ES讀取數(shù)據(jù)的過程
2.1根據(jù)id查詢數(shù)據(jù)的過程
根據(jù) doc id 進(jìn)行 hash,判斷出來當(dāng)時(shí)把 doc id 分配到了哪個(gè) shard 上面去,從那個(gè) shard 去查詢。
- 客戶端發(fā)送請求到任意一個(gè) node,成為 coordinate node 。
- coordinate node 對 doc id 進(jìn)行哈希路由,將請求轉(zhuǎn)發(fā)到對應(yīng)的 node,此時(shí)會使用 round-robin 隨機(jī)輪詢算法,在 primary shard 以及其所有 replica 中隨機(jī)選擇一個(gè),讓讀請求負(fù)載均衡。
- 接收請求的 node 返回 document 給 coordinate node 。
- coordinate node 返回 document 給客戶端。
2.2根據(jù)關(guān)鍵詞查詢數(shù)據(jù)的過程
- 客戶端發(fā)送請求到一個(gè) coordinate node 。
- 協(xié)調(diào)節(jié)點(diǎn)將搜索請求轉(zhuǎn)發(fā)到所有的 shard 對應(yīng)的 primary shard 或 replica shard ,都可以。
- query phase:每個(gè) shard 將自己的搜索結(jié)果返回給協(xié)調(diào)節(jié)點(diǎn),由協(xié)調(diào)節(jié)點(diǎn)進(jìn)行數(shù)據(jù)的合并、排序、分頁等操作,產(chǎn)出最終結(jié)果。
- fetch phase:接著由協(xié)調(diào)節(jié)點(diǎn)根據(jù) doc id 去各個(gè)節(jié)點(diǎn)上拉取實(shí)際的 document 數(shù)據(jù),最終返回給客戶端。
3、寫數(shù)據(jù)底層原理
核心概念
segment file: 存儲倒排索引的文件,每個(gè)segment本質(zhì)上就是一個(gè)倒排索引,每秒都會生成一個(gè)segment文件,當(dāng)文件過多時(shí)es會自動進(jìn)行segment merge(合并文件),合并時(shí)會同時(shí)將已經(jīng)標(biāo)注刪除的文檔物理刪除。
commit point: 記錄當(dāng)前所有可用的segment,每個(gè)commit point都會維護(hù)一個(gè).del文件,即每個(gè).del文件都有一個(gè)commit point文件(es刪除數(shù)據(jù)本質(zhì)是不屬于物理刪除),當(dāng)es做刪改操作時(shí)首先會在.del文件中聲明某個(gè)document已經(jīng)被刪除,文件內(nèi)記錄了在某個(gè)segment內(nèi)某個(gè)文檔已經(jīng)被刪除,當(dāng)查詢請求過來時(shí)在segment中被刪除的文件是能夠查出來的,但是當(dāng)返回結(jié)果時(shí)會根據(jù)commit point維護(hù)的那個(gè).del文件把已經(jīng)刪除的文檔過濾掉
translog日志文件: 為了防止elasticsearch宕機(jī)造成數(shù)據(jù)丟失保證可靠存儲,es會將每次寫入數(shù)據(jù)同時(shí)寫到translog日志中。
**os cache:**操作系統(tǒng)里面,磁盤文件其實(shí)都有一個(gè)東西,叫做os cache,操作系統(tǒng)緩存,就是說數(shù)據(jù)寫入磁盤文件之前,會先進(jìn)入os cache,先進(jìn)入操作系統(tǒng)級別的一個(gè)內(nèi)存緩存中去。
Refresh
- 將文檔先保存在Index buffer中,以refresh_interval為間隔時(shí)間,定期清空buffer,生成 segment,借助文件系統(tǒng)緩存的特性,先將segment放在文件系統(tǒng)緩存中,并開放查詢,以提升搜索的實(shí)時(shí)性
Translog文章來源:http://www.zghlxwxcb.cn/news/detail-848755.html
- Segment沒有寫入磁盤,即便發(fā)生了宕機(jī),重啟后,數(shù)據(jù)也能恢復(fù),從ES6.0開始默認(rèn)配置是每次請求都會落盤
Flush文章來源地址http://www.zghlxwxcb.cn/news/detail-848755.html
- 刪除舊的translog 文件
- 生成Segment并寫入磁盤│更新commit point并寫入磁盤。ES自動完成,可優(yōu)化點(diǎn)不多
到了這里,關(guān)于ElasticSearch 底層讀寫原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!