面试系列八 es写入数据的工作原理
(1)es寫數據過程
?
1)客戶端選擇一個node發送請求過去,這個node就是coordinating node(協調節點)
2)coordinating node,對document進行路由,將請求轉發給對應的node(有primary shard)
3)實際的node上的primary shard處理請求,然后將數據同步到replica node
4)coordinating node,如果發現primary node和所有replica node都搞定之后,就返回響應結果給客戶端
?
(2)es讀數據過程
?
查詢,GET某一條數據,寫入了某個document,這個document會自動給你分配一個全局唯一的id,doc id,同時也是根據doc id進行hash路由到對應的primary shard上面去。也可以手動指定doc id,比如用訂單id,用戶id。
?
你可以通過doc id來查詢,會根據doc id進行hash,判斷出來當時把doc id分配到了哪個shard上面去,從那個shard去查詢
?
1)客戶端發送請求到任意一個node,成為coordinate node
2)coordinate node對document進行路由,將請求轉發到對應的node,此時會使用round-robin隨機輪詢算法,在primary shard以及其所有replica中隨機選擇一個,讓讀請求負載均衡
3)接收請求的node返回document給coordinate node
4)coordinate node返回document給客戶端
?
(3)es搜索數據過程
?
es最強大的是做全文檢索,就是比如你有三條數據
?
java真好玩兒啊
java好難學啊
j2ee特別牛
?
你根據java關鍵詞來搜索,將包含java的document給搜索出來
?
es就會給你返回:java真好玩兒啊,java好難學啊
?
1)客戶端發送請求到一個coordinate node
2)協調節點將搜索請求轉發到所有的shard對應的primary shard或replica shard也可以
3)query phase:每個shard將自己的搜索結果(其實就是一些doc id),返回給協調節點,由協調節點進行數據的合并、排序、分頁等操作,產出最終結果
4)fetch phase:接著由協調節點,根據doc id去各個節點上拉取實際的document數據,最終返回給客戶端
?
(4)搜索的底層原理,倒排索引,畫圖說明傳統數據庫和倒排索引的區別
?
(5)寫數據底層原理
?
1)先寫入buffer,在buffer里的時候數據是搜索不到的;同時將數據寫入translog日志文件
?
2)如果buffer快滿了,或者到一定時間,就會將buffer數據refresh到一個新的segment file中,但是此時數據不是直接進入segment file的磁盤文件的,而是先進入os cache的。這個過程就是refresh。
?
每隔1秒鐘,es將buffer中的數據寫入一個新的segment file,每秒鐘會產生一個新的磁盤文件,segment file,這個segment file中就存儲最近1秒內buffer中寫入的數據
?
但是如果buffer里面此時沒有數據,那當然不會執行refresh操作咯,每秒創建換一個空的segment file,如果buffer里面有數據,默認1秒鐘執行一次refresh操作,刷入一個新的segment file中
?
操作系統里面,磁盤文件其實都有一個東西,叫做os cache,操作系統緩存,就是說數據寫入磁盤文件之前,會先進入os cache,先進入操作系統級別的一個內存緩存中去
?
只要buffer中的數據被refresh操作,刷入os cache中,就代表這個數據就可以被搜索到了
?
為什么叫es是準實時的?NRT,near real-time,準實時。默認是每隔1秒refresh一次的,所以es是準實時的,因為寫入的數據1秒之后才能被看到。
?
可以通過es的restful api或者java api,手動執行一次refresh操作,就是手動將buffer中的數據刷入os cache中,讓數據立馬就可以被搜索到。
?
只要數據被輸入os cache中,buffer就會被清空了,因為不需要保留buffer了,數據在translog里面已經持久化到磁盤去一份了
?
3)只要數據進入os cache,此時就可以讓這個segment file的數據對外提供搜索了
?
4)重復1~3步驟,新的數據不斷進入buffer和translog,不斷將buffer數據寫入一個又一個新的segment file中去,每次refresh完buffer清空,translog保留。隨著這個過程推進,translog會變得越來越大。當translog達到一定長度的時候,就會觸發commit操作。
?
buffer中的數據,倒是好,每隔1秒就被刷到os cache中去,然后這個buffer就被清空了。所以說這個buffer的數據始終是可以保持住不會填滿es進程的內存的。
?
每次一條數據寫入buffer,同時會寫入一條日志到translog日志文件中去,所以這個translog日志文件是不斷變大的,當translog日志文件大到一定程度的時候,就會執行commit操作。
?
5)commit操作發生第一步,就是將buffer中現有數據refresh到os cache中去,清空buffer
?
6)將一個commit point寫入磁盤文件,里面標識著這個commit point對應的所有segment file
?
7)強行將os cache中目前所有的數據都fsync到磁盤文件中去
?
translog日志文件的作用是什么?就是在你執行commit操作之前,數據要么是停留在buffer中,要么是停留在os cache中,無論是buffer還是os cache都是內存,一旦這臺機器死了,內存中的數據就全丟了。
?
所以需要將數據對應的操作寫入一個專門的日志文件,translog日志文件中,一旦此時機器宕機,再次重啟的時候,es會自動讀取translog日志文件中的數據,恢復到內存buffer和os cache中去。
?
commit操作:1、寫commit point;2、將os cache數據fsync強刷到磁盤上去;3、清空translog日志文件
?
8)將現有的translog清空,然后再次重啟啟用一個translog,此時commit操作完成。默認每隔30分鐘會自動執行一次commit,但是如果translog過大,也會觸發commit。整個commit的過程,叫做flush操作。我們可以手動執行flush操作,就是將所有os cache數據刷到磁盤文件中去。
?
不叫做commit操作,flush操作。es中的flush操作,就對應著commit的全過程。我們也可以通過es api,手動執行flush操作,手動將os cache中的數據fsync強刷到磁盤上去,記錄一個commit point,清空translog日志文件。
?
9)translog其實也是先寫入os cache的,默認每隔5秒刷一次到磁盤中去,所以默認情況下,可能有5秒的數據會僅僅停留在buffer或者translog文件的os cache中,如果此時機器掛了,會丟失5秒鐘的數據。但是這樣性能比較好,最多丟5秒的數據。也可以將translog設置成每次寫操作必須是直接fsync到磁盤,但是性能會差很多。
?
實際上你在這里,如果面試官沒有問你es丟數據的問題,你可以在這里給面試官炫一把,你說,其實es第一是準實時的,數據寫入1秒后可以搜索到;可能會丟失數據的,你的數據有5秒的數據,停留在buffer、translog os cache、segment file os cache中,有5秒的數據不在磁盤上,此時如果宕機,會導致5秒的數據丟失。
?
如果你希望一定不能丟失數據的話,你可以設置個參數,官方文檔,百度一下。每次寫入一條數據,都是寫入buffer,同時寫入磁盤上的translog,但是這會導致寫性能、寫入吞吐量會下降一個數量級。本來一秒鐘可以寫2000條,現在你一秒鐘只能寫200條,都有可能。
?
10)如果是刪除操作,commit的時候會生成一個.del文件,里面將某個doc標識為deleted狀態,那么搜索的時候根據.del文件就知道這個doc被刪除了
?
11)如果是更新操作,就是將原來的doc標識為deleted狀態,然后新寫入一條數據
?
12)buffer每次refresh一次,就會產生一個segment file,所以默認情況下是1秒鐘一個segment file,segment file會越來越多,此時會定期執行merge
?
13)每次merge的時候,會將多個segment file合并成一個,同時這里會將標識為deleted的doc給物理刪除掉,然后將新的segment file寫入磁盤,這里會寫一個commit point,標識所有新的segment file,然后打開segment file供搜索使用,同時刪除舊的segment file。
?
es里的寫流程,有4個底層的核心概念,refresh、flush、translog、merge
?
當segment file多到一定程度的時候,es就會自動觸發merge操作,將多個segment file給merge成一個segment file。
轉載于:https://www.cnblogs.com/xiufengchen/p/11258901.html
總結
以上是生活随笔為你收集整理的面试系列八 es写入数据的工作原理的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: ivew 限制输入 0 到 1 的数字
- 下一篇: 学习旧岛小程序 (1) flex
