MySQL中的checkpoint機制

2021-08-01 23:56:32 字數 3034 閱讀 8990

檢查點(checkpoint):

一種讓資料庫redo和data檔案保持一致的機制

作用:將bp中的髒頁刷盤

通過頻度適當的刷盤,減少例項恢復時間

重做日誌不夠用時,將髒頁刷盤

實現通過lsn實現

例項恢復時,假如checkpointlsn=1000,而redolsn=1200,則lsn=[1001,1200]均需要重做

lsn:

log sequence number:日誌序列號,乙個不斷增大的數字,表示redo log的增量(位元組數)。

用途:類似oracle的scn,用來標識資料庫變更版本,保證磁碟上的redo和data檔案處於一致狀態。例項恢復時,比較page的lsn和redo裡記錄的該page的lsn是否一致。若小於,則需要將redo重做到page裡。

存在於:redo log中每個page的頭部

檢視當前innodb的lsn:

log sequence number: log buffer中已經寫入的lsn值

log flushed up to: 已經重新整理到redo logfile的lsn值

last checkpoint at:最近一次checkpoint時的lsn值

checkpoint種類:

全量檢查點:

發出checkpoint時,全部髒頁刷盤。

i/o負載極高,不適合流量高峰。

增量檢查點:

發出checkpoint時,將包含最老lsn髒頁刷盤。

在以下條件,增量檢查點進行刷盤:

master thread 每10秒一次

redo log不夠用時,從flush list上重新整理一定髒頁.checkpoint_age=redo_lsn – checkpoint_lsn

freelist不夠用時,從lru list上重新整理一定髒頁

達到innodb_max_dirty_pages_pct

checkpoint幹的事情:

將緩衝池中的髒頁重新整理回磁碟,不同之處在於每次從**取多少髒頁重新整理到磁碟,以及什麼時候觸發checkpoint。

checkpoint解決的問題:

縮短資料庫的恢復時間

緩衝池不夠用時,將髒頁重新整理到磁碟(緩衝池不夠用時,根據lru算會溢位最近最少使用的頁,若此頁為髒頁,需要強制執行checkpoint將髒頁刷回磁碟)

重做日誌不可用時,重新整理髒頁(採用迴圈使用的,並不是無限增大。當重用時,此時的重做日誌還需要使用,就必須強制執行checkpoint將髒頁刷回磁碟)

checkpoint分類:

1.sharp checkpoint

發生在資料庫關閉時將所有的髒頁刷回磁碟,這是預設的。通過引數innodb_fast_shutdown=1來設定。

2.fuzzy checkpoint

在innodb儲存引擎內部使用fuzzy checkpoint進行頁的重新整理,即只重新整理一部分髒頁,而不是全部重新整理。大致分為以下幾種情況:

a.master thread checkpoint

差不多以每秒或者每十秒從緩衝池的髒頁列表(flush列表),這是非同步操作,innodb儲存引擎可以進行其他的操作部分不會發生堵塞。

b.flush_lur_list checkpoint

innodb儲存引擎需要保證lru列表中有差不多100個空閒頁可供使用。在innodb1.1.x版本之前,需要檢查lru列表中是否有足夠的可用空間操作發生在使用者查詢執行緒中,顯然這會阻塞使用者的查詢操作。倘若沒有100個空閒頁,那麼innodb儲存引擎會將lru列表尾端的頁移除,如果這些頁中有髒頁,那麼需要進行checkpoint,而這些來自於lru列表的被稱為flush_lru_list checkpoint。但是在mysql5.6版本後這個檢查被放在了乙個單獨的page cleaner thread中進行,通過引數innodb_lru_scan_depth來設定可用頁的數量。

c.async/sync flush checkpoint

在重做日誌檔案不可用的情況下,需要將一些也重新整理回磁碟,而操作發生在flush列表上。若將已經寫入到重做日誌的lsn記為redo_lsn,將已經重新整理回磁碟最新的lsn記為checkpoint_lsn,則可以定義:checkpoint_age = redo_lsn-checkpoint_lsn在定義一下的變數async_water_mark=75%*total_redo_log_file_size、sync_water_mark=90%*total_redo_file_size。若每個重做日誌的大小為1g且定義了兩個重做日誌共2g。那麼async_water_mark=1.5g,sync_water_mark=1.8g。

當checkpoint_age < async_water_mark時,不需要重新整理任何髒資料到磁碟;

當async_water_mark < checkpoint_age < sync_water_mark時,觸發async flush從flush列表重新整理足夠的髒頁會磁碟,使得重新整理後滿足checkpoint_age < async_water_mark;

當checkpoint_age > sync_water_mark時,這種情況很少發生除非設定的重做日誌檔案太小,並且進行類似於load data的bulk insret操作。這個時候觸發sync flush從flush列表重新整理足夠的髒頁會磁碟,使得重新整理後滿足checkpoint_age < async_water_mark;

async flush checkpoint會阻塞發現問題的使用者查詢執行緒,sync flush checkpoint會阻塞所有的使用者查詢執行緒,並且等待髒頁重新整理完成。但是從mysql5.6版本開始這部分操作放入單獨的page cleaner thread中,不再會堵塞使用者查詢執行緒。

d.dirty page too much checkpoint

髒頁的數量太多導致innodb儲存引擎強制進行checkpoint,其目的是為了保證緩衝池中有足夠的頁可以用。可以通過引數innodb_max_dirty_pages_pct來設定。

spark中cache和checkpoint使用

1 cache cache是為了追求計算的速度 spark中計算任務在記憶體中,但是結果是儲存在磁碟中的,所以首次執行會慢,之後會拿磁碟中的計算結果,所以後面會快很多 通過對結果的rdd分布式資料集進行cache,將計算結果快取在記憶體中,這樣會比快取在磁碟中更快的讀取。比如計算log檔案的行數 s...

spark的cache和checkpoint的區別

要知道區別,就要首先知道實現的原理和使用的場景 cache就是講共用的或者重複使用的rdd按照持久化的級別進行快取。checkpoint 就是將業務非常長的邏輯計算的中間結果快取到hdfs上,他的實現原理是 首先找打stage最後的finalrdd,然後按照rdd的依賴關係回溯,找到使用checkp...

Hadoop 兩種環境下的checkpoint機制

配置了ha的hdfs中,有active和standby namenode兩個namenode節點。他們的記憶體中儲存了一樣的集群元資料資訊,因為standby namenode已經將集群狀態儲存在記憶體中了,所以建立檢查點checkpoint的過程只需要從記憶體中生成新的fsimage。詳細過程如下...