標籤:text sql 重複 使用 log lgwr 定時 通過 儲存
可能大家會問,oracle和HDFS屬於不同情境的儲存系統,它們之間為什麼會有聯絡呢?確實,從技術本身來看,他們確實無關聯,但利用“整體學習”的思想,跳出技術本身,可以發現Oracle的緩衝區和HDFS的edit logs都是為瞭解決頻繁IO而出現的,可以解決因頻繁讀寫磁碟而導致效能低的問題。如所示:
一、Oracle的緩衝區機制
Oracle的緩衝區主要有兩種:資料庫緩衝區快取(data buffer cache,後面簡稱DB chche)和日誌緩衝區(redo log)(對oracle執行個體記憶體結構感興趣的同學可自行百度,此處不再過多介紹)。
1.資料庫緩衝區快取(DB Cache)
DB Cache是執行SQL的工作區域,使用者會話所有操作資料都是在此緩衝中進行,而不是直接操作磁碟。舉例來說,當執行select操作時,會先尋找DB Cache,如果找到,則直接返回,如果未找到,會再從磁碟載入資料到DB Cache中來,然後再返回。再舉個例子,當執行update操作時,其實也只是更新了DB Cache中的資料。如果DB Cache中資料和磁碟中資料不一致,則稱此資料為髒資料。
那麼DB Cache的髒資料往磁碟中寫入的機制是怎樣的呢?Oracle中為此專門有一個資料庫寫入器的後台進程DBWn,會把DB Cache中的資料寫入到磁碟中,當出現以下情況之一時,DBWn會執行寫入磁碟操作:
1)沒有任何可用DB Cache;
2)髒資料過多;
3)到達3秒的逾時時間;
4)遇到checkpoint;
可以看到,DBWn這樣寫入方式是極懶的,目的就是為了減少IO。
2.日誌緩衝區
日誌緩衝區是一塊小的記憶體地區,用於儲存重做記錄檔中的變更向量。當資料庫出現故障,導致大量髒資料未來得及寫入磁碟時,會根據重做記錄檔進行恢複(注意:重做redo和撤銷undo是有區別的,不要混淆)。與DBWn一樣,重做日誌緩衝區也有專門的後台進程LGWR,進行磁碟的寫入操作,寫入的時機有以下幾種情況:
1)commit操作(注意此commit,執行的是重做日誌的寫入磁碟操作,而不是DB Cache的寫入磁碟操作);
2)日誌緩衝區已用超過1/3;
3)DBWn要寫入髒資料(可以想想為什麼要這樣?原因就在於DBWn可能會將未提交的交易資料寫入到磁碟,為了保證這些已寫入磁碟的資料可以進行復原,所以必須也要把對應的重做日誌也寫入到磁碟中去,其實就是為了交易回復用的);
綜上,這兩類緩衝區都是為了最大限度的減少IO而出現的機制。
二、HDFS的edit logs
熟悉HDFS namenode啟動過程的同學們應該知道,在HDFS namenode啟動時,會把fsimage和edit logs載入到namenode的記憶體中,當namenode需要重啟時,會先把記憶體中的fsimage與edit logs合并寫入磁碟後,再重複執行上面的操作(此處edit logs可以認為是namenode的緩衝區,類似於oracle的緩衝區,只是一般不會輕易寫磁碟)。因此就會面臨如下的問題:
1)當edit logs檔案很大時,則namenode的重啟時間會過長;
2)當namenode意外掛掉時,則eidt logs會丟失很多改動;
此時,Secondary namenode就出現了,可以通過定時查詢edit logs,然後將edit logs更新到fsimage,再由secondary namenode將更新後的fsimage寫入到namenode磁碟,以便下次重啟時使用。當然隨著Hadoop 2.0以後HA的出現,secondary namenode也被其它HA方案替代了,後面有機會再深入介紹。
綜上,oracle的緩衝區與hdfs中的edit logs類似,都是為了防止IO影響效能而出現的,只是寫入磁碟的機制不同,但思想可以認為是一致的。
關於oracle的緩衝區機制與HDFS中的edit logs的某些關聯性的思考