不可忽略的資料庫快取重建

2021-09-08 09:35:59 字數 1203 閱讀 2991

引用:

本文的主要內容**於mongodb官方部落格,由nosqlfan補充說明,本文對傳統的分布式cache系統進行了分析,指出了其在快取重建中會對資料庫產生巨大壓力的問題。並分析了mongodb的mmap方案是如何規避這一問題的。

如下圖的架構,在資料庫前端加上分布式的cache(比如我們常用的memcached),讓客戶端在訪問時先查詢cache,cache不命中再讀資料庫並將結構快取在cache中。這是目前比較常用的一種分擔讀壓力的方法。

但是這個方法存在乙個問題,如果前端的cache掛掉,或者比較極端的整個機房斷電了,那麼在機器重啟後,原來cache機器在記憶體中的快取會全部清空,在客戶端訪問過程中,會百分之百的不命中,這樣資料庫會在瞬間接受巨大的讀壓力。

試想如果乙個64gb的快取失效了,在其重建時,假設與資料庫連線的千兆網絡卡,假設其以極限速度100m每秒從資料庫取資料過來重建快取,那麼也需要10分鐘才能建完。更何況這是理想情況,對於客戶端觸發式的隨機快取重建,可能會花掉更長的時間。這還是在資料庫能提供100m每秒的資料讀請求的前提下。

我們經常看到一些**掛掉後又恢復,恢復後又掛掉,如此反覆幾次才能真正恢復,原因就在於其第一次cache倒了,資料庫無法承受相應的讀壓力,在快取重建了一小部分後被壓死。相當於資料庫每重啟一次,可以恢復部分快取,直到快取的非命中率到達資料庫可承受的壓力時,才能夠真正恢復服務。

這個問題可以用一些可以提供持久化功能的快取來實現,比如redis,在未開啟aof的情況下,其定期dump出來的rdb檔案出能自動恢復出絕大部分資料,當然,在有的時候這可能導致快取和資料庫資料不一致的情況,需要根據應用場景選擇性的使用。

上面是對分布式cache的問題,而對於很多資料庫儲存,實際上也幾乎都是將熱資料盡量放在記憶體中的。但很多資料庫在實現上是自己在記憶體中實現了cache機制,這樣在資料庫重啟(非作業系統重啟)時,這些cache可能也就隨之被清空了,對於資料庫來說,也需要重建快取,而資料庫這時所有的操作可能都落在磁碟io上,帶來了同樣的問題。

而mongodb與上面的方式不太一樣,mongodb採用mmap來將資料檔案對映到記憶體中,所以當mongodb重啟時,這些對映的記憶體並不會清掉,因為它們是由作業系統維護的(所以當作業系統重啟時,mongodb才會有相同問題)。相對於其它一些自己維護cache的資料庫,mongodb在重啟後並不需要進行快取重建與預熱。

下面是幾點比較實用的知識:

不可忽略的快取重建

本文的主要內容 於mongodb官方部落格,由nosqlfan補充說明,本文對傳統的分布式cache系統進行了分析,指出了其在快取 重建中會對資料庫產生巨大壓力的問題。並分析了mongodb的mmap方案是如何規避這一問題的。如下圖的架構,在資料庫前端加上分布式的cache 比如我們常用的memca...

Oracle資料庫重建無效和不可用物件

無效和不可用物件 無效 pl sql 物件和不可用索引會對效能產生影響。無效 pl sql 物件必須先進行重編譯,然後才能使用。這需要在執行嘗試訪問 pl sql 程式包 過程或函式的第乙個操作之前花費一段編譯時間。如果 pl sql 重編譯未成功,則操作會因發生錯誤而失敗。優化程式會忽略不可用索引...

重建 master 資料庫

關閉 microsoft sql server 2000,然後執行 rebuildm.exe。該程式位於 program files microsoft sql server 80 tools binn 目錄中。在 重建 master 對話方塊中單擊 瀏覽 按鈕。在 瀏覽資料夾 對話方塊中,選擇 s...