1. 程式人生 > >Copy-On-Write(寫入時複製)技術

Copy-On-Write(寫入時複製)技術

看google的hdfs論文時看到這個概念。

Copy-On-Write屬於邏輯快照的一種,還有一種物理快照,百度了一下 ,快照裡邊概念還挺多,主要是以前沒接觸過。以後再整理。

Copy-On-Write是寫入時才複製的意思,找到兩個例子

1.往磁碟寫資料,先寫到的是記憶體裡面,只有檔案close或flush時才真正寫到磁碟。

2.某個物件(值)同時賦值給多個變數,這多個變數預設情況下引用的是那個值的同一個指標,當某個變數對這個值作出改變時,才發生copy,產生一個新值給那個變數。

http://www.cnblogs.com/chenglei/archive/2009/08/06/1540175.html

看了一下上邊這個文章,一下就明白了為什麼git會出自林納斯·託瓦茲之手了。

git裡邊的快照就是醬紫的嘛

如果用過git,Copy-On-Write快照技術在google的hdfs的應用就比較好理解了:

1.對於一個檔案來講

在複製一個檔案的時候並不是真正的把原先的檔案複製到記憶體的另外一個位置上,而是在新檔案的記憶體對映表中設定一個指標,指向原始檔的位置(syslink),並把那塊記憶體的Copy-On-Write位設定為1.

對這個檔案執行讀操作的時候,記憶體資料沒有變動,直接執行就可以。

在寫的時候,才真正將原始檔案複製一份到新的地址,修改新物件的記憶體對映表到這個新的位置,然後往這裡寫。

2.對於整個檔案系統來講

快照整個檔案系統是google論文形容幾乎是瞬間完成的。

當有檔案變化時,就是上邊對於一個檔案的情況。

修改的檔案數應該少於不修改的檔案數

hdfs的具體操作:

在快照操作之後,當客戶機第一次想寫入資料到Chunk C,它首先會發送一個請求到Master節點查詢當前
的租約持有者。Master節點注意到Chunke C的引用計數超過了1(alex注:不太明白為什麼會大於1.難道
是Snapshot沒有釋放引用計數?)。Master節點不會馬上回復客戶機的請求,而是選擇一個新的Chunk
控制代碼C`。之後,Master節點要求每個擁有Chunk C當前副本的Chunk伺服器建立一個叫做C`的新
Chunk。通過在源Chunk所在Chunk伺服器上建立新的Chunk,我們確保資料在本地而不是通過網路復
制(我們的硬碟比我們的100Mb乙太網大約快3倍)。從這點來講,請求的處理方式和任何其它Chunk沒
什麼不同:Master節點確保新Chunk C`的一個副本擁有租約,之後回覆客戶機,客戶機得到回覆後就可
以正常的寫這個Chunk,而不必理會它是從一個已存在的Chunk克隆出來的。

參考資料: