2012-04-17 75 views
4

我目前正在爲監控系統開發當前媒體存儲的升級(用於存儲視頻/音頻/元數據),並且我正在將錄製結構重新設計爲更強大的解決方案。避免數據損壞的文件結構

我需要創建一些數據文件中存儲的數據的索引數據,所以我創建一個索引文件結構,但我關心硬盤故障(想象一下,如果在寫入期間切斷電源索引文件,它將成爲腐敗,因爲數據很可能會被寫入一半)。 我已經設計瞭如何存儲索引,但我擔心的是相對於電源故障或磁盤故障時的數據損壞

因此,有誰知道避免寫入時數據損壞的技術?

我已經搜索了一點,發現沒有好的解決方案,一種解決方案是創建一個寫入文件的所有內容的日誌,但是接下來我將有更多的I/O每秒(我關心的是每秒的I/O數量也應該儘可能少)。

我想出的是複製索引文件中的敏感數據以及時間戳和校驗和字段。例如:

字段1字段2字段3時間戳校驗

字段1字段2字段3時間戳校驗

所以,我有數據寫入兩次,如果我讀文件時,第一組字段已損壞(校驗不匹配),我有第二組字段應該是可以的。我相信腐蝕發生在寫作如果停在中間,所以,例如,當軟件寫第一組字段和停電時,第二組仍然完好無損......如果第二組電源故障套正在寫,第一個已經完好無損。

你們認爲這個解決方案是什麼?它是否避免數據損壞?

順便說一句,我不能使用任何類型的數據庫對這種存儲或事務的NTFS由於限制與交易NTFS

任何想法,歡迎,感謝部署系統!

+5

使用數據庫而不是重新發明輪子。你說你不能使用數據庫,但這聽起來只是假的。爲什麼不是? – 2012-04-17 16:51:31

+1

我與大衛,使用數據庫是更明顯的方式,檢查火鳥[斷電後恢復Firebird數據庫需要多少時間?](http://www.firebirdfaq.org/faq43/) – RRUZ 2012-04-17 16:52:40

+0

那麼,在監控行業軟件中,數據庫永遠不會用於存儲視頻/音頻數據,而是用於存儲配置,日誌,而不是用於存儲與視頻/音頻相關的數據。視頻/音頻文件必須是獨立的,就像一個視頻文件(.AVI,WMV ...)。數據庫系統對我們需要實現的性能也有太多的控制和開銷。如果我需要存儲常規數據,我肯定會使用數據庫。 – Eric 2012-04-17 17:10:02

回答

2

周圍忽略你的問題的一部分不能夠使用一個數據庫:)

您可能會發現SQL Server 2012中的利益FileTables。您可以將數據庫外部的文件存儲在文件夾中,但仍然可以像訪問數據庫一樣訪問這些文件。您可以使用數據庫將新文件插入到該目錄中,或者將文件簡單地複製到該文件夾​​中。視頻文件的數據庫不會變得很胖。如果數據庫服務器軟件出現故障,它們也不能訪問。您的幀索引可以是單個.jpg文件(或其他),也可以通過FileTable和索引(通過外鍵)將它們引用到主視頻文件中。幀索引表然後是非常簡單的。

因此,您可以消除寫入文件和維護日誌以查看是否出現故障的數據庫開銷。如果操作系統由於電源故障而無法寫入文件,那麼數據庫將無法勝任。您可以執行目錄比較,並使用強大的實用程序來移動文件,而不是在寫入的任何部分失敗時不移除源文件。

2

它不會避免數據損壞,因爲任何一組或兩組字段上都可能發生損壞。

我覺得你最好不要複製「敏感數據」,而是分兩步寫數據,第一步用「校驗和」字段寫空數據,第二步用第二步更新校驗和匹配數據。這個校驗和將被用作「事務提交」標誌並確保數據的完整性。

當您讀取數據時,您會忽略所有未提交的索引集合,我的意思是校驗和不匹配。

然後進行大量測試,並進行很好的調整,強制進程每一步的數據損壞,並保存隨機數據。我個人認爲測試需要很多工作,因爲失敗是隨機的,這就是爲什麼人們建議您使用測試數年的數據庫。

請注意,雖然它爲某些類型的數據損壞增加了一些保護,但它並不完美,您可能會添加其他安全層來保護您的數據,包括數據複製,完整性檢查和外部配置,包括無間斷,raid系統,定期備份。

關於「交易」的理論太多了。

搜索「原子事務算法」以獲取更多詳細信息。

重新考慮使用數據庫,重新考慮使用日誌,甚至重新考慮使用文件系統來存儲您的信息。

+0

謝謝你的想法。我已經考慮過使用數據庫,但對於我需要的結構,數據庫的使用和它可以添加的記錄數量的限制以及數據庫系統在監視應用程序中的重新分配都很困難。如果數據庫是存儲這類數據的最佳解決方案,那麼我們所有的競爭對手都會使用,而這恰恰相反,這個領域的所有競爭對手軟件都實現了自己的記錄結構,因爲這是實現我們業績的方式。需要 – Eric 2012-04-17 19:19:04

+0

關於你的解決方案,問題是新記錄不會被追加到磁盤的末尾......它們存儲在一個固定的結構中,並且它們不斷地被修改,我的問題是當這些索引的數據被修改時,我們數據寫入過程中出現電源故障。 因此,如果我在更新過程中更新了一個字段和電源故障,我將丟失數據,如果我將其寫入兩次,我可能會備份舊狀態,對於我們的目的而言,這是我需要的全部 – Eric 2012-04-17 19:22:24

+0

閱讀您的文章再次,只是想說清楚,我知道它不會避免腐敗,數據將被破壞無論如何,我無法避免腐敗我只需要一種方法來輕鬆地恢復損壞的數據 – Eric 2012-04-17 19:31:52

0

您可以使用某種事務邏輯。以小塊創建索引並首先使用臨時文件。當你完成一個塊(文件)時,檢查完整性,如果它通過測試,將它作爲實際索引文件複製。此時,您可以分發驗證塊的幾個副本。