PHP做網(wǎng)站案例教程軟文代寫文案
一、ElasticSearch 寫數(shù)據(jù)的總體流程:
(1)ES 客戶端選擇一個(gè)節(jié)點(diǎn) node 發(fā)送請(qǐng)求過去,這個(gè)節(jié)點(diǎn)就是協(xié)調(diào)節(jié)點(diǎn) coordinating node
(2)協(xié)調(diào)節(jié)點(diǎn)對(duì) document 進(jìn)行路由,通過 hash 算法計(jì)算出數(shù)據(jù)應(yīng)該落在哪個(gè)分片 shard 上,然后根據(jù)節(jié)點(diǎn)上維護(hù)的 shard 信息,將請(qǐng)求轉(zhuǎn)發(fā)到對(duì)應(yīng)的實(shí)際處理節(jié)點(diǎn)node上
shard = hash(document_id) % (num_of_primary_shards),
(3)實(shí)際的節(jié)點(diǎn)上的 primary shard 主分片處理請(qǐng)求,然后將數(shù)據(jù)同步到副本節(jié)點(diǎn) replica node
(4)coordinating node 等到 primary node 和所有 replica node 都執(zhí)行成功之后,就返回響應(yīng)結(jié)果給客戶端。
二、ES 的主分片寫數(shù)據(jù)的詳細(xì)流程:
1、refresh 操作:
primary shard 主分片先將數(shù)據(jù)寫入 memory buffer,然后定時(shí)(默認(rèn)每隔1s)將 memory buffer 中的數(shù)據(jù)寫入一個(gè)新的 segment 文件中,并進(jìn)入 Filesystem cache(同時(shí)清空 memory buffer),這個(gè)過程就叫做 refresh;每個(gè) Segment 文件實(shí)際上是一些倒排索引的集合, 只有經(jīng)歷了 refresh 操作之后,這些數(shù)據(jù)才能變成可檢索的。
ES 的近實(shí)時(shí)性:當(dāng)數(shù)據(jù)存在 memory buffer 時(shí)是搜索不到的,只有數(shù)據(jù)被 refresh 到 Filesystem cache 之后才能被搜索到,而 refresh 是每秒一次, 所以稱 es 是近實(shí)時(shí)的,或者可以通過手動(dòng)調(diào)用 es 的 api 觸發(fā)一次 refresh 操作,讓數(shù)據(jù)馬上可以被搜索到;
上文講到的 memory buffer,也稱為 Indexing Buffer,這個(gè)區(qū)域默認(rèn)的內(nèi)存大小是 10% heap size。
2、寫 translog 事務(wù)日志文件:
由于 memory Buffer 和 Filesystem Cache 都是基于內(nèi)存,假設(shè)服務(wù)器宕機(jī),那么數(shù)據(jù)就會(huì)丟失,所以 ES 通過 translog 日志文件來保證數(shù)據(jù)的可靠性,在數(shù)據(jù)寫入 memory buffer 的同時(shí),將數(shù)據(jù)寫入 translog 日志文件中,在機(jī)器宕機(jī)重啟時(shí),es 會(huì)從磁盤中讀取 translog 日志文件中最后一個(gè)提交點(diǎn) commit point 之后的數(shù)據(jù),恢復(fù)到 memory buffer 和 Filesystem cache 中去。
ES 數(shù)據(jù)丟失的問題:translog 也是先寫入 Filesystem cache,然后默認(rèn)每隔 5 秒刷一次到磁盤中,所以默認(rèn)情況下,可能有 5 秒的數(shù)據(jù)會(huì)僅僅停留在 memory buffer 或者 translog 文件的 Filesystem cache中,而不在磁盤上,如果此時(shí)機(jī)器宕機(jī),會(huì)丟失 5 秒鐘的數(shù)據(jù)。也可以將 translog 設(shè)置成每次寫操作必須是直接 fsync 到磁盤,但是性能會(huì)差很多。
3、flush 操作:
不斷重復(fù)上面的步驟,translog 會(huì)變得越來越大,當(dāng) translog 文件默認(rèn)每30分鐘或者閾值超過 512M 時(shí),就會(huì)觸發(fā) flush 操作,將 memory buffer 中所有的數(shù)據(jù)寫入新的 Segment 文件中, 并將內(nèi)存中所有的 Segment 文件全部落盤,最后清空 translog 事務(wù)日志。
(1)將 memory buffer 中的數(shù)據(jù) refresh 到 Filesystem Cache 中的一個(gè)新的 segment 文件中去,然后清空 memory buffer;
(2)創(chuàng)建一個(gè)新的 commit point(提交點(diǎn)),同時(shí)強(qiáng)行將 Filesystem Cache 中目前所有的數(shù)據(jù)都 fsync 到磁盤文件中;
(3)刪除舊的 translog 日志文件并創(chuàng)建一個(gè)新的 translog 日志文件,此時(shí) flush 操作完成
ES 的 flush 操作主要通過以下幾個(gè)參數(shù)控制:
index.translog.flush_threshold_period:每隔多長時(shí)間執(zhí)行一次flush,默認(rèn)30m
index.translog.flush_threshold_size:當(dāng)事務(wù)日志大小到達(dá)此預(yù)設(shè)值,則執(zhí)行flush,默認(rèn)512mb
index.translog.flush_threshold_ops:當(dāng)事務(wù)日志累積到多少條數(shù)據(jù)后flush一次。
————————————————
版權(quán)聲明:本文為CSDN博主「張維鵬」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/a745233700/article/details/118076845