所有計算機問題都可以歸結為快取問題 —某大佬
上面這句話是某日在知乎上無意看到的,但卻在我的腦海裡停留良久。如果之前看到這句話,可能也就略過了,但最近做了不少快取想關的工作,從redis到ADT裝置快取,從web應用到作業系統實現,快取無處不在,毫無疑問,資料庫系統也快取。這篇筆記主要從理論出發,淺析資料庫系統的儲存和檔案結構。
1.RAID
RAID是什麼?
RAID(ReDundant Array of Independent Disk)即獨立磁碟冗餘陣列,是一種多磁碟組織技術。
說人話:RAID其實就是通過冗餘提高儲存的可靠性和並行性,由概率論知識(概率論??)可以知道,一堆磁碟出現一次故障的概率肯定比某一張磁碟發生故障的概率大,如果我們的N張磁碟在不做備份的情況下,只要有一張出現毛病,就會損失大量的資料,對於某些應用來說,就算丟了1byte的資料都是不可容忍的(你的支付寶少了1byte的錢(我沒這麼多 不用擔心)),引入冗餘是個解決的好辦法,嗯,最簡單粗暴的方法就算砸錢復制每一張磁碟,這種技術也就是映象(影子),即一張邏輯盤對應幾張物理盤,這樣即使你的1byte記錄的鉅款在某個盤上丟了也沒事,但這時候你說,萬一地震了火災了三體人入侵了怎麼辦(三體人入侵你就等著去澳大利亞吧),當然,儘管有這麼多可能,映象也比單張磁碟的可靠性高不少(平均丟失時間可以長達55~100年)[1]
同時,RAID還可以提高並行性,就像使用Mycat進行資料庫分片一樣,我可以在多張磁碟進行資料拆分來提高傳輸速率,主要有以下幾種:
1.位元級拆分(聽起來很厲害的樣子):把每個位元組都進行了拆分,將不同位存到不同的磁碟,比如第i位存到第i號磁碟。(好細緻。。)
2.塊級拆分(最常用):把磁碟陣列看成一塊單獨的大磁碟,並且給塊進行邏輯編號,比如將邏輯上的第i塊存到物理磁碟(i mod n) + 1張磁碟上,有點意思了哈,讀一個大檔案的時候,可以從n張磁碟並行取n個塊,這樣不就快了嗎。
磁碟系統並行的兩個目的:1 負載平衡多個小的訪問操作(塊訪問)以提高訪問操作吞吐量,2 並行執行大的訪問操作,以減少訪問操作的響應時間[1]。
RAID級別
前面說道,映象是比較燒錢的,拆分雖然提高了並行性,但是不能提高可用性。為了降低成本(省錢)提出了一些方案,分為若干個RAID級別(RAID level),具體的就不贅述了。
2. 檔案組織
資料庫外表看起來這麼高大上,其實底層還是用檔案儲存的,由作業系統進行維護,資料庫中的記錄都是存在塊中的(而一個塊可以包含很多記錄),塊是儲存分配和資料傳輸的基本單元,大多數資料庫預設塊大小為4到8KB
記錄可以分成定長和變長記錄
Reference
[1] DataBase System Concepts 6th Abraham Silberschatz