事務性(Transactional)存儲需要硬體參與嗎?
1. 事務性(Transactional)存儲需要硬體參與嗎?
2. 硬體支持Transaction的原理是怎樣的?3. 極端情況(比如磁頭在物理上只寫入了一個原子值的一部分)需要考慮嗎?如果要考慮,如何處理?
需要硬體支持。
1. 對於內存數據的操作,依靠CPU提供的原子操作指令來保證並發安全,x86-64平台上,CPU提供8位元組的CAS原子操作,有了這玩意,你可以對無限多的內存數據進行原子性的修改和讀取,可以參考這篇文章 http://oceanbase.org.cn/?p=82
2. 對於磁碟和快閃記憶體,則需要依賴它們提供的原子寫來保證斷電後能夠正確恢復,文件系統依靠journal來保證意外斷電後能夠恢復到一致的狀態,其實理論上有8位元組的原子寫保證的話,journal就可以正常工作。如@drdrxp的回答,機械磁碟一般可以保證512位元組的原子寫,這個保證已經足夠journal機制的正常工作了。
對於並發寫磁碟操作,比如多線程並發append一個文件,則依靠文件系統來保證辦法安全。
再提一句,在ext文件系統的實際使用中,一般不會開啟完整的文件系統journal,而只是開啟對元數據操作的journal,因此應用程序自己也需要處理數據沒有寫全的情況,最簡單的就是資料庫在寫redolog時對齊寫,把一條日誌內容的校驗和放在這條日誌的頭部,這樣頭部可以保證原子寫出,讀的時候發現校驗和不對,並且這條日誌是在文件末尾,就可以確定宕機前沒寫成功,直接略過即可。
硬碟寫都是512位元組原子的,突然斷電可以靠機械慣性完成當前512位元組寫入。硬碟寫的事務可以在原子寫的基礎上建立起來。
如果不考慮這個假設也可以,記得是mysql里實現的對每筆日誌寫分寫2個地方,2次都寫完才算這筆寫成功。寫第一筆斷電就算事務失敗,寫第二筆失敗就從第一筆恢復出來。所以斷電恢復之後永遠是事務完整的。每一塊是否成功的檢查是通過各自結尾的校驗塊實現的。
日誌事務了,後面就可以基於日誌實現更複雜的事務啦。Transactional NTFS
簡單看一下,普通的硬碟就可以了。
原子操作這東西,軟體模擬和硬體支持都可以。
像innodb的doublewrite buffer就是模擬的,性能低。NVMe標準就有硬體的atomic write,性能要更好。硬體原理上和軟體是一樣的,因為硬碟/SSD裡頭也是軟體。只不過更底層,信息更可靠,就不需要double buffer了。
硬體不支持原子寫的話,你當然要自己處理出錯的情況。推薦閱讀:
※在硬碟中,我們刪掉的文件去哪裡了?而為什麼文件在專門的公司又能被恢復?恢復的原理是什麼?
※固態硬碟的用戶體驗如何?
※家用存儲有哪些靠譜的方案?
※EMC存儲和普通存儲在管理方式上有什麼區別?
※可否完全由代碼表示一張手機拍攝的照片?