一、ElasticSearch 寫數(shù)據(jù)的總體流程:
(1)ES 客戶端選擇一個節(jié)點 node 發(fā)送請求過去,這個節(jié)點就是協(xié)調(diào)節(jié)點 coordinating node?
(2)協(xié)調(diào)節(jié)點對 document 進行路由,通過 hash 算法計算出數(shù)據(jù)應(yīng)該落在哪個分片?shard 上,然后根據(jù)節(jié)點上維護的 shard 信息,將請求轉(zhuǎn)發(fā)到對應(yīng)的實際處理節(jié)點node上
shard = hash(document_id) % (num_of_primary_shards),
(3)實際的節(jié)點上的?primary shard 主分片處理請求,然后將數(shù)據(jù)同步到副本節(jié)點?replica node?
(4)coordinating node 等到?primary node 和所有 replica node 都執(zhí)行成功之后,就返回響應(yīng)結(jié)果給客戶端。
二、ES 的主分片寫數(shù)據(jù)的詳細流程:
1、refresh 操作:
????????primary shard 主分片先將數(shù)據(jù)寫入 memory buffer,然后定時(默認每隔1s)將?memory buffer 中的數(shù)據(jù)寫入一個新的 segment 文件中,并進入?Filesystem cache(同時清空 memory buffer),這個過程就叫做 refresh;每個 Segment 文件實際上是一些倒排索引的集合, 只有經(jīng)歷了 refresh 操作之后,這些數(shù)據(jù)才能變成可檢索的。
ES 的近實時性:當數(shù)據(jù)存在 memory?buffer 時是搜索不到的,只有數(shù)據(jù)被 refresh 到??Filesystem cache 之后才能被搜索到,而 refresh 是每秒一次,?所以稱 es 是近實時的,或者可以通過手動調(diào)用?es 的 api 觸發(fā)一次 refresh 操作,讓數(shù)據(jù)馬上可以被搜索到;
? ? ? ? ?上文講到的?memory buffer,也稱為 Indexing Buffer,這個區(qū)域默認的內(nèi)存大小是?10% heap size。
2、寫 translog 事務(wù)日志文件:
????????由于?memory?Buffer 和 Filesystem Cache 都是基于內(nèi)存,假設(shè)服務(wù)器宕機,那么數(shù)據(jù)就會丟失,所以 ES 通過 translog 日志文件來保證數(shù)據(jù)的可靠性,在數(shù)據(jù)寫入?memory buffer 的同時,將數(shù)據(jù)寫入 translog 日志文件中,在機器宕機重啟時,es 會從磁盤中讀取 translog 日志文件中最后一個提交點 commit point 之后的數(shù)據(jù),恢復到 memory?buffer 和 Filesystem cache 中去。
ES 數(shù)據(jù)丟失的問題:translog 也是先寫入 Filesystem cache,然后默認每隔 5 秒刷一次到磁盤中,所以默認情況下,可能有 5 秒的數(shù)據(jù)會僅僅停留在?memory?buffer 或者 translog 文件的 Filesystem cache中,而不在磁盤上,如果此時機器宕機,會丟失 5 秒鐘的數(shù)據(jù)。也可以將 translog 設(shè)置成每次寫操作必須是直接 fsync 到磁盤,但是性能會差很多。
3、flush 操作:
????????不斷重復上面的步驟,translog 會變得越來越大,當 translog 文件默認每30分鐘或者閾值超過 512M 時,就會觸發(fā) flush 操作,將 memory buffer 中所有的數(shù)據(jù)寫入新的 Segment 文件中, 并將內(nèi)存中所有的 Segment 文件全部落盤,最后清空?translog 事務(wù)日志。文章來源:http://www.zghlxwxcb.cn/news/detail-413174.html
- (1)將 memory buffer 中的數(shù)據(jù) refresh 到 Filesystem Cache?中的一個新的 segment 文件中去,然后清空?memory buffer;
- (2)創(chuàng)建一個新的 commit point(提交點),同時強行將 Filesystem Cache 中目前所有的數(shù)據(jù)都 fsync 到磁盤文件中;
- (3)刪除舊的?translog 日志文件并創(chuàng)建一個新的?translog 日志文件,此時 flush 操作完成
ES?的 flush 操作主要通過以下幾個參數(shù)控制:文章來源地址http://www.zghlxwxcb.cn/news/detail-413174.html
- index.translog.flush_threshold_period:每隔多長時間執(zhí)行一次flush,默認30m
- index.translog.flush_threshold_size:當事務(wù)日志大小到達此預設(shè)值,則執(zhí)行flush,默認512mb
- index.translog.flush_threshold_ops:當事務(wù)日志累積到多少條數(shù)據(jù)后flush一次。
到了這里,關(guān)于ElasticSearch搜索引擎:數(shù)據(jù)的寫入流程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!